diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/ignore/FastIgnoreRuleTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/ignore/FastIgnoreRuleTest.java index 2c04787e3..480e32650 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/ignore/FastIgnoreRuleTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/ignore/FastIgnoreRuleTest.java @@ -54,6 +54,7 @@ public class FastIgnoreRuleTest { @Test public void testSimpleCharClass() { + assertMatched("][a]", "]a"); assertMatched("[a]", "a"); assertMatched("][a]", "]a"); assertMatched("[a]", "a/"); diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/ignore/IgnoreRuleSpecialCasesTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/ignore/IgnoreRuleSpecialCasesTest.java index f8eb12682..567f3d866 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/ignore/IgnoreRuleSpecialCasesTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/ignore/IgnoreRuleSpecialCasesTest.java @@ -768,7 +768,7 @@ public class IgnoreRuleSpecialCasesTest { @Test public void testSpecialGroupCase9() throws Exception { - assertMatch("][", "][", true); + assertMatch("][", "][", false); } @Test @@ -968,6 +968,59 @@ public class IgnoreRuleSpecialCasesTest { assertMatch("[a{}()b][a{}()b]?[a{}()b][a{}()b]", "{}x()", true); assertMatch("x*{x}3", "xa{x}3", true); assertMatch("a*{x}3", "axxx", false); + + assertMatch("?", "[", true); + assertMatch("*", "[", true); + + // Escaped bracket matches, but see weird things below... + assertMatch("\\[", "[", true); + } + + /** + * The ignore rules here do not match any paths because single '[' + * begins character group and the entire rule cannot be parsed due the + * invalid glob pattern. See + * http://article.gmane.org/gmane.comp.version-control.git/278699. + * + * @throws Exception + */ + @Test + public void testBracketsUnmatched1() throws Exception { + assertMatch("[", "[", false); + assertMatch("[*", "[", false); + assertMatch("*[", "[", false); + assertMatch("*[", "a[", false); + assertMatch("[a][", "a[", false); + assertMatch("*[", "a", false); + assertMatch("[a", "a", false); + assertMatch("[*", "a", false); + assertMatch("[*a", "a", false); + } + + /** + * Single ']' is treated here literally, not as an and of a character group + * + * @throws Exception + */ + @Test + public void testBracketsUnmatched2() throws Exception { + assertMatch("*]", "a", false); + assertMatch("]a", "a", false); + assertMatch("]*", "a", false); + assertMatch("]*a", "a", false); + + assertMatch("]", "]", true); + assertMatch("]*", "]", true); + assertMatch("]*", "]a", true); + assertMatch("*]", "]", true); + assertMatch("*]", "a]", true); + } + + @Test + public void testBracketsRandom() throws Exception { + assertMatch("[\\]", "[$0+//r4a\\d]", false); + assertMatch("[:]]sZX]", "[:]]sZX]", false); + assertMatch("[:]]:]]]", "[:]]:]]]", false); } @Test diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/Strings.java b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/Strings.java index f972828bc..e354c7114 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/Strings.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/Strings.java @@ -141,9 +141,7 @@ public class Strings { private static boolean isComplexWildcard(String pattern) { int idx1 = pattern.indexOf('['); if (idx1 != -1) { - int idx2 = pattern.indexOf(']', idx1); - if (idx2 > idx1) - return true; + return true; } if (pattern.indexOf('?') != -1) { return true;