aboutsummaryrefslogtreecommitdiff
path: root/object/tree/name.go
diff options
context:
space:
mode:
Diffstat (limited to 'object/tree/name.go')
-rw-r--r--object/tree/name.go51
1 files changed, 51 insertions, 0 deletions
diff --git a/object/tree/name.go b/object/tree/name.go
new file mode 100644
index 00000000..02af3292
--- /dev/null
+++ b/object/tree/name.go
@@ -0,0 +1,51 @@
+package tree
+
+// TreeEntryNameCompare compares names using Git tree ordering rules.
+func TreeEntryNameCompare(entryName []byte, entryMode FileMode, searchName []byte, searchIsTree bool) int {
+ isEntryTree := entryMode == FileModeDir
+
+ entryLen := len(entryName)
+ if isEntryTree {
+ entryLen++
+ }
+
+ searchLen := len(searchName)
+ if searchIsTree {
+ searchLen++
+ }
+
+ n := min(searchLen, entryLen)
+
+ for i := range n {
+ var ec, sc byte
+ if i < len(entryName) {
+ ec = entryName[i]
+ } else {
+ ec = '/'
+ }
+
+ if i < len(searchName) {
+ sc = searchName[i]
+ } else {
+ sc = '/'
+ }
+
+ if ec < sc {
+ return -1
+ }
+
+ if ec > sc {
+ return 1
+ }
+ }
+
+ if entryLen < searchLen {
+ return -1
+ }
+
+ if entryLen > searchLen {
+ return 1
+ }
+
+ return 0
+}