feat(server): Introduce function to hash contents of a layer

This creates a cache key which can be used to check if a layer has
already been built.
This commit is contained in:
Vincent Ambo 2019-09-30 11:34:17 +01:00 committed by Vincent Ambo
parent c26dc1d9d7
commit 59f8925e05

View File

@ -103,9 +103,12 @@
package layers package layers
import ( import (
"crypto/sha1"
"fmt"
"log" "log"
"regexp" "regexp"
"sort" "sort"
"strings"
"gonum.org/v1/gonum/graph/flow" "gonum.org/v1/gonum/graph/flow"
"gonum.org/v1/gonum/graph/simple" "gonum.org/v1/gonum/graph/simple"
@ -141,6 +144,13 @@ type Layer struct {
mergeRating uint64 mergeRating uint64
} }
// Hash the contents of a layer to create a deterministic identifier that can be
// used for caching.
func (l *Layer) Hash() string {
sum := sha1.Sum([]byte(strings.Join(l.Contents, ":")))
return fmt.Sprintf("%x", sum)
}
func (a Layer) merge(b Layer) Layer { func (a Layer) merge(b Layer) Layer {
a.Contents = append(a.Contents, b.Contents...) a.Contents = append(a.Contents, b.Contents...)
a.mergeRating += b.mergeRating a.mergeRating += b.mergeRating
@ -272,6 +282,9 @@ func groupLayer(dt *flow.DominatorTree, root *closure) Layer {
children = append(children, dt.DominatedBy(child.ID())...) children = append(children, dt.DominatedBy(child.ID())...)
} }
// Contents are sorted to ensure that hashing is consistent
sort.Strings(contents)
return Layer{ return Layer{
Contents: contents, Contents: contents,
// TODO(tazjin): The point of this is to factor in // TODO(tazjin): The point of this is to factor in