Browse Source

Properly support special regex characters in ignore rules

Ignore rules should escape $^(){}+| chars if using regular expressions,
because they should be treated literally if they aren't part of a
character group.

Bug: 478055
Change-Id: Ic7276442d7f8f02594b85eae1ef697362e62d3bd
Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
stable-4.1
Andrey Loskutov 9 years ago
parent
commit
97ef1fe893
  1. 78
      org.eclipse.jgit.test/tst/org/eclipse/jgit/ignore/IgnoreRuleSpecialCasesTest.java
  2. 16
      org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/Strings.java

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

@ -868,6 +868,84 @@ public class IgnoreRuleSpecialCasesTest {
assertMatch("\\]a?c\\*\\[d\\?\\]", "]abc*[d?]", true); assertMatch("\\]a?c\\*\\[d\\?\\]", "]abc*[d?]", true);
} }
@Test
public void testDollar() throws Exception {
assertMatch("$", "$", true);
assertMatch("$x", "$x", true);
assertMatch("$x", "x$", false);
assertMatch("$x", "$", false);
assertMatch("$x.*", "$x.a", true);
assertMatch("*$", "x$", true);
assertMatch("*.$", "x.$", true);
assertMatch("$*x", "$ax", true);
assertMatch("x*$", "xa$", true);
assertMatch("x*$", "xa", false);
assertMatch("[a$b]", "$", true);
}
@Test
public void testCaret() throws Exception {
assertMatch("^", "^", true);
assertMatch("^x", "^x", true);
assertMatch("^x", "x^", false);
assertMatch("^x", "^", false);
assertMatch("^x.*", "^x.a", true);
assertMatch("*^", "x^", true);
assertMatch("*.^", "x.^", true);
assertMatch("x*^", "xa^", true);
assertMatch("^*x", "^ax", true);
assertMatch("^*x", "ax", false);
assertMatch("[a^b]", "^", true);
}
@Test
public void testPlus() throws Exception {
assertMatch("+", "+", true);
assertMatch("+x", "+x", true);
assertMatch("+x", "x+", false);
assertMatch("+x", "+", false);
assertMatch("x+", "xx", false);
assertMatch("+x.*", "+x.a", true);
assertMatch("*+", "x+", true);
assertMatch("*.+", "x.+", true);
assertMatch("x*+", "xa+", true);
assertMatch("+*x", "+ax", true);
assertMatch("+*x", "ax", false);
assertMatch("[a+b]", "+", true);
}
@Test
public void testPipe() throws Exception {
assertMatch("|", "|", true);
assertMatch("|x", "|x", true);
assertMatch("|x", "x|", false);
assertMatch("|x", "|", false);
assertMatch("x|x", "xx", false);
assertMatch("x|x.*", "x|x.a", true);
assertMatch("*|", "x|", true);
assertMatch("*.|", "x.|", true);
assertMatch("x*|a", "xb|a", true);
assertMatch("b|*x", "b|ax", true);
assertMatch("b|*x", "ax", false);
assertMatch("[a|b]", "|", true);
}
@Test
public void testBrackets() throws Exception {
assertMatch("{}*()", "{}x()", true);
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);
}
@Test @Test
public void testFilePathSimpleCase() throws Exception { public void testFilePathSimpleCase() throws Exception {
assertFileNameMatch("a/b", "a/b", true); assertFileNameMatch("a/b", "a/b", true);

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

@ -247,7 +247,7 @@ public class Strings {
char[] charClass = new char[6]; char[] charClass = new char[6];
for (int i = 0; i < pattern.length(); i++) { for (int i = 0; i < pattern.length(); i++) {
char c = pattern.charAt(i); final char c = pattern.charAt(i);
switch (c) { switch (c) {
case '*': case '*':
@ -257,6 +257,20 @@ public class Strings {
sb.append('.').append(c); sb.append('.').append(c);
break; break;
case '(': // fall-through
case ')': // fall-through
case '{': // fall-through
case '}': // fall-through
case '+': // fall-through
case '$': // fall-through
case '^': // fall-through
case '|':
if (seenEscape || in_brackets > 0)
sb.append(c);
else
sb.append('\\').append(c);
break;
case '.': case '.':
if (seenEscape) if (seenEscape)
sb.append(c); sb.append(c);

Loading…
Cancel
Save