summaryrefslogtreecommitdiff
path: root/dir.c
diff options
context:
space:
mode:
authorKarsten Blees <karsten.blees@gmail.com>2013-04-15 21:09:25 +0200
committerJunio C Hamano <gitster@pobox.com>2013-04-15 12:33:59 -0700
commitbe8a84c526691667fc04a8241d93a3de1de298ab (patch)
tree52948c528878307c7ebc8c07b65c2e5f9a569bbf /dir.c
parentc94ab010266776c85b588473260ed048d1e654ff (diff)
downloadgit-be8a84c526691667fc04a8241d93a3de1de298ab.tar.gz
dir.c: make 'git-status --ignored' work within leading directories
'git-status --ignored path/' doesn't list ignored files and directories within 'path' if some component of 'path' is classified as untracked. Disable the DIR_SHOW_OTHER_DIRECTORIES flag while traversing leading directories. This prevents treat_leading_path() with DIR_SHOW_IGNORED flag from aborting at the top level untracked directory. As a side effect, this also eliminates a recursive directory scan per leading directory level, as treat_directory() can no longer call read_directory_recursive() when called from treat_leading_path(). Signed-off-by: Karsten Blees <blees@dcon.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'dir.c')
-rw-r--r--dir.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/dir.c b/dir.c
index fecb6da0ae..fd4aeae3e7 100644
--- a/dir.c
+++ b/dir.c
@@ -1447,12 +1447,14 @@ static int treat_leading_path(struct dir_struct *dir,
struct strbuf sb = STRBUF_INIT;
int baselen, rc = 0;
const char *cp;
+ int old_flags = dir->flags;
while (len && path[len - 1] == '/')
len--;
if (!len)
return 1;
baselen = 0;
+ dir->flags &= ~DIR_SHOW_OTHER_DIRECTORIES;
while (1) {
cp = path + baselen + !!baselen;
cp = memchr(cp, '/', path + len - cp);
@@ -1475,6 +1477,7 @@ static int treat_leading_path(struct dir_struct *dir,
}
}
strbuf_release(&sb);
+ dir->flags = old_flags;
return rc;
}