| 
					
				 | 
			
			
				@@ -5,7 +5,6 @@ import ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"fmt" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"io" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"io/ioutil" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	"log" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"github.com/pkg/errors" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"gopkg.in/src-d/go-git.v4" 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -87,6 +86,8 @@ type BlobCache struct { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	repository *git.Repository 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	cache      map[plumbing.Hash]*CachedBlob 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	l core.Logger 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const ( 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -133,6 +134,11 @@ func (blobCache *BlobCache) ListConfigurationOptions() []core.ConfigurationOptio 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // Configure sets the properties previously published by ListConfigurationOptions(). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func (blobCache *BlobCache) Configure(facts map[string]interface{}) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if l, exists := facts[core.ConfigLogger].(core.Logger); exists { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		blobCache.l = l 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		blobCache.l = core.NewLogger() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if val, exists := facts[ConfigBlobCacheFailOnMissingSubmodules].(bool); exists { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		blobCache.FailOnMissingSubmodules = val 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -142,6 +148,7 @@ func (blobCache *BlobCache) Configure(facts map[string]interface{}) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // Initialize resets the temporary caches and prepares this PipelineItem for a series of Consume() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // calls. The repository which is going to be analysed is supplied as an argument. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func (blobCache *BlobCache) Initialize(repository *git.Repository) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	blobCache.l = core.NewLogger() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	blobCache.repository = repository 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	blobCache.cache = map[plumbing.Hash]*CachedBlob{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return nil 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -161,7 +168,7 @@ func (blobCache *BlobCache) Consume(deps map[string]interface{}) (map[string]int 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	for _, change := range changes { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		action, err := change.Action() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			log.Printf("no action in %s\n", change.To.TreeEntry.Hash) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			blobCache.l.Errorf("no action in %s\n", change.To.TreeEntry.Hash) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			return nil, err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		var exists bool 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -172,7 +179,7 @@ func (blobCache *BlobCache) Consume(deps map[string]interface{}) (map[string]int 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			newCache[change.To.TreeEntry.Hash] = &CachedBlob{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			blob, err = blobCache.getBlob(&change.To, commit.File) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				log.Printf("file to %s %s: %v\n", change.To.Name, change.To.TreeEntry.Hash, err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				blobCache.l.Errorf("file to %s %s: %v\n", change.To.Name, change.To.TreeEntry.Hash, err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				cb := &CachedBlob{Blob: *blob} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				err = cb.Cache() 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -180,7 +187,7 @@ func (blobCache *BlobCache) Consume(deps map[string]interface{}) (map[string]int 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					cache[change.To.TreeEntry.Hash] = cb 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					newCache[change.To.TreeEntry.Hash] = cb 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					log.Printf("file to %s %s: %v\n", change.To.Name, change.To.TreeEntry.Hash, err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					blobCache.l.Errorf("file to %s %s: %v\n", change.To.Name, change.To.TreeEntry.Hash, err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		case merkletrie.Delete: 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -191,7 +198,7 @@ func (blobCache *BlobCache) Consume(deps map[string]interface{}) (map[string]int 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				blob, err = blobCache.getBlob(&change.From, commit.File) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					if err.Error() != plumbing.ErrObjectNotFound.Error() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						log.Printf("file from %s %s: %v\n", change.From.Name, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						blobCache.l.Errorf("file from %s %s: %v\n", change.From.Name, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 							change.From.TreeEntry.Hash, err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 						blob, err = internal.CreateDummyBlob(change.From.TreeEntry.Hash) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -203,7 +210,7 @@ func (blobCache *BlobCache) Consume(deps map[string]interface{}) (map[string]int 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					if err == nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 						cache[change.From.TreeEntry.Hash] = cb 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						log.Printf("file from %s %s: %v\n", change.From.Name, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						blobCache.l.Errorf("file from %s %s: %v\n", change.From.Name, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 							change.From.TreeEntry.Hash, err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				} 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -213,7 +220,7 @@ func (blobCache *BlobCache) Consume(deps map[string]interface{}) (map[string]int 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			cache[change.To.TreeEntry.Hash] = &CachedBlob{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			newCache[change.To.TreeEntry.Hash] = &CachedBlob{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				log.Printf("file to %s: %v\n", change.To.Name, err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				blobCache.l.Errorf("file to %s: %v\n", change.To.Name, err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				cb := &CachedBlob{Blob: *blob} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				err = cb.Cache() 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -221,7 +228,7 @@ func (blobCache *BlobCache) Consume(deps map[string]interface{}) (map[string]int 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					cache[change.To.TreeEntry.Hash] = cb 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					newCache[change.To.TreeEntry.Hash] = cb 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					log.Printf("file to %s: %v\n", change.To.Name, err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					blobCache.l.Errorf("file to %s: %v\n", change.To.Name, err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			cache[change.From.TreeEntry.Hash], exists = 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -230,14 +237,14 @@ func (blobCache *BlobCache) Consume(deps map[string]interface{}) (map[string]int 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				cache[change.From.TreeEntry.Hash] = &CachedBlob{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				blob, err = blobCache.getBlob(&change.From, commit.File) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					log.Printf("file from %s: %v\n", change.From.Name, err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					blobCache.l.Errorf("file from %s: %v\n", change.From.Name, err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					cb := &CachedBlob{Blob: *blob} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					err = cb.Cache() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					if err == nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 						cache[change.From.TreeEntry.Hash] = cb 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						log.Printf("file from %s: %v\n", change.From.Name, err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						blobCache.l.Errorf("file from %s: %v\n", change.From.Name, err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -279,7 +286,7 @@ func (blobCache *BlobCache) getBlob(entry *object.ChangeEntry, fileGetter FileGe 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if err.Error() != plumbing.ErrObjectNotFound.Error() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			log.Printf("getBlob(%s)\n", entry.TreeEntry.Hash.String()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			blobCache.l.Errorf("getBlob(%s)\n", entry.TreeEntry.Hash.String()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			return nil, err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if entry.TreeEntry.Mode != 0160000 { 
			 |