diff --git a/fnmatch/fnmatch.go b/fnmatch/fnmatch.go index bfe18980..bf692e3d 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 7c015743..c4da0a74 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 4900fb2d..9a7a6842 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) + } + } +}