dir: recurse into untracked dirs for ignored files
authorSamuel Lijin <sxlijin@gmail.com>
Thu, 18 May 2017 08:21:51 +0000 (04:21 -0400)
committerJunio C Hamano <gitster@pobox.com>
Mon, 22 May 2017 03:06:52 +0000 (12:06 +0900)
We consider directories containing only untracked and ignored files to
be themselves untracked, which in the usual case means we don't have to
search these directories. This is problematic when we want to collect
ignored files with DIR_SHOW_IGNORED_TOO, though, so we teach
read_directory_recursive() to recurse into untracked directories to find
the ignored files they contain when DIR_SHOW_IGNORED_TOO is set. This
has the side effect of also collecting all untracked files in untracked
directories as well.

Signed-off-by: Samuel Lijin <sxlijin@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
dir.c
diff --git a/dir.c b/dir.c
index aeeb5ce10490ef1e0adb907d1e21bcbbbbb401ac..6b4eeef584309fb31fdf2fac78e220f990344b9a 100644 (file)
--- a/dir.c
+++ b/dir.c
@@ -1747,7 +1747,10 @@ static enum path_treatment read_directory_recursive(struct dir_struct *dir,
                        dir_state = state;
 
                /* recurse into subdir if instructed by treat_path */
-               if (state == path_recurse) {
+               if ((state == path_recurse) ||
+                       ((state == path_untracked) &&
+                        (dir->flags & DIR_SHOW_IGNORED_TOO) &&
+                        (get_dtype(cdir.de, path.buf, path.len) == DT_DIR))) {
                        struct untracked_cache_dir *ud;
                        ud = lookup_untracked(dir->untracked, untracked,
                                              path.buf + baselen,