diff options
| author | 2026-02-21 14:56:56 +0800 | |
|---|---|---|
| committer | 2026-02-21 15:01:46 +0800 | |
| commit | 3011c5e84e9c05bfabe0a5f24b8b267b4bd23912 (patch) | |
| tree | 611bd4be729be1287924d77d0ed85615114ca0c1 /repository/tree_resolve.go | |
| parent | repository: Add Repository abstraction (diff) | |
| signature | No signature | |
repository, objectstored: Add Stored interface and implementations
Diffstat (limited to 'repository/tree_resolve.go')
| -rw-r--r-- | repository/tree_resolve.go | 48 |
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") +} |
