"Elijah Newren via GitGitGadget" [off-list ref] writes:
+test_expect_failure 'avoid traversing into ignored directories' '
+ test_when_finished rm -f output error trace.* &&
+ test_create_repo avoid-traversing-deep-hierarchy &&
+ (
+ cd avoid-traversing-deep-hierarchy &&
+
+ mkdir -p untracked/subdir/with/a &&
+ >untracked/subdir/with/a/random-file.txt &&
+
+ GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \
+ git clean -ffdxn -e untracked
+ ) &&
+
+ grep data.*read_directo.*visited trace.output \
+ | cut -d "|" -f 9 >trace.relevant &&
+ cat >trace.expect <<-EOF &&
+ directories-visited:1
+ paths-visited:4
Are the origins of '1' and '4' trivially obvious to those who are
reading the test, or do these deserve comments?
We create an empty test repository, go there and create a untracked/
hierarchy with a junk file, and tell "clean" that 'untracked' is
"also" in the exclude pattern (but since there is no other exclude
pattern, that is the only one), so everything underneath untracked/
we have no reason to inspect.
So, we do not visit 'untracked' directory. Which ones do we visit?
Is '1' coming from the top-level of the working tree '.'? What
about the number of visited paths '4' (the trace is stored outside
this new test repository, so that's not it).
Thanks.
+ EOF
+ test_cmp trace.expect trace.relevant
+'
+
test_done
On Sun, May 9, 2021 at 10:28 PM Junio C Hamano [off-list ref] wrote:
"Elijah Newren via GitGitGadget" [off-list ref] writes:
quoted
+test_expect_failure 'avoid traversing into ignored directories' '
+ test_when_finished rm -f output error trace.* &&
+ test_create_repo avoid-traversing-deep-hierarchy &&
+ (
+ cd avoid-traversing-deep-hierarchy &&
+
+ mkdir -p untracked/subdir/with/a &&
+ >untracked/subdir/with/a/random-file.txt &&
+
+ GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \
+ git clean -ffdxn -e untracked
+ ) &&
+
+ grep data.*read_directo.*visited trace.output \
+ | cut -d "|" -f 9 >trace.relevant &&
+ cat >trace.expect <<-EOF &&
+ directories-visited:1
+ paths-visited:4
Are the origins of '1' and '4' trivially obvious to those who are
reading the test, or do these deserve comments?
We create an empty test repository, go there and create a untracked/
hierarchy with a junk file, and tell "clean" that 'untracked' is
"also" in the exclude pattern (but since there is no other exclude
pattern, that is the only one), so everything underneath untracked/
we have no reason to inspect.
So, we do not visit 'untracked' directory. Which ones do we visit?
Is '1' coming from the top-level of the working tree '.'? What
about the number of visited paths '4' (the trace is stored outside
this new test repository, so that's not it).
Good points. I'll make a comment that directories-visited:1 is about
ensuring we only went into the toplevel directory, and I'll removed
the paths-visited check.
But to answer your question, the paths we visit are '.', '..', '.git',
and 'untracked', the first three of which we mark as path_none and
don't recurse into because of special rules for those paths, and the
last of which we shouldn't recurse into since it is ignored. There
weren't any non-directory files in the toplevel directory, or those
would also be included in the paths-visited count. A later patch in
the series will fix the code to not recurse into the 'untracked'
directory, fixing this test.