dir.c: git-status --ignored: don't list empty directories as ignored

'git-status --ignored' lists empty untracked directories as ignored, even though they don't have any ignored files. When checking if a directory is already listed as untracked (i.e. shouldn't be listed as ignored as well), don't assume that the directory has only ignored files if it doesn't have untracked files, as the directory may be empty. Signed-off-by: Karsten Blees <blees@dcon.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Karsten Blees committed Apr 15, 2013 at 21:08 UTC c94ab010266776c85b588473260ed048d1e654ff
2 files changed +27 -4
dir.c
+3 -2
@@ -1115,7 +1115,7 @@ static enum directory_treatment treat_directory(struct dir_struct *dir,
1115
1116 /*
1117 * We are looking for ignored files and our directory is not ignored,
1118 - * check if it contains only ignored files
1118 + * check if it contains untracked files (i.e. is listed as untracked)
1119 */
1120 if ((dir->flags & DIR_SHOW_IGNORED) && !exclude) {
1121 int ignored;
@@ -1123,7 +1123,8 @@ static enum directory_treatment treat_directory(struct dir_struct *dir,
1123 ignored = read_directory_recursive(dir, dirname, len, 1, simplify);
1124 dir->flags |= DIR_SHOW_IGNORED;
1125
1126 - return ignored ? ignore_directory : show_directory;
1126 + if (ignored)
1127 + return ignore_directory;
1128 }
1129
1130 if (!(dir->flags & DIR_HIDE_EMPTY_DIRECTORIES))
t/t7061-wtstatus-ignore.sh
+24 -2
@@ -64,13 +64,35 @@ cat >expected <<\EOF
64 ?? .gitignore
65 ?? actual
66 ?? expected
67 -!! untracked-ignored/
67 EOF
68
70 -test_expect_success 'status untracked directory with ignored files with --ignore' '
69 +test_expect_success 'status empty untracked directory with --ignore' '
70 rm -rf ignored &&
71 mkdir untracked-ignored &&
72 mkdir untracked-ignored/test &&
73 + git status --porcelain --ignored >actual &&
74 + test_cmp expected actual
75 +'
76 +
77 +cat >expected <<\EOF
78 +?? .gitignore
79 +?? actual
80 +?? expected
81 +EOF
82 +
83 +test_expect_success 'status empty untracked directory with --ignore -u' '
84 + git status --porcelain --ignored -u >actual &&
85 + test_cmp expected actual
86 +'
87 +
88 +cat >expected <<\EOF
89 +?? .gitignore
90 +?? actual
91 +?? expected
92 +!! untracked-ignored/
93 +EOF
94 +
95 +test_expect_success 'status untracked directory with ignored files with --ignore' '
96 : >untracked-ignored/ignored &&
97 : >untracked-ignored/test/ignored &&
98 git status --porcelain --ignored >actual &&