aboutsummaryrefslogtreecommitdiff
path: root/obj_tree.go
diff options
context:
space:
mode:
authorGravatar Runxi Yu2025-11-16 00:00:00 +0000
committerGravatar Runxi Yu2025-11-16 00:00:00 +0000
commit9ac827977b8f430906110ecd2030324248fff604 (patch)
treeb0f8fdb46252bef429beb27190a2cfc0cbd42540 /obj_tree.go
parentREADME: Add my Villosa instance (diff)
signature
Support multiple hash sizes in one build
Diffstat (limited to 'obj_tree.go')
-rw-r--r--obj_tree.go18
1 files changed, 9 insertions, 9 deletions
diff --git a/obj_tree.go b/obj_tree.go
index abf23adc..55a27a08 100644
--- a/obj_tree.go
+++ b/obj_tree.go
@@ -26,7 +26,7 @@ func (*Tree) ObjType() ObjType {
}
// parseTree decodes a tree body.
-func parseTree(id Hash, body []byte) (*Tree, error) {
+func parseTree(id Hash, body []byte, hashSize int) (*Tree, error) {
var entries []TreeEntry
i := 0
for i < len(body) {
@@ -44,12 +44,12 @@ func parseTree(id Hash, body []byte) (*Tree, error) {
nameBytes := body[i : i+nul]
i += nul + 1
- if i+HashSize > len(body) {
+ if i+hashSize > len(body) {
return nil, errors.New("furgit: tree: truncated child hash")
}
var child Hash
- copy(child[:], body[i:i+HashSize])
- i += HashSize
+ copy(child[:], body[i:i+hashSize])
+ i += hashSize
mode, err := strconv.ParseUint(string(modeBytes), 8, 32)
if err != nil {
@@ -71,11 +71,11 @@ func parseTree(id Hash, body []byte) (*Tree, error) {
}
// treeBody builds the entry list for a tree without the Git header.
-func treeBody(t *Tree) []byte {
+func treeBody(t *Tree, hashSize int) []byte {
var bodyLen int
for _, e := range t.Entries {
mode := strconv.FormatUint(uint64(e.Mode), 8)
- bodyLen += len(mode) + 1 + len(e.Name) + 1 + HashSize
+ bodyLen += len(mode) + 1 + len(e.Name) + 1 + hashSize
}
body := make([]byte, bodyLen)
@@ -88,15 +88,15 @@ func treeBody(t *Tree) []byte {
pos += copy(body[pos:], e.Name)
body[pos] = 0
pos++
- pos += copy(body[pos:], e.ID[:])
+ pos += copy(body[pos:], e.ID[:hashSize])
}
return body
}
// Serialize renders a Tree into canonical Git format.
-func (t *Tree) Serialize() ([]byte, error) {
- body := treeBody(t)
+func (t *Tree) Serialize(hashSize int) ([]byte, error) {
+ body := treeBody(t, hashSize)
header, err := headerForType(ObjTree, body)
if err != nil {
return nil, err