ref: ab174c473618dd3743881cf44e02c2db4d1ecd5f
dir: /object/tree/serialize.go/
package tree
import (
"errors"
"strconv"
objectheader "codeberg.org/lindenii/furgit/object/header"
objecttype "codeberg.org/lindenii/furgit/object/type"
)
// SerializeWithoutHeader renders the raw tree body bytes.
func (tree *Tree) SerializeWithoutHeader() ([]byte, error) {
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.Algorithm().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, nil
}
// SerializeWithHeader renders the raw object (header + body).
func (tree *Tree) SerializeWithHeader() ([]byte, error) {
body, err := tree.SerializeWithoutHeader()
if err != nil {
return nil, err
}
header, ok := objectheader.Encode(objecttype.TypeTree, int64(len(body)))
if !ok {
return nil, errors.New("object: tree: failed to encode object header")
}
raw := make([]byte, len(header)+len(body))
copy(raw, header)
copy(raw[len(header):], body)
return raw, nil
}