From 4ca0404d2fb11203f315bb93556dcfac35abfa34 Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Wed, 2 Apr 2025 09:53:13 +0800 Subject: Git: Fix writeTree ordering --- git_plumbing.go | 24 ++++++++++++++++++++++-- 1 file 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 { -- cgit v1.2.3