From 4ca0404d2fb11203f315bb93556dcfac35abfa34 Mon Sep 17 00:00:00 2001 From: Runxi Yu <me@runxiyu.org> Date: Wed, 02 Apr 2025 09:53:13 +0800 Subject: [PATCH] Git: Fix writeTree ordering --- git_plumbing.go | 24 ++++++++++++++++++++++-- diff --git a/git_plumbing.go b/git_plumbing.go index 36acb902b8993b1180169f4481b9513f067c4387..9386ea99db706891f9818f3e1158be34079ee330 100644 --- a/git_plumbing.go +++ b/git_plumbing.go @@ -18,9 +18,29 @@ 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 { -- 2.48.1