diff options
| author | 2026-02-20 21:20:35 +0800 | |
|---|---|---|
| committer | 2026-02-20 21:51:00 +0800 | |
| commit | b5a545a3d883026d61beac5556fec2a45e9ec3d3 (patch) | |
| tree | 6281f89df21cb4b63a16bbcb057c5f186c40b148 /object/tree_serialize.go | |
| parent | testgit: Add test harnesses (diff) | |
| signature | No signature | |
object: Add basic object code
Diffstat (limited to 'object/tree_serialize.go')
| -rw-r--r-- | object/tree_serialize.go | 40 |
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 +} |
