ref: 1a8842b33d6d83d1754267e087fd7b4f73ca9e91
dir: /repository/tree.go/
package repository
import (
"errors"
"fmt"
"codeberg.org/lindenii/furgit/object"
"codeberg.org/lindenii/furgit/object/stored"
)
// 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 *stored.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")
}