Fast implementation of Git in pure Go codeberg.org/lindenii/furgit
git go
6
fork

Configure Feed

Select the types of activity you want to include in your feed.

object/tree: Why wasn't I binary searching for remove

Runxi Yu 22f7dcbf 15913e07

+36 -25
+24 -8
object/tree/entry.go
··· 17 17 } 18 18 19 19 func (tree *Tree) entry(name []byte, searchIsTree bool) *TreeEntry { 20 - index, ok := slices.BinarySearchFunc(tree.Entries, treeEntrySearch{ 21 - name: name, 22 - isTree: searchIsTree, 23 - }, func(entry TreeEntry, search treeEntrySearch) int { 24 - return TreeEntryNameCompare(entry.Name, entry.Mode, search.name, search.isTree) 20 + index, ok := slices.BinarySearchFunc(tree.Entries, name, func(entry TreeEntry, name []byte) int { 21 + return TreeEntryNameCompare(entry.Name, entry.Mode, name, searchIsTree) 25 22 }) 26 23 if !ok { 27 24 return nil ··· 35 32 return entry 36 33 } 37 34 38 - type treeEntrySearch struct { 39 - name []byte 40 - isTree bool 35 + func (tree *Tree) entryIndex(name []byte) (int, bool) { 36 + index, ok := tree.entryIndexWithMode(name, true) 37 + if ok { 38 + return index, true 39 + } 40 + 41 + return tree.entryIndexWithMode(name, false) 42 + } 43 + 44 + func (tree *Tree) entryIndexWithMode(name []byte, searchIsTree bool) (int, bool) { 45 + index, ok := slices.BinarySearchFunc(tree.Entries, name, func(entry TreeEntry, name []byte) int { 46 + return TreeEntryNameCompare(entry.Name, entry.Mode, name, searchIsTree) 47 + }) 48 + if !ok { 49 + return 0, false 50 + } 51 + 52 + if !bytes.Equal(tree.Entries[index].Name, name) { 53 + return 0, false 54 + } 55 + 56 + return index, true 41 57 }
+2 -5
object/tree/insert.go
··· 15 15 16 16 newEntry.Name = append([]byte(nil), newEntry.Name...) 17 17 18 - insertAt, _ := slices.BinarySearchFunc(tree.Entries, treeEntrySearch{ 19 - name: newEntry.Name, 20 - isTree: newEntry.Mode == FileModeDir, 21 - }, func(entry TreeEntry, search treeEntrySearch) int { 22 - return TreeEntryNameCompare(entry.Name, entry.Mode, search.name, search.isTree) 18 + insertAt, _ := slices.BinarySearchFunc(tree.Entries, newEntry.Name, func(entry TreeEntry, name []byte) int { 19 + return TreeEntryNameCompare(entry.Name, entry.Mode, name, newEntry.Mode == FileModeDir) 23 20 }) 24 21 tree.Entries = slices.Insert(tree.Entries, insertAt, newEntry) 25 22
+4 -3
object/tree/lookup.go
··· 9 9 return nil 10 10 } 11 11 12 - if e := tree.entry(name, true); e != nil { 13 - return e 12 + index, ok := tree.entryIndex(name) 13 + if !ok { 14 + return nil 14 15 } 15 16 16 - return tree.entry(name, false) 17 + return &tree.Entries[index] 17 18 }
+6 -9
object/tree/remove.go
··· 1 1 package tree 2 2 3 3 import ( 4 - "bytes" 5 4 "fmt" 6 5 "slices" 7 6 ) ··· 12 11 return fmt.Errorf("object: tree: entry %q not found", name) 13 12 } 14 13 15 - index := slices.IndexFunc(tree.Entries, func(entry TreeEntry) bool { 16 - return bytes.Equal(entry.Name, name) 17 - }) 18 - if index >= 0 { 19 - tree.Entries = slices.Delete(tree.Entries, index, index+1) 14 + index, ok := tree.entryIndex(name) 15 + if !ok { 16 + return fmt.Errorf("object: tree: entry %q not found", name) 17 + } 20 18 21 - return nil 22 - } 19 + tree.Entries = slices.Delete(tree.Entries, index, index+1) 23 20 24 - return fmt.Errorf("object: tree: entry %q not found", name) 21 + return nil 25 22 }