aboutsummaryrefslogtreecommitdiff
path: root/git_plumbing.go
diff options
context:
space:
mode:
authorRunxi Yu <me@runxiyu.org>2025-04-02 09:53:13 +0800
committerRunxi Yu <me@runxiyu.org>2025-04-02 09:53:13 +0800
commit4ca0404d2fb11203f315bb93556dcfac35abfa34 (patch)
tree4c2504c386f12efffd75a48176b3f78a8ea47470 /git_plumbing.go
parentAdd missing "s" in 400_colon (diff)
downloadforge-4ca0404d2fb11203f315bb93556dcfac35abfa34.tar.gz
forge-4ca0404d2fb11203f315bb93556dcfac35abfa34.tar.zst
forge-4ca0404d2fb11203f315bb93556dcfac35abfa34.zip
Git: Fix writeTree ordering
Diffstat (limited to 'git_plumbing.go')
-rw-r--r--git_plumbing.go24
1 files changed, 22 insertions, 2 deletions
diff --git a/git_plumbing.go b/git_plumbing.go
index 36acb90..9386ea9 100644
--- a/git_plumbing.go
+++ b/git_plumbing.go
@@ -18,9 +18,29 @@ import (
func writeTree(ctx context.Context, repoPath string, entries []treeEntry) (string, error) {
var buf bytes.Buffer
- // Must
sort.Slice(entries, func(i, j int) bool {
- return entries[i].name < entries[j].name
+ nameI, nameJ := entries[i].name, entries[j].name
+
+ if nameI == nameJ { // meh
+ return !(entries[i].mode == "40000") && (entries[j].mode == "40000")
+ }
+
+ if strings.HasPrefix(nameJ, nameI) && len(nameI) < len(nameJ) {
+ if entries[i].mode == "40000" {
+ return false
+ }
+ return true
+ }
+
+ if strings.HasPrefix(nameI, nameJ) && len(nameJ) < len(nameI) {
+ // nameJ is a prefix of nameI
+ if entries[j].mode == "40000" {
+ return true
+ }
+ return false
+ }
+
+ return nameI < nameJ
})
for _, e := range entries {