From 384c543ab972a0c9b7e13b2318703f3245c034b2 Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Tue, 16 Sep 2014 23:14:03 +0200 Subject: [PATCH] Ignore patterns should be case insensitive on OS X and Windows --- fnmatch/fnmatch.go | 15 +++++++++++---- fnmatch/fnmatch_test.go | 9 +++++++-- ignore/ignore_test.go | 27 +++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 6 deletions(-) diff --git a/fnmatch/fnmatch.go b/fnmatch/fnmatch.go index bfe18980e..bf692e3de 100644 --- a/fnmatch/fnmatch.go +++ b/fnmatch/fnmatch.go @@ -20,15 +20,22 @@ const ( func Convert(pattern string, flags int) (*regexp.Regexp, error) { any := "." - if runtime.GOOS == "windows" { - flags |= FNM_NOESCAPE + switch runtime.GOOS { + case "windows": + flags |= FNM_NOESCAPE | FNM_CASEFOLD pattern = filepath.FromSlash(pattern) if flags&FNM_PATHNAME != 0 { any = "[^\\\\]" } - } else if flags&FNM_PATHNAME != 0 { - any = "[^/]" + case "darwin": + flags |= FNM_CASEFOLD + fallthrough + default: + if flags&FNM_PATHNAME != 0 { + any = "[^/]" + } } + if flags&FNM_NOESCAPE != 0 { pattern = strings.Replace(pattern, "\\", "\\\\", -1) } else { diff --git a/fnmatch/fnmatch_test.go b/fnmatch/fnmatch_test.go index 7c015743d..c4da0a742 100644 --- a/fnmatch/fnmatch_test.go +++ b/fnmatch/fnmatch_test.go @@ -50,12 +50,17 @@ var testcases = []testcase{ {"**/foo.txt", "bar/baz/foo.txt", 0, true}, {"**/foo.txt", "bar/baz/foo.txt", FNM_PATHNAME, true}, - {"foo.txt", "foo.TXT", 0, false}, {"foo.txt", "foo.TXT", FNM_CASEFOLD, true}, } func TestMatch(t *testing.T) { - if runtime.GOOS != "windows" { + switch runtime.GOOS { + case "windows": + testcases = append(testcases, testcase{"foo.txt", "foo.TXT", 0, true}) + case "darwin": + testcases = append(testcases, testcase{"foo.txt", "foo.TXT", 0, true}) + fallthrough + default: testcases = append(testcases, testcase{"f\\[ab\\]o.txt", "f[ab]o.txt", 0, true}) testcases = append(testcases, testcase{"foo\\.txt", "foo.txt", 0, true}) testcases = append(testcases, testcase{"foo\\*.txt", "foo*.txt", 0, true}) diff --git a/ignore/ignore_test.go b/ignore/ignore_test.go index 4900fb2db..9a7a68426 100644 --- a/ignore/ignore_test.go +++ b/ignore/ignore_test.go @@ -7,6 +7,7 @@ package ignore_test import ( "bytes" "path/filepath" + "runtime" "testing" "github.com/syncthing/syncthing/ignore" @@ -106,3 +107,29 @@ func TestBadPatterns(t *testing.T) { } } } + +func TestCaseSensitivity(t *testing.T) { + ign, _ := ignore.Parse(bytes.NewBufferString("test"), ".stignore") + + match := []string{"test"} + dontMatch := []string{"foo"} + + switch runtime.GOOS { + case "darwin", "windows": + match = append(match, "TEST", "Test", "tESt") + default: + dontMatch = append(dontMatch, "TEST", "Test", "tESt") + } + + for _, tc := range match { + if !ign.Match(tc) { + t.Errorf("Incorrect match for %q: should be matched", tc) + } + } + + for _, tc := range dontMatch { + if ign.Match(tc) { + t.Errorf("Incorrect match for %q: should not be matched", tc) + } + } +}