diff options
| author | 2026-03-30 06:00:15 +0000 | |
|---|---|---|
| committer | 2026-03-30 06:00:15 +0000 | |
| commit | 22f7dcbf39e064de83ba56ed2aaf20bd64b239aa (patch) | |
| tree | 8ad676038c40eea47372c13bf5f3b0d82e4860be | |
| parent | network/receivepack/service: Remove erroneous assignment (diff) | |
| signature | No signature | |
object/tree: Why wasn't I binary searching for remove v0.1.154
| -rw-r--r-- | object/tree/entry.go | 32 | ||||
| -rw-r--r-- | object/tree/insert.go | 7 | ||||
| -rw-r--r-- | object/tree/lookup.go | 7 | ||||
| -rw-r--r-- | object/tree/remove.go | 15 |
4 files changed, 36 insertions, 25 deletions
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 } diff --git a/object/tree/insert.go b/object/tree/insert.go index 683af4a7..22bda74f 100644 --- a/object/tree/insert.go +++ b/object/tree/insert.go @@ -15,11 +15,8 @@ func (tree *Tree) InsertEntry(newEntry TreeEntry) error { newEntry.Name = append([]byte(nil), newEntry.Name...) - insertAt, _ := slices.BinarySearchFunc(tree.Entries, treeEntrySearch{ - name: newEntry.Name, - isTree: newEntry.Mode == FileModeDir, - }, func(entry TreeEntry, search treeEntrySearch) int { - return TreeEntryNameCompare(entry.Name, entry.Mode, search.name, search.isTree) + insertAt, _ := slices.BinarySearchFunc(tree.Entries, newEntry.Name, func(entry TreeEntry, name []byte) int { + return TreeEntryNameCompare(entry.Name, entry.Mode, name, newEntry.Mode == FileModeDir) }) tree.Entries = slices.Insert(tree.Entries, insertAt, newEntry) diff --git a/object/tree/lookup.go b/object/tree/lookup.go index ac8865b4..249efd0f 100644 --- a/object/tree/lookup.go +++ b/object/tree/lookup.go @@ -9,9 +9,10 @@ func (tree *Tree) Entry(name []byte) *TreeEntry { return nil } - if e := tree.entry(name, true); e != nil { - return e + index, ok := tree.entryIndex(name) + if !ok { + return nil } - return tree.entry(name, false) + return &tree.Entries[index] } diff --git a/object/tree/remove.go b/object/tree/remove.go index 9a099842..94de88da 100644 --- a/object/tree/remove.go +++ b/object/tree/remove.go @@ -1,7 +1,6 @@ package tree import ( - "bytes" "fmt" "slices" ) @@ -12,14 +11,12 @@ func (tree *Tree) RemoveEntry(name []byte) error { return fmt.Errorf("object: tree: entry %q not found", name) } - index := slices.IndexFunc(tree.Entries, func(entry TreeEntry) bool { - return bytes.Equal(entry.Name, name) - }) - if index >= 0 { - tree.Entries = slices.Delete(tree.Entries, index, index+1) - - return nil + index, ok := tree.entryIndex(name) + if !ok { + return fmt.Errorf("object: tree: entry %q not found", name) } - return fmt.Errorf("object: tree: entry %q not found", name) + tree.Entries = slices.Delete(tree.Entries, index, index+1) + + return nil } |
