diff options
| author | 2026-03-25 14:49:17 +0000 | |
|---|---|---|
| committer | 2026-03-25 15:02:22 +0000 | |
| commit | 7847657e0820af98120031f719b8ede635ad8c07 (patch) | |
| tree | 8c4439c78f72f1382edc809b49be33115847b6e7 /object/tree/name.go | |
| parent | object: Remove type.go (diff) | |
| signature | No signature | |
object: Split each object type into its own package v0.1.108
Diffstat (limited to 'object/tree/name.go')
| -rw-r--r-- | object/tree/name.go | 51 |
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 +} |
