diff options
author | Michael Muré <batolettre@gmail.com> | 2020-10-25 00:24:26 +0200 |
---|---|---|
committer | Michael Muré <batolettre@gmail.com> | 2020-10-25 00:24:26 +0200 |
commit | ca4020f4fa35fa7f4d62cc465ed1edc92ff98896 (patch) | |
tree | 73b6885d4a43e367e7f68c329e158191ab9b999f | |
parent | 064a96f808d0affc3240ab28036df69d95496335 (diff) | |
download | git-bug-ca4020f4fa35fa7f4d62cc465ed1edc92ff98896.tar.gz |
repository: workaround a go-git bug and ensure sorted tree object
-rw-r--r-- | repository/gogit.go | 18 |
1 files changed, 17 insertions, 1 deletions
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 |