dir.c: make 'git-status --ignored' work within leading directories
[gitweb.git] / dir.c
diff --git a/dir.c b/dir.c
index 15d7277a0281bdaf631b2b3cc49dcfbe2ae0fa04..fd4aeae3e7aeeceda50b16f6707ac77d12d96ffb 100644 (file)
--- a/dir.c
+++ b/dir.c
@@ -1115,7 +1115,7 @@ static enum directory_treatment treat_directory(struct dir_struct *dir,
 
        /*
         * We are looking for ignored files and our directory is not ignored,
-        * check if it contains only ignored files
+        * check if it contains untracked files (i.e. is listed as untracked)
         */
        if ((dir->flags & DIR_SHOW_IGNORED) && !exclude) {
                int ignored;
@@ -1123,7 +1123,8 @@ static enum directory_treatment treat_directory(struct dir_struct *dir,
                ignored = read_directory_recursive(dir, dirname, len, 1, simplify);
                dir->flags |= DIR_SHOW_IGNORED;
 
-               return ignored ? ignore_directory : show_directory;
+               if (ignored)
+                       return ignore_directory;
        }
 
        if (!(dir->flags & DIR_HIDE_EMPTY_DIRECTORIES))
@@ -1446,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);
@@ -1474,6 +1477,7 @@ static int treat_leading_path(struct dir_struct *dir,
                }
        }
        strbuf_release(&sb);
+       dir->flags = old_flags;
        return rc;
 }