From 22f7dcbf39e064de83ba56ed2aaf20bd64b239aa Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Mon, 30 Mar 2026 06:00:15 +0000 Subject: object/tree: Why wasn't I binary searching for remove --- object/tree/entry.go | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) (limited to 'object/tree/entry.go') diff --git a/object/tree/entry.go b/object/tree/entry.go index 70f1dab7..b3089b74 100644 --- a/object/tree/entry.go +++ b/object/tree/entry.go @@ -17,11 +17,8 @@ type TreeEntry struct { } func (tree *Tree) entry(name []byte, searchIsTree bool) *TreeEntry { - index, ok := slices.BinarySearchFunc(tree.Entries, treeEntrySearch{ - name: name, - isTree: searchIsTree, - }, func(entry TreeEntry, search treeEntrySearch) int { - return TreeEntryNameCompare(entry.Name, entry.Mode, search.name, search.isTree) + 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 @@ -35,7 +32,26 @@ func (tree *Tree) entry(name []byte, searchIsTree bool) *TreeEntry { return entry } -type treeEntrySearch struct { - name []byte - isTree bool +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 } -- cgit v1.3.1-10-gc9f91