Message ID | 3e3c9c7faace505958aa01ff82bef5fad3204c67.1646127910.git.gitgitgadget@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Reduce explicit sleep calls in t7063 untracked cache tests | expand |
"Tao Klerks via GitGitGadget" <gitgitgadget@gmail.com> writes: > +chmtime_worktree_root () { > + # chmtime doesnt handle relative paths on windows, so need > + # to "hardcode" a reference to the worktree folder name. > + test-tool -C .. chmtime $1 worktree > +} > + Enclose $1 in a pair of double-quotes to help readers. They do not have to wonder if the caller is interested in (or has to worry about) triggering word splitting at $IFS if you did so. > avoid_racy() { > sleep 1 > } > @@ -90,6 +96,9 @@ test_expect_success 'setup' ' > cd worktree && > mkdir done dtwo dthree && > touch one two three done/one dtwo/two dthree/three && > + test-tool chmtime =-300 one two three done/one dtwo/two dthree/three && > + test-tool chmtime =-300 done dtwo dthree && > + chmtime_worktree_root =-300 && I am wondering if it is better to spelling it out like this: test-tool -C.. chmtime =-300 worktree && instead of hiding the fact that "../worktree" is being touched behind a one-line helper. Being able to explicitly write "worktree" in the context that this particular code path uses the "worktree" directory is a big plus, but at the same time, bypassing the helper makes it unclear why we just don't chmtime "../worktree", and will strongly tempt future developers into breaking it, so, I dunno. What's the reason why utime() works only on a path in the current directory and cannot take "../worktree" again? If we cannot solve that, I guess an extra helper with a big comment, like we see in this patch, would be the least bad solution. Thanks.
On Tue, Mar 1, 2022 at 7:03 PM Junio C Hamano <gitster@pobox.com> wrote: > > "Tao Klerks via GitGitGadget" <gitgitgadget@gmail.com> writes: > > > +chmtime_worktree_root () { > > + # chmtime doesnt handle relative paths on windows, so need > > + # to "hardcode" a reference to the worktree folder name. > > + test-tool -C .. chmtime $1 worktree > > +} > > + > > Enclose $1 in a pair of double-quotes to help readers. They do not > have to wonder if the caller is interested in (or has to worry > about) triggering word splitting at $IFS if you did so. Absolutely, thx. > > > avoid_racy() { > > sleep 1 > > } > > @@ -90,6 +96,9 @@ test_expect_success 'setup' ' > > cd worktree && > > mkdir done dtwo dthree && > > touch one two three done/one dtwo/two dthree/three && > > + test-tool chmtime =-300 one two three done/one dtwo/two dthree/three && > > + test-tool chmtime =-300 done dtwo dthree && > > + chmtime_worktree_root =-300 && > > I am wondering if it is better to spelling it out like this: > > test-tool -C.. chmtime =-300 worktree && > > instead of hiding the fact that "../worktree" is being touched > behind a one-line helper. Being able to explicitly write "worktree" > in the context that this particular code path uses the "worktree" > directory is a big plus, but at the same time, bypassing the helper > makes it unclear why we just don't chmtime "../worktree", and will > strongly tempt future developers into breaking it, so, I dunno. > > What's the reason why utime() works only on a path in the current > directory and cannot take "../worktree" again? If we cannot solve > that, I guess an extra helper with a big comment, like we see in > this patch, would be the least bad solution. > Heh. It didn't work, in my initial tests. Now it does. It turns out I was initially getting the directory handle with "FILE_WRITE_DATA | FILE_WRITE_ATTRIBUTES", and everything worked except modifying the current folder via a relative path expression, which yielded a "Permission denied" error. I worked around it by explicitly changing the current directory... Then I realized FILE_WRITE_DATA wasn't necessary (but didn't connect the dots). Then you noted the "-C .." arg to test-tool (and I still didn't connect the dots). The problem was never relative paths, but rather trying to get a writable handle to the current directory. The only reason "-C .." worked was that I already stopped trying to get a writable handle. I have no idea what it means to get a writable handle to a directory, but apparently you can't do it for your current directory. Now I know. Thanks for the nudge, this is all clean now.
diff --git a/t/t7063-status-untracked-cache.sh b/t/t7063-status-untracked-cache.sh index a0c123b0a77..eae57dc78a6 100755 --- a/t/t7063-status-untracked-cache.sh +++ b/t/t7063-status-untracked-cache.sh @@ -24,6 +24,12 @@ sync_mtime () { find . -type d -exec ls -ld {} + >/dev/null } +chmtime_worktree_root () { + # chmtime doesnt handle relative paths on windows, so need + # to "hardcode" a reference to the worktree folder name. + test-tool -C .. chmtime $1 worktree +} + avoid_racy() { sleep 1 } @@ -90,6 +96,9 @@ test_expect_success 'setup' ' cd worktree && mkdir done dtwo dthree && touch one two three done/one dtwo/two dthree/three && + test-tool chmtime =-300 one two three done/one dtwo/two dthree/three && + test-tool chmtime =-300 done dtwo dthree && + chmtime_worktree_root =-300 && git add one two done/one && : >.git/info/exclude && git update-index --untracked-cache && @@ -142,7 +151,6 @@ two EOF test_expect_success 'status first time (empty cache)' ' - avoid_racy && : >../trace.output && GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \ git status --porcelain >../actual && @@ -166,7 +174,6 @@ test_expect_success 'untracked cache after first status' ' ' test_expect_success 'status second time (fully populated cache)' ' - avoid_racy && : >../trace.output && GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \ git status --porcelain >../actual && @@ -190,8 +197,8 @@ test_expect_success 'untracked cache after second status' ' ' test_expect_success 'modify in root directory, one dir invalidation' ' - avoid_racy && : >four && + test-tool chmtime =-240 four && : >../trace.output && GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \ git status --porcelain >../actual && @@ -241,7 +248,6 @@ EOF ' test_expect_success 'new .gitignore invalidates recursively' ' - avoid_racy && echo four >.gitignore && : >../trace.output && GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \ @@ -292,7 +298,6 @@ EOF ' test_expect_success 'new info/exclude invalidates everything' ' - avoid_racy && echo three >>.git/info/exclude && : >../trace.output && GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \ @@ -520,14 +525,14 @@ test_expect_success 'create/modify files, some of which are gitignored' ' echo three >done/three && # three is gitignored echo four >done/four && # four is gitignored at a higher level echo five >done/five && # five is not gitignored - echo test >base && #we need to ensure that the root dir is touched - rm base && + test-tool chmtime =-180 done/two done/three done/four done/five done && + # we need to ensure that the root dir is touched (in the past); + chmtime_worktree_root =-180 && sync_mtime ' test_expect_success 'test sparse status with untracked cache' ' : >../trace.output && - avoid_racy && GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \ git status --porcelain >../status.actual && iuc status --porcelain >../status.iuc && @@ -570,7 +575,6 @@ EOF ' test_expect_success 'test sparse status again with untracked cache' ' - avoid_racy && : >../trace.output && GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \ git status --porcelain >../status.actual && @@ -597,11 +601,11 @@ EOF test_expect_success 'set up for test of subdir and sparse checkouts' ' mkdir done/sub && mkdir done/sub/sub && - echo "sub" > done/sub/sub/file + echo "sub" > done/sub/sub/file && + test-tool chmtime =-120 done/sub/sub/file done/sub/sub done/sub done ' test_expect_success 'test sparse status with untracked cache and subdir' ' - avoid_racy && : >../trace.output && GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \ git status --porcelain >../status.actual && @@ -651,7 +655,6 @@ EOF ' test_expect_success 'test sparse status again with untracked cache and subdir' ' - avoid_racy && : >../trace.output && GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \ git status --porcelain >../status.actual &&