Browse Source

[ignore rules] fix for handling unmatched '[' brackets

This patch makes JGit parsing of ignore rules containing unmatched '['
bracket compatible to the Git CLI.

Since '[' starts character group, Git tries to parse the ignore rule as
a shell glob pattern and if the character group is not closed, the glob
pattern is invalid and so the ignore rule never matches anything.

See also http://article.gmane.org/gmane.comp.version-control.git/278699.

Bug: 478490
Change-Id: I734a4d14fcdd721070e3f75d57e33c2c0700d503
Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
stable-4.2
Andrey Loskutov 9 years ago
parent
commit
1a2b4e246d
  1. 1
      org.eclipse.jgit.test/tst/org/eclipse/jgit/ignore/FastIgnoreRuleTest.java
  2. 55
      org.eclipse.jgit.test/tst/org/eclipse/jgit/ignore/IgnoreRuleSpecialCasesTest.java
  3. 4
      org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/Strings.java

1
org.eclipse.jgit.test/tst/org/eclipse/jgit/ignore/FastIgnoreRuleTest.java

@ -54,6 +54,7 @@ public class FastIgnoreRuleTest {
@Test @Test
public void testSimpleCharClass() { public void testSimpleCharClass() {
assertMatched("][a]", "]a");
assertMatched("[a]", "a"); assertMatched("[a]", "a");
assertMatched("][a]", "]a"); assertMatched("][a]", "]a");
assertMatched("[a]", "a/"); assertMatched("[a]", "a/");

55
org.eclipse.jgit.test/tst/org/eclipse/jgit/ignore/IgnoreRuleSpecialCasesTest.java

@ -768,7 +768,7 @@ public class IgnoreRuleSpecialCasesTest {
@Test @Test
public void testSpecialGroupCase9() throws Exception { public void testSpecialGroupCase9() throws Exception {
assertMatch("][", "][", true); assertMatch("][", "][", false);
} }
@Test @Test
@ -968,6 +968,59 @@ public class IgnoreRuleSpecialCasesTest {
assertMatch("[a{}()b][a{}()b]?[a{}()b][a{}()b]", "{}x()", true); assertMatch("[a{}()b][a{}()b]?[a{}()b][a{}()b]", "{}x()", true);
assertMatch("x*{x}3", "xa{x}3", true); assertMatch("x*{x}3", "xa{x}3", true);
assertMatch("a*{x}3", "axxx", false); assertMatch("a*{x}3", "axxx", false);
assertMatch("?", "[", true);
assertMatch("*", "[", true);
// Escaped bracket matches, but see weird things below...
assertMatch("\\[", "[", true);
}
/**
* The ignore rules here <b>do not match</b> 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 @Test

4
org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/Strings.java

@ -141,9 +141,7 @@ public class Strings {
private static boolean isComplexWildcard(String pattern) { private static boolean isComplexWildcard(String pattern) {
int idx1 = pattern.indexOf('['); int idx1 = pattern.indexOf('[');
if (idx1 != -1) { if (idx1 != -1) {
int idx2 = pattern.indexOf(']', idx1); return true;
if (idx2 > idx1)
return true;
} }
if (pattern.indexOf('?') != -1) { if (pattern.indexOf('?') != -1) {
return true; return true;

Loading…
Cancel
Save