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>tags/v4.10.0.201712302008-r
@@ -382,6 +382,39 @@ public class AttributesMatcherTest { | |||
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 | |||
* target is meant to be a directory. |
@@ -378,4 +378,12 @@ public class CGitAttributesTest extends RepositoryTestCase { | |||
writeTrashFile(".gitattributes", "new/ bar\n"); | |||
assertSameAsCGit(); | |||
} | |||
@Test | |||
public void testBracketsInGroup() throws Exception { | |||
createFiles("[", "]", "[]", "][", "[[]", "[]]", "[[]]"); | |||
writeTrashFile(".gitattributes", "[[]] bar1\n" + "[\\[]] bar2\n" | |||
+ "[[\\]] bar3\n" + "[\\[\\]] bar4\n"); | |||
assertSameAsCGit(); | |||
} | |||
} |
@@ -241,4 +241,31 @@ public class CGitIgnoreTest extends RepositoryTestCase { | |||
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(); | |||
} | |||
} |
@@ -363,7 +363,10 @@ public class Strings { | |||
case '[': | |||
if (in_brackets > 0) { | |||
sb.append('\\').append('['); | |||
if (!seenEscape) { | |||
sb.append('\\'); | |||
} | |||
sb.append('['); | |||
ignoreLastBracket = true; | |||
} else { | |||
if (!seenEscape) { |