65 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
package buildah
 | 
						|
 | 
						|
import (
 | 
						|
	"hash"
 | 
						|
	"strings"
 | 
						|
 | 
						|
	digest "github.com/opencontainers/go-digest"
 | 
						|
)
 | 
						|
 | 
						|
type singleDigester struct {
 | 
						|
	digester digest.Digester
 | 
						|
	prefix   string
 | 
						|
}
 | 
						|
 | 
						|
// CompositeDigester can compute a digest over multiple items.
 | 
						|
type CompositeDigester struct {
 | 
						|
	digesters []singleDigester
 | 
						|
}
 | 
						|
 | 
						|
// Restart clears all state, so that the composite digester can start over.
 | 
						|
func (c *CompositeDigester) Restart() {
 | 
						|
	c.digesters = nil
 | 
						|
}
 | 
						|
 | 
						|
// Start starts recording the digest for a new item.  The caller should call
 | 
						|
// Hash() immediately after to retrieve the new io.Writer.
 | 
						|
func (c *CompositeDigester) Start(prefix string) {
 | 
						|
	prefix = strings.TrimSuffix(prefix, ":")
 | 
						|
	c.digesters = append(c.digesters, singleDigester{digester: digest.Canonical.Digester(), prefix: prefix})
 | 
						|
}
 | 
						|
 | 
						|
// Hash returns the hasher for the current item.
 | 
						|
func (c *CompositeDigester) Hash() hash.Hash {
 | 
						|
	num := len(c.digesters)
 | 
						|
	if num == 0 {
 | 
						|
		return nil
 | 
						|
	}
 | 
						|
	return c.digesters[num-1].digester.Hash()
 | 
						|
}
 | 
						|
 | 
						|
// Digest returns the prefix and a composite digest over everything that's been
 | 
						|
// digested.
 | 
						|
func (c *CompositeDigester) Digest() (string, digest.Digest) {
 | 
						|
	num := len(c.digesters)
 | 
						|
	switch num {
 | 
						|
	case 0:
 | 
						|
		return "", ""
 | 
						|
	case 1:
 | 
						|
		return c.digesters[0].prefix, c.digesters[0].digester.Digest()
 | 
						|
	default:
 | 
						|
		content := ""
 | 
						|
		for i, digester := range c.digesters {
 | 
						|
			if i > 0 {
 | 
						|
				content += ","
 | 
						|
			}
 | 
						|
			prefix := digester.prefix
 | 
						|
			if digester.prefix != "" {
 | 
						|
				digester.prefix += ":"
 | 
						|
			}
 | 
						|
			content += prefix + digester.digester.Digest().Encoded()
 | 
						|
		}
 | 
						|
		return "multi", digest.Canonical.FromString(content)
 | 
						|
	}
 | 
						|
}
 |