From b5a545a3d883026d61beac5556fec2a45e9ec3d3 Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Fri, 20 Feb 2026 21:20:35 +0800 Subject: object: Add basic object code --- object/tree_serialize.go | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 object/tree_serialize.go (limited to 'object/tree_serialize.go') 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 +} -- cgit v1.3.1-10-gc9f91