summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar Elijah Newren <newren@gmail.com>2021-05-12 17:28:20 +0000
committerLibravatar Junio C Hamano <gitster@pobox.com>2021-05-13 08:45:03 +0900
commitdd55fc0df15c338a8dbec6dec6ca6b58edc8acef (patch)
tree59eba3ec0924940c5c68e54c6a1820022edc0833
parentdir: avoid unnecessary traversal into ignored directory (diff)
downloadtgif-dd55fc0df15c338a8dbec6dec6ca6b58edc8acef.tar.xz
dir: traverse into untracked directories if they may have ignored subfiles
A directory that is untracked does not imply that all files under it should be categorized as untracked; in particular, if the caller is interested in ignored files, many files or directories underneath the untracked directory may be ignored. We previously partially handled this right with DIR_SHOW_IGNORED_TOO, but missed DIR_SHOW_IGNORED. It was not obvious, though, because the logic for untracked and excluded files had been fused together making it harder to reason about. The previous commit split that logic out, making it easier to notice that DIR_SHOW_IGNORED was missing. Add it. Signed-off-by: Elijah Newren <newren@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--dir.c10
-rwxr-xr-xt/t3001-ls-files-others-exclude.sh2
-rwxr-xr-xt/t7300-clean.sh2
3 files changed, 8 insertions, 6 deletions
diff --git a/dir.c b/dir.c
index 66261cf98b..ed68b7e641 100644
--- a/dir.c
+++ b/dir.c
@@ -1868,15 +1868,17 @@ static enum path_treatment treat_directory(struct dir_struct *dir,
/*
* Other than the path_recurse case above, we only need to
- * recurse into untracked directories if either of the following
+ * recurse into untracked directories if any of the following
* bits is set:
- * - DIR_SHOW_IGNORED_TOO (because then we need to determine if
- * there are ignored entries below)
+ * - DIR_SHOW_IGNORED (because then we need to determine if
+ * there are ignored entries below)
+ * - DIR_SHOW_IGNORED_TOO (same as above)
* - DIR_HIDE_EMPTY_DIRECTORIES (because we have to determine if
* the directory is empty)
*/
if (!excluded &&
- !(dir->flags & (DIR_SHOW_IGNORED_TOO |
+ !(dir->flags & (DIR_SHOW_IGNORED |
+ DIR_SHOW_IGNORED_TOO |
DIR_HIDE_EMPTY_DIRECTORIES))) {
return path_untracked;
}
diff --git a/t/t3001-ls-files-others-exclude.sh b/t/t3001-ls-files-others-exclude.sh
index ac05d1a179..516c95ea0e 100755
--- a/t/t3001-ls-files-others-exclude.sh
+++ b/t/t3001-ls-files-others-exclude.sh
@@ -292,7 +292,7 @@ EOF
test_cmp expect actual
'
-test_expect_failure 'ls-files with "**" patterns and --directory' '
+test_expect_success 'ls-files with "**" patterns and --directory' '
# Expectation same as previous test
git ls-files --directory -o -i --exclude "**/a.1" >actual &&
test_cmp expect actual
diff --git a/t/t7300-clean.sh b/t/t7300-clean.sh
index 21e48b3ba5..0399701e62 100755
--- a/t/t7300-clean.sh
+++ b/t/t7300-clean.sh
@@ -769,7 +769,7 @@ test_expect_success 'avoid traversing into ignored directories' '
test_cmp trace.expect trace.relevant
'
-test_expect_failure 'traverse into directories that may have ignored entries' '
+test_expect_success 'traverse into directories that may have ignored entries' '
test_when_finished rm -f output &&
test_create_repo need-to-traverse-into-hierarchy &&
(