ref: 6470fe1e49f8cdec0feba02d70c3329113562f17
parent: 918a17362c8a07221a65d4d60af0667ee7f0dd61
author: Runxi Yu <me@runxiyu.org>
date: Sun Feb 22 05:45:51 EST 2026
repository: Make traverseTreeIter use filemode instead of resolving size
--- a/repository/traversal_helpers_test.go
+++ b/repository/traversal_helpers_test.go
@@ -3,24 +3,28 @@
import (
"codeberg.org/lindenii/furgit/object"
"codeberg.org/lindenii/furgit/objectid"
- "codeberg.org/lindenii/furgit/objecttype"
"codeberg.org/lindenii/furgit/repository"
)
+type treeWalkFrame struct {+ id objectid.ObjectID
+ isTree bool
+}
+
func traverseTreeIter(repo *repository.Repository, root objectid.ObjectID) (int, error) {- stack := []objectid.ObjectID{root}+ stack := []treeWalkFrame{{id: root, isTree: true}}total := 0
for len(stack) > 0 {- id := stack[len(stack)-1]
+ frame := stack[len(stack)-1]
stack = stack[:len(stack)-1]
+ id := frame.id
- ty, _, err := repo.Objects().ReadHeader(id)
- if err != nil {- return 0, err
- }
- total++
- if ty != objecttype.TypeTree {+ if !frame.isTree {+ if _, err := repo.ReadStoredSize(id); err != nil {+ return 0, err
+ }
+ total++
continue
}
@@ -28,12 +32,16 @@
if err != nil {return 0, err
}
+ total++
for i := len(tree.Tree().Entries) - 1; i >= 0; i-- {entry := tree.Tree().Entries[i]
if entry.Mode == object.FileModeGitlink {continue
}
- stack = append(stack, entry.ID)
+ stack = append(stack, treeWalkFrame{+ id: entry.ID,
+ isTree: entry.Mode == object.FileModeDir,
+ })
}
}
--
⑨