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