dir.c: don't exclude whole dir prematurely if neg pattern may match
commit57534ee77d22e725d971ee89c77dc6aad61c573f
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>
Mon, 21 Sep 2015 09:56:15 +0000 (21 16:56 +0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 21 Sep 2015 18:06:47 +0000 (21 11:06 -0700)
treeb39f066cd62141319d0d5d5d4279013a70d374da
parente6efecc46a34a984535e6a90e45a9db45af4eff2
dir.c: don't exclude whole dir prematurely if neg pattern may match

If there is a pattern "!foo/bar", this patch makes it not exclude "foo"
right away. This gives us a chance to examine "foo" and re-include
"foo/bar".

In order for it to detect that the directory under examination should
not be excluded right away, in other words it is a parent directory of a
negative pattern, the "directory path" of the negative pattern must be
literal. Patterns like "!f?o/bar" can't stop "foo" from being excluded.

Basename matching (i.e. "no slashes in the pattern") or must-be-dir
matching (i.e. "trailing slash in the pattern") does not work well with
this. For example, if we descend in "foo" and are examining "foo/abc",
current code for "foo/" pattern will check if path "foo/abc", not "foo",
is a directory. The same problem with basename matching. These may need
big code reorg to make it work.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/gitignore.txt
dir.c
t/t3001-ls-files-others-exclude.sh