status: do not get confused by submodules in excluded directories

We meticulously pass the `exclude` flag to the `treat_directory()` function so that we can indicate that files in it are excluded rather than untracked when recursing. But we did not yet treat submodules the same way. Because of that, `git status --ignored --untracked` with a submodule `submodule` in a gitignored `tracked/` would show the submodule in the "Untracked files" section, e.g. On branch master Untracked files: (use "git add <file>..." to include in what will be committed) tracked/submodule/ Ignored files: (use "git add -f <file>..." to include in what will be committed) tracked/submodule/initial.t Instead, we would want it to show the submodule in the "Ignored files" section: On branch master Ignored files: (use "git add -f <file>..." to include in what will be committed) tracked/submodule/ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Johannes Schindelin committed Oct 25, 2017 at 22:40 UTC fadb4820c4a0178ce76c24d7b48b7ea70210727a
2 files changed +12 -1
dir.c
+1 -1
@@ -1362,7 +1362,7 @@ static enum path_treatment treat_directory(struct dir_struct *dir,
1362 if (!(dir->flags & DIR_NO_GITLINKS)) {
1363 unsigned char sha1[20];
1364 if (resolve_gitlink_ref(dirname, "HEAD", sha1) == 0)
1365 - return path_untracked;
1365 + return exclude ? path_excluded : path_untracked;
1366 }
1367 return path_recurse;
1368 }
t/t7061-wtstatus-ignore.sh
+11
@@ -272,4 +272,15 @@ test_expect_success 'status ignored tracked directory with uncommitted file in t
272 test_cmp expected actual
273 '
274
275 +cat >expected <<\EOF
276 +!! tracked/submodule/
277 +EOF
278 +
279 +test_expect_success 'status ignores submodule in excluded directory' '
280 + git init tracked/submodule &&
281 + test_commit -C tracked/submodule initial &&
282 + git status --porcelain --ignored -u tracked/submodule >actual &&
283 + test_cmp expected actual
284 +'
285 +
286 test_done