| 
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -75,6 +75,11 @@ func alterToolVersion(tool string, args []string) error {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					return nil
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				var (
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					hasher    = sha256.New()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					sumBuffer [sha256.Size]byte
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				// addGarbleToHash takes some arbitrary input bytes,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				// typically a hash such as an action ID or a content ID,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				// and returns a new hash which also contains garble's own deterministic inputs.
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -85,21 +90,24 @@ func addGarbleToHash(inputHash []byte) []byte {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					// Join the two content IDs together into a single base64-encoded sha256
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					// sum. This includes the original tool's content ID, and garble's own
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					// content ID.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					h := sha256.New()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					h.Write(inputHash)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					hasher.Reset()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					hasher.Write(inputHash)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					if len(cache.BinaryContentID) == 0 {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						panic("missing binary content ID")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					h.Write(cache.BinaryContentID)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					hasher.Write(cache.BinaryContentID)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					// We also need to add the selected options to the full version string,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					// because all of them result in different output. We use spaces to
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					// separate the env vars and flags, to reduce the chances of collisions.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					if cache.GOGARBLE != "" {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						fmt.Fprintf(h, " GOGARBLE=%s", cache.GOGARBLE)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						fmt.Fprintf(hasher, " GOGARBLE=%s", cache.GOGARBLE)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					appendFlags(h, true)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					return h.Sum(nil)[:buildIDComponentLength]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					appendFlags(hasher, true)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					// addGarbleToHash returns the sum buffer, so we need a new copy.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					// Otherwise the next use of the global sumBuffer would conflict.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					sumBuffer := make([]byte, 0, sha256.Size)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					return hasher.Sum(sumBuffer)[:buildIDComponentLength]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				// appendFlags writes garble's own flags to w in string form.
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -220,12 +228,12 @@ func hashWith(salt []byte, name string) string {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					// thousands of obfuscated names.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					const hashLength = 8
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					d := sha256.New()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					d.Write(salt)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					d.Write(flagSeed.bytes)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					io.WriteString(d, name)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					sum := make([]byte, nameBase64.EncodedLen(d.Size()))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					nameBase64.Encode(sum, d.Sum(nil))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					hasher.Reset()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					hasher.Write(salt)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					hasher.Write(flagSeed.bytes)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					io.WriteString(hasher, name)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					sum := make([]byte, nameBase64.EncodedLen(hasher.Size()))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					nameBase64.Encode(sum, hasher.Sum(sumBuffer[:0]))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					sum = sum[:hashLength]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					// Even if we are hashing a package path, we still want the result to be
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -269,11 +277,11 @@ func gocachePathForFile(path string) (string, error) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					defer f.Close()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					h := sha256.New()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					if _, err := io.Copy(h, f); err != nil {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					hasher.Reset()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					if _, err := io.Copy(hasher, f); err != nil {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						return "", err
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					sum := hex.EncodeToString(h.Sum(nil))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					sum := hex.EncodeToString(hasher.Sum(sumBuffer[:0]))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					entry := filepath.Join(cache.GoEnv.GOCACHE, sum[:2], sum+"-d")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					// Ensure the file actually exists in the build cache.
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
			
			 | 
			 | 
			
				
 
 |