aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-03-30 06:00:15 +0000
committerGravatar Runxi Yu2026-03-30 06:00:15 +0000
commit22f7dcbf39e064de83ba56ed2aaf20bd64b239aa (patch)
tree8ad676038c40eea47372c13bf5f3b0d82e4860be
parentnetwork/receivepack/service: Remove erroneous assignment (diff)
signatureNo signature
object/tree: Why wasn't I binary searching for remove v0.1.154
-rw-r--r--object/tree/entry.go32
-rw-r--r--object/tree/insert.go7
-rw-r--r--object/tree/lookup.go7
-rw-r--r--object/tree/remove.go15
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
}