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)
|
|
}
|
|
}
|