aboutsummaryrefslogtreecommitdiff
path: root/repository/tree_resolve.go
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-02-21 14:56:56 +0800
committerGravatar Runxi Yu2026-02-21 15:01:46 +0800
commit3011c5e84e9c05bfabe0a5f24b8b267b4bd23912 (patch)
tree611bd4be729be1287924d77d0ed85615114ca0c1 /repository/tree_resolve.go
parentrepository: Add Repository abstraction (diff)
signatureNo signature
repository, objectstored: Add Stored interface and implementations
Diffstat (limited to 'repository/tree_resolve.go')
-rw-r--r--repository/tree_resolve.go48
1 files changed, 48 insertions, 0 deletions
diff --git a/repository/tree_resolve.go b/repository/tree_resolve.go
new file mode 100644
index 00000000..6b7023ba
--- /dev/null
+++ b/repository/tree_resolve.go
@@ -0,0 +1,48 @@
+package repository
+
+import (
+ "errors"
+ "fmt"
+
+ "codeberg.org/lindenii/furgit/object"
+ "codeberg.org/lindenii/furgit/objectstored"
+)
+
+// ResolveTreeEntry resolves one path within a stored root tree.
+//
+// parts must contain at least one path segment. Intermediate segments must be
+// tree entries.
+func (repo *Repository) ResolveTreeEntry(tree *objectstored.StoredTree, parts [][]byte) (object.TreeEntry, error) {
+ if tree == nil {
+ return object.TreeEntry{}, errors.New("repository: nil root tree")
+ }
+ if len(parts) == 0 {
+ return object.TreeEntry{}, errors.New("repository: empty tree path")
+ }
+
+ current := tree
+ for i, part := range parts {
+ if len(part) == 0 {
+ return object.TreeEntry{}, errors.New("repository: empty tree path segment")
+ }
+
+ entry := current.Tree().Entry(part)
+ if entry == nil {
+ return object.TreeEntry{}, fmt.Errorf("repository: tree entry %q not found", part)
+ }
+ if i == len(parts)-1 {
+ return *entry, nil
+ }
+ if entry.Mode != object.FileModeDir {
+ return object.TreeEntry{}, fmt.Errorf("repository: path segment %q is not a tree", part)
+ }
+
+ next, err := repo.ReadStoredTree(entry.ID)
+ if err != nil {
+ return object.TreeEntry{}, err
+ }
+ current = next
+ }
+
+ return object.TreeEntry{}, fmt.Errorf("repository: tree entry not found")
+}