shithub: furgit

ref: ab174c473618dd3743881cf44e02c2db4d1ecd5f
dir: /object/tree/entry.go/

View raw version
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
}