Code

Support "\" in non-wildcard exclusion entries
authorFinn Arne Gangstad <finnag@pvv.org>
Tue, 10 Feb 2009 14:20:17 +0000 (15:20 +0100)
committerJunio C Hamano <gitster@pobox.com>
Thu, 12 Feb 2009 19:36:43 +0000 (11:36 -0800)
"\" was treated differently in exclude rules depending on whether a
wildcard match was done. For wildcard rules, "\" was de-escaped in
fnmatch, but this was not done for other rules since they used strcmp
instead.  A file named "#foo" would not be excluded by "\#foo", but would
be excluded by "\#foo*".

We now treat all rules with "\" as wildcard rules.

Another solution could be to de-escape all non-wildcard rules as we
read them, but we would have to do the de-escaping exactly as fnmatch
does it to avoid inconsistencies.

Signed-off-by: Finn Arne Gangstad <finnag@pvv.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
dir.c
t/t3001-ls-files-others-exclude.sh

diff --git a/dir.c b/dir.c
index cfaa28ff23acb462aa0cfd54a405316320ec3bc8..04a4b9861e03739df5c048448cd5c0be28b400db 100644 (file)
--- a/dir.c
+++ b/dir.c
@@ -139,7 +139,7 @@ int match_pathspec(const char **pathspec, const char *name, int namelen, int pre
 
 static int no_wildcard(const char *string)
 {
-       return string[strcspn(string, "*?[{")] == '\0';
+       return string[strcspn(string, "*?[{\\")] == '\0';
 }
 
 void add_exclude(const char *string, const char *base,
index 8666946b025097d3e93c7853d39265429da81578..6a1711374579082000e95e39e4f6c0d572d11cd4 100755 (executable)
@@ -19,6 +19,9 @@ do
     >$dir/a.$i
   done
 done
+>"#ignore1"
+>"#ignore2"
+>"#hidden"
 
 cat >expect <<EOF
 a.2
@@ -42,6 +45,9 @@ three/a.8
 EOF
 
 echo '.gitignore
+\#ignore1
+\#ignore2*
+\#hid*n
 output
 expect
 .gitignore
@@ -79,9 +85,10 @@ test_expect_success \
        >output &&
      test_cmp expect output'
 
-cat > excludes-file << EOF
+cat > excludes-file <<\EOF
 *.[1-8]
 e*
+\#*
 EOF
 
 git config core.excludesFile excludes-file