ref: df1f2fb3daa1acd25c88510f259d5535fb482126
dir: /object/tree/entry.go/
package tree
import (
"bytes"
"slices"
objectid "codeberg.org/lindenii/furgit/object/id"
)
// TreeEntry represents a single entry in a tree.
type TreeEntry struct {
Mode FileMode
// Name is part of the tree ordering. Mutating it after insertion may break
// Tree ordering and lookup behavior.
Name []byte
ID objectid.ObjectID
}
func (tree *Tree) entry(name []byte, searchIsTree bool) *TreeEntry {
index, ok := slices.BinarySearchFunc(tree.Entries, name, func(entry TreeEntry, name []byte) int {
return TreeEntryNameCompare(entry.Name, entry.Mode, name, searchIsTree)
})
if !ok {
return nil
}
entry := &tree.Entries[index]
if !bytes.Equal(entry.Name, name) {
return nil
}
return entry
}
func (tree *Tree) entryIndex(name []byte) (int, bool) {
index, ok := tree.entryIndexWithMode(name, true)
if ok {
return index, true
}
return tree.entryIndexWithMode(name, false)
}
func (tree *Tree) entryIndexWithMode(name []byte, searchIsTree bool) (int, bool) {
index, ok := slices.BinarySearchFunc(tree.Entries, name, func(entry TreeEntry, name []byte) int {
return TreeEntryNameCompare(entry.Name, entry.Mode, name, searchIsTree)
})
if !ok {
return 0, false
}
if !bytes.Equal(tree.Entries[index].Name, name) {
return 0, false
}
return index, true
}