dir.c: git-status --ignored: don't drop ignored directories
authorKarsten Blees <karsten.blees@gmail.com>
Mon, 15 Apr 2013 19:05:19 +0000 (21:05 +0200)
committerJunio C Hamano <gitster@pobox.com>
Mon, 15 Apr 2013 19:33:58 +0000 (12:33 -0700)
'git-status --ignored' drops ignored directories if they contain untracked
files in an untracked sub directory.

Fix it by getting exact (recursive) excluded status in treat_directory.

Signed-off-by: Karsten Blees <blees@dcon.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
dir.c
t/t7061-wtstatus-ignore.sh
diff --git a/dir.c b/dir.c
index 91cfd996711f8b9523da92ff75088292e16d316c..dc3a50baf6e40cd91f4811a73618d452c69ef6ee 100644 (file)
--- a/dir.c
+++ b/dir.c
@@ -1104,6 +1104,15 @@ static enum directory_treatment treat_directory(struct dir_struct *dir,
 
        /* This is the "show_other_directories" case */
 
+       /* might be a sub directory in an excluded directory */
+       if (!exclude) {
+               struct path_exclude_check check;
+               int dt = DT_DIR;
+               path_exclude_check_init(&check, dir);
+               exclude = is_path_excluded(&check, dirname, len, &dt);
+               path_exclude_check_clear(&check);
+       }
+
        /*
         * We are looking for ignored files and our directory is not ignored,
         * check if it contains only ignored files
index 0da1214bcca439c126a0e19c664ed9230a1001fe..0f1034ed50de0467db444107b867df5629179ce5 100755 (executable)
@@ -143,4 +143,31 @@ test_expect_success 'status ignored tracked directory and uncommitted file with
        test_cmp expected actual
 '
 
+cat >expected <<\EOF
+?? .gitignore
+?? actual
+?? expected
+!! tracked/
+EOF
+
+test_expect_success 'status ignored tracked directory with uncommitted file in untracked subdir with --ignore' '
+       rm -rf tracked/uncommitted &&
+       mkdir tracked/ignored &&
+       : >tracked/ignored/uncommitted &&
+       git status --porcelain --ignored >actual &&
+       test_cmp expected actual
+'
+
+cat >expected <<\EOF
+?? .gitignore
+?? actual
+?? expected
+!! tracked/ignored/uncommitted
+EOF
+
+test_expect_success 'status ignored tracked directory with uncommitted file in untracked subdir with --ignore -u' '
+       git status --porcelain --ignored -u >actual &&
+       test_cmp expected actual
+'
+
 test_done