Browse Source

Allow leading literal '#' and '!' in ignore rules if they are escaped

According to [1] backslash can escape leading special characters '#' and
'!' in ignore rules, so that they are treated literally.

[1] https://www.kernel.org/pub/software/scm/git/docs/gitignore.html

Bug: 463581
Change-Id: I4c02927413a9c63ea5dbf2954877080d902ec1b2
Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
stable-4.1
Andrey Loskutov 10 years ago committed by Matthias Sohn
parent
commit
08641ea413
  1. 12
      org.eclipse.jgit.test/tst/org/eclipse/jgit/ignore/IgnoreRuleSpecialCasesTest.java
  2. 11
      org.eclipse.jgit/src/org/eclipse/jgit/ignore/FastIgnoreRule.java

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

@ -835,6 +835,18 @@ public class IgnoreRuleSpecialCasesTest {
assertMatch("a\\\\b", "a\\b", true);
}
@Test
public void testEscapedExclamationMark() throws Exception {
assertMatch("\\!b!.txt", "!b!.txt", true);
assertMatch("a\\!b!.txt", "a\\!b!.txt", true);
}
@Test
public void testEscapedHash() throws Exception {
assertMatch("\\#b", "#b", true);
assertMatch("a\\#", "a\\#", true);
}
@Test
public void testEscapedTrailingSpaces() throws Exception {
assertMatch("\\ ", " ", true);

11
org.eclipse.jgit/src/org/eclipse/jgit/ignore/FastIgnoreRule.java

@ -98,7 +98,15 @@ public class FastIgnoreRule {
if (pattern.charAt(0) == '#') {
this.matcher = NO_MATCH;
dirOnly = false;
} else {
return;
}
if (pattern.charAt(0) == '\\' && pattern.length() > 1) {
char next = pattern.charAt(1);
if (next == '!' || next == '#') {
// remove backslash escaping first special characters
pattern = pattern.substring(1);
}
}
dirOnly = pattern.charAt(pattern.length() - 1) == PATH_SEPARATOR;
if (dirOnly) {
pattern = stripTrailing(pattern, PATH_SEPARATOR);
@ -116,7 +124,6 @@ public class FastIgnoreRule {
}
this.matcher = m;
}
}
/**
* Returns true if a match was made. <br>

Loading…
Cancel
Save