Browse Source

Strings#convertGlob: fix escaping of patterns like [\[].

Originally the patterns were escaped twice leading
to wrong matching results.

Bug: 528886
Change-Id: I26e201b4b0ef51cac08f940b76f381260fa925ca
Signed-off-by: Dmitry Pavlenko <pavlenko@tmatesoft.com>
Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
stable-4.9
Dmitry Pavlenko 7 years ago committed by David Pursehouse
parent
commit
279eaf0690
  1. 33
      org.eclipse.jgit.test/tst/org/eclipse/jgit/attributes/AttributesMatcherTest.java
  2. 8
      org.eclipse.jgit.test/tst/org/eclipse/jgit/attributes/CGitAttributesTest.java
  3. 27
      org.eclipse.jgit.test/tst/org/eclipse/jgit/ignore/CGitIgnoreTest.java
  4. 5
      org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/Strings.java

33
org.eclipse.jgit.test/tst/org/eclipse/jgit/attributes/AttributesMatcherTest.java

@ -382,6 +382,39 @@ public class AttributesMatcherTest {
assertEquals(r.getAttributes().get(2).toString(), "attribute3=value"); assertEquals(r.getAttributes().get(2).toString(), "attribute3=value");
} }
@Test
public void testBracketsInGroup() {
//combinations of brackets in brackets, escaped and not
String[] patterns = new String[]{"[[\\]]", "[\\[\\]]"};
for (String pattern : patterns) {
assertNotMatched(pattern, "");
assertNotMatched(pattern, "[]");
assertNotMatched(pattern, "][");
assertNotMatched(pattern, "[\\[]");
assertNotMatched(pattern, "[[]");
assertNotMatched(pattern, "[[]]");
assertNotMatched(pattern, "[\\[\\]]");
assertMatched(pattern, "[");
assertMatched(pattern, "]");
}
patterns = new String[]{"[[]]", "[\\[]]"};
for (String pattern : patterns) {
assertNotMatched(pattern, "");
assertMatched(pattern, "[]");
assertNotMatched(pattern, "][");
assertNotMatched(pattern, "[\\[]");
assertNotMatched(pattern, "[[]");
assertNotMatched(pattern, "[[]]");
assertNotMatched(pattern, "[\\[\\]]");
assertNotMatched(pattern, "[");
assertNotMatched(pattern, "]");
}
}
/** /**
* Check for a match. If target ends with "/", match will assume that the * Check for a match. If target ends with "/", match will assume that the
* target is meant to be a directory. * target is meant to be a directory.

8
org.eclipse.jgit.test/tst/org/eclipse/jgit/attributes/CGitAttributesTest.java

@ -378,4 +378,12 @@ public class CGitAttributesTest extends RepositoryTestCase {
writeTrashFile(".gitattributes", "new/ bar\n"); writeTrashFile(".gitattributes", "new/ bar\n");
assertSameAsCGit(); assertSameAsCGit();
} }
@Test
public void testBracketsInGroup() throws Exception {
createFiles("[", "]", "[]", "][", "[[]", "[]]", "[[]]");
writeTrashFile(".gitattributes", "[[]] bar1\n" + "[\\[]] bar2\n"
+ "[[\\]] bar3\n" + "[\\[\\]] bar4\n");
assertSameAsCGit();
}
} }

27
org.eclipse.jgit.test/tst/org/eclipse/jgit/ignore/CGitIgnoreTest.java

@ -241,4 +241,31 @@ public class CGitIgnoreTest extends RepositoryTestCase {
assertSameAsCGit(); assertSameAsCGit();
} }
@Test
public void testUnescapedBracketsInGroup() throws Exception {
createFiles("[", "]", "[]", "][", "[[]", "[]]", "[[]]");
writeTrashFile(".gitignore", "[[]]\n");
assertSameAsCGit();
}
@Test
public void testEscapedFirstBracketInGroup() throws Exception {
createFiles("[", "]", "[]", "][", "[[]", "[]]", "[[]]");
writeTrashFile(".gitignore", "[\\[]]\n");
assertSameAsCGit();
}
@Test
public void testEscapedSecondBracketInGroup() throws Exception {
createFiles("[", "]", "[]", "][", "[[]", "[]]", "[[]]");
writeTrashFile(".gitignore", "[[\\]]\n");
assertSameAsCGit();
}
@Test
public void testEscapedBothBracketsInGroup() throws Exception {
createFiles("[", "]", "[]", "][", "[[]", "[]]", "[[]]");
writeTrashFile(".gitignore", "[\\[\\]]\n");
assertSameAsCGit();
}
} }

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

@ -363,7 +363,10 @@ public class Strings {
case '[': case '[':
if (in_brackets > 0) { if (in_brackets > 0) {
sb.append('\\').append('['); if (!seenEscape) {
sb.append('\\');
}
sb.append('[');
ignoreLastBracket = true; ignoreLastBracket = true;
} else { } else {
if (!seenEscape) { if (!seenEscape) {

Loading…
Cancel
Save