about summary refs log tree commit diff
path: root/tvix/store/protos/castore.go
diff options
context:
space:
mode:
Diffstat (limited to 'tvix/store/protos/castore.go')
-rw-r--r--tvix/store/protos/castore.go39
1 files changed, 39 insertions, 0 deletions
diff --git a/tvix/store/protos/castore.go b/tvix/store/protos/castore.go
new file mode 100644
index 000000000000..38419b40da99
--- /dev/null
+++ b/tvix/store/protos/castore.go
@@ -0,0 +1,39 @@
+package storev1
+
+import (
+	"fmt"
+
+	"google.golang.org/protobuf/proto"
+	"lukechampine.com/blake3"
+)
+
+// The size of a directory is calculated by summing up the numbers of
+// `directories`, `files` and `symlinks`, and for each directory, its size
+// field.
+func (d *Directory) Size() uint32 {
+	var size uint32
+	size = uint32(len(d.Files) + len(d.Symlinks))
+	for _, d := range d.Directories {
+		size += 1 + d.Size
+	}
+	return size
+}
+
+func (d *Directory) Digest() ([]byte, error) {
+	b, err := proto.MarshalOptions{
+		Deterministic: true,
+	}.Marshal(d)
+
+	if err != nil {
+		return nil, fmt.Errorf("error while marshalling directory: %w", err)
+	}
+
+	h := blake3.New(32, nil)
+
+	_, err = h.Write(b)
+	if err != nil {
+		return nil, fmt.Errorf("error writing to hasher: %w", err)
+	}
+
+	return h.Sum(nil), nil
+}