From ca4020f4fa35fa7f4d62cc465ed1edc92ff98896 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Mur=C3=A9?= Date: Sun, 25 Oct 2020 00:24:26 +0200 Subject: [PATCH] repository: workaround a go-git bug and ensure sorted tree object --- repository/gogit.go | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/repository/gogit.go b/repository/gogit.go index efa8cda1..b30effb5 100644 --- a/repository/gogit.go +++ b/repository/gogit.go @@ -8,6 +8,7 @@ import ( "os/exec" stdpath "path" "path/filepath" + "sort" "strings" "sync" "time" @@ -359,7 +360,22 @@ func (repo *GoGitRepo) ReadData(hash Hash) ([]byte, error) { func (repo *GoGitRepo) StoreTree(mapping []TreeEntry) (Hash, error) { var tree object.Tree - for _, entry := range mapping { + // TODO: can be removed once https://github.com/go-git/go-git/issues/193 is resolved + sorted := make([]TreeEntry, len(mapping)) + copy(sorted, mapping) + sort.Slice(sorted, func(i, j int) bool { + nameI := sorted[i].Name + if sorted[i].ObjectType == Tree { + nameI += "/" + } + nameJ := sorted[j].Name + if sorted[j].ObjectType == Tree { + nameJ += "/" + } + return nameI < nameJ + }) + + for _, entry := range sorted { mode := filemode.Regular if entry.ObjectType == Tree { mode = filemode.Dir