···
···
84
+
TerminateWalk error = errors.New("terminate walk")
87
+
type callback = func(node object.TreeEntry, parent *object.Tree, fullPath string) error
89
+
func (g *GitRepo) Walk(
90
+
ctx context.Context,
94
+
c, err := g.r.CommitObject(g.h)
96
+
return fmt.Errorf("commit object: %w", err)
99
+
tree, err := c.Tree()
101
+
return fmt.Errorf("file tree: %w", err)
106
+
subtree, err = tree.Tree(root)
108
+
return fmt.Errorf("sub tree: %w", err)
112
+
return g.walkHelper(ctx, root, subtree, cb)
115
+
func (g *GitRepo) walkHelper(
116
+
ctx context.Context,
118
+
currentTree *object.Tree,
121
+
for _, e := range currentTree.Entries {
122
+
// check if context hits deadline before processing
129
+
mode, err := e.Mode.ToOSFileMode()
135
+
if e.Mode.IsFile() {
136
+
err = cb(e, currentTree, root)
137
+
if errors.Is(err, TerminateWalk) {
142
+
// e is a directory
144
+
subtree, err := currentTree.Tree(e.Name)
146
+
return fmt.Errorf("sub tree %s: %w", e.Name, err)
149
+
fullPath := path.Join(root, e.Name)
151
+
err = g.walkHelper(ctx, fullPath, subtree, cb)