Fast implementation of Git in pure Go
1package object
2
3import (
4 "errors"
5 "strconv"
6
7 "codeberg.org/lindenii/furgit/objectheader"
8 "codeberg.org/lindenii/furgit/objecttype"
9)
10
11// SerializeWithoutHeader renders the raw tree body bytes.
12func (tree *Tree) SerializeWithoutHeader() ([]byte, error) {
13 var bodyLen int
14
15 for _, entry := range tree.Entries {
16 mode := strconv.FormatUint(uint64(entry.Mode), 8)
17 bodyLen += len(mode) + 1 + len(entry.Name) + 1 + entry.ID.Size()
18 }
19
20 body := make([]byte, bodyLen)
21 pos := 0
22
23 for _, entry := range tree.Entries {
24 mode := strconv.FormatUint(uint64(entry.Mode), 8)
25 pos += copy(body[pos:], mode)
26 body[pos] = ' '
27 pos++
28 pos += copy(body[pos:], entry.Name)
29 body[pos] = 0
30 pos++
31 id := entry.ID.Bytes()
32 pos += copy(body[pos:], id)
33 }
34
35 return body, nil
36}
37
38// SerializeWithHeader renders the raw object (header + body).
39func (tree *Tree) SerializeWithHeader() ([]byte, error) {
40 body, err := tree.SerializeWithoutHeader()
41 if err != nil {
42 return nil, err
43 }
44
45 header, ok := objectheader.Encode(objecttype.TypeTree, int64(len(body)))
46 if !ok {
47 return nil, errors.New("object: tree: failed to encode object header")
48 }
49
50 raw := make([]byte, len(header)+len(body))
51 copy(raw, header)
52 copy(raw[len(header):], body)
53
54 return raw, nil
55}