aboutsummaryrefslogtreecommitdiffstats
path: root/utils/merkletrie
diff options
context:
space:
mode:
authorJosh Betz <j@joshbetz.com>2017-07-31 11:46:31 -0500
committerJosh Betz <j@joshbetz.com>2017-07-31 11:46:31 -0500
commit27b67a493d3b0a4f15252b77b546115c00ad2226 (patch)
treee540a6f545458bca1b9d9d2fbabb9cffd7bca8e4 /utils/merkletrie
parent91cdedae7faffca0a707fa47780efafe157ba47c (diff)
downloadgo-git-27b67a493d3b0a4f15252b77b546115c00ad2226.tar.gz
Normalize filenames before comparing.
Some multibyte characters can have multiple representations. Before comparing strings, we need to normalize them. In this case we're normalizing to normalized form C, but it shouldn't matter as long as both strings are normalized to the same form. Fixes https://github.com/src-d/go-git/issues/495
Diffstat (limited to 'utils/merkletrie')
-rw-r--r--utils/merkletrie/noder/path.go8
1 files changed, 7 insertions, 1 deletions
diff --git a/utils/merkletrie/noder/path.go b/utils/merkletrie/noder/path.go
index 85742db..d2e2932 100644
--- a/utils/merkletrie/noder/path.go
+++ b/utils/merkletrie/noder/path.go
@@ -3,6 +3,8 @@ package noder
import (
"bytes"
"strings"
+
+ "golang.org/x/text/unicode/norm"
)
// Path values represent a noder and its ancestors. The root goes first
@@ -78,7 +80,11 @@ func (p Path) Compare(other Path) int {
case i == len(p):
return -1
default:
- cmp := strings.Compare(p[i].Name(), other[i].Name())
+ form := norm.Form(norm.NFC)
+ this := form.String(p[i].Name())
+ that := form.String(other[i].Name())
+
+ cmp := strings.Compare(this, that)
if cmp != 0 {
return cmp
}