about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--tools/nixery/server/layers/grouping.go13
1 files changed, 13 insertions, 0 deletions
diff --git a/tools/nixery/server/layers/grouping.go b/tools/nixery/server/layers/grouping.go
index e8666bf4dd0e..f8259ab989ff 100644
--- a/tools/nixery/server/layers/grouping.go
+++ b/tools/nixery/server/layers/grouping.go
@@ -103,9 +103,12 @@
 package layers
 
 import (
+	"crypto/sha1"
+	"fmt"
 	"log"
 	"regexp"
 	"sort"
+	"strings"
 
 	"gonum.org/v1/gonum/graph/flow"
 	"gonum.org/v1/gonum/graph/simple"
@@ -141,6 +144,13 @@ type Layer struct {
 	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 {
 	a.Contents = append(a.Contents, b.Contents...)
 	a.mergeRating += b.mergeRating
@@ -272,6 +282,9 @@ func groupLayer(dt *flow.DominatorTree, root *closure) Layer {
 		children = append(children, dt.DominatedBy(child.ID())...)
 	}
 
+	// Contents are sorted to ensure that hashing is consistent
+	sort.Strings(contents)
+
 	return Layer{
 		Contents: contents,
 		// TODO(tazjin): The point of this is to factor in