Просмотр исходного кода

Handle multiple case insensitivity prefixes in ignores (fixes #2134)

Jakob Borg 10 лет назад
Родитель
Сommit
0bfcafc5c6
2 измененных файлов с 5 добавлено и 3 удалено
  1. 4 3
      internal/fnmatch/fnmatch.go
  2. 1 0
      internal/fnmatch/fnmatch_test.go

+ 4 - 3
internal/fnmatch/fnmatch.go

@@ -38,9 +38,10 @@ func Convert(pattern string, flags int) (*regexp.Regexp, error) {
 		}
 	}
 
-	// Support case insensitive ignores
-	ignore := strings.TrimPrefix(pattern, "(?i)")
-	if ignore != pattern {
+	// Support case insensitive ignores. We do the loop because we may in some
+	// circumstances end up with multiple insensitivity prefixes
+	// ("(?i)(?i)foo"), which should be accepted.
+	for ignore := strings.TrimPrefix(pattern, "(?i)"); ignore != pattern; ignore = strings.TrimPrefix(pattern, "(?i)") {
 		flags |= CaseFold
 		pattern = ignore
 	}

+ 1 - 0
internal/fnmatch/fnmatch_test.go

@@ -54,6 +54,7 @@ var testcases = []testcase{
 
 	{"foo.txt", "foo.TXT", CaseFold, true},
 	{"(?i)foo.txt", "foo.TXT", 0, true},
+	{"(?i)(?i)foo.txt", "foo.TXT", 0, true}, // repeated prefix should be fine
 	{"(?i)**foo.txt", "/dev/tmp/foo.TXT", 0, true},
 	{"(?i)!**foo.txt", "/dev/tmp/foo.TXT", 0, false},