aboutsummaryrefslogtreecommitdiff
path: root/object/tree_serialize.go
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-02-20 21:20:35 +0800
committerGravatar Runxi Yu2026-02-20 21:51:00 +0800
commitb5a545a3d883026d61beac5556fec2a45e9ec3d3 (patch)
tree6281f89df21cb4b63a16bbcb057c5f186c40b148 /object/tree_serialize.go
parenttestgit: Add test harnesses (diff)
signatureNo signature
object: Add basic object code
Diffstat (limited to 'object/tree_serialize.go')
-rw-r--r--object/tree_serialize.go40
1 files changed, 40 insertions, 0 deletions
diff --git a/object/tree_serialize.go b/object/tree_serialize.go
new file mode 100644
index 00000000..b6182a03
--- /dev/null
+++ b/object/tree_serialize.go
@@ -0,0 +1,40 @@
+package object
+
+import "strconv"
+
+func (tree *Tree) serialize() []byte {
+ var bodyLen int
+ for _, entry := range tree.Entries {
+ mode := strconv.FormatUint(uint64(entry.Mode), 8)
+ bodyLen += len(mode) + 1 + len(entry.Name) + 1 + entry.ID.Size()
+ }
+
+ body := make([]byte, bodyLen)
+ pos := 0
+ for _, entry := range tree.Entries {
+ mode := strconv.FormatUint(uint64(entry.Mode), 8)
+ pos += copy(body[pos:], mode)
+ body[pos] = ' '
+ pos++
+ pos += copy(body[pos:], entry.Name)
+ body[pos] = 0
+ pos++
+ id := entry.ID.Bytes()
+ pos += copy(body[pos:], id)
+ }
+
+ return body
+}
+
+// Serialize renders the raw object (header + body).
+func (tree *Tree) Serialize() ([]byte, error) {
+ body := tree.serialize()
+ header, err := headerForType(TypeTree, body)
+ if err != nil {
+ return nil, err
+ }
+ raw := make([]byte, len(header)+len(body))
+ copy(raw, header)
+ copy(raw[len(header):], body)
+ return raw, nil
+}