aboutsummaryrefslogtreecommitdiff
path: root/object/tree/insert.go
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-03-25 14:49:17 +0000
committerGravatar Runxi Yu2026-03-25 15:02:22 +0000
commit7847657e0820af98120031f719b8ede635ad8c07 (patch)
tree8c4439c78f72f1382edc809b49be33115847b6e7 /object/tree/insert.go
parentobject: Remove type.go (diff)
signatureNo signature
object: Split each object type into its own package v0.1.108
Diffstat (limited to 'object/tree/insert.go')
-rw-r--r--object/tree/insert.go23
1 files changed, 23 insertions, 0 deletions
diff --git a/object/tree/insert.go b/object/tree/insert.go
new file mode 100644
index 00000000..bca4aa49
--- /dev/null
+++ b/object/tree/insert.go
@@ -0,0 +1,23 @@
+package tree
+
+import (
+ "fmt"
+ "sort"
+)
+
+// InsertEntry inserts a tree entry while preserving Git ordering.
+func (tree *Tree) InsertEntry(newEntry TreeEntry) error {
+ if tree.entry(newEntry.Name, true) != nil || tree.entry(newEntry.Name, false) != nil {
+ return fmt.Errorf("object: tree: entry %q already exists", newEntry.Name)
+ }
+
+ newIsTree := newEntry.Mode == FileModeDir
+ insertAt := sort.Search(len(tree.Entries), func(i int) bool {
+ return TreeEntryNameCompare(tree.Entries[i].Name, tree.Entries[i].Mode, newEntry.Name, newIsTree) >= 0
+ })
+ tree.Entries = append(tree.Entries, TreeEntry{})
+ copy(tree.Entries[insertAt+1:], tree.Entries[insertAt:])
+ tree.Entries[insertAt] = newEntry
+
+ return nil
+}