# [PATCH] t7800: don't rely on reuse_worktree_file()

3 messages from 2020-01-16 to 2020-01-16. Participants: Jeff King, Johannes Schindelin, Junio C Hamano.
Thread: https://gitlist.dev/t/52650

## Jeff King, 2020-01-16 18:19

Subject: [PATCH] t7800: don't rely on reuse_worktree_file()
Message-ID: <20200116181940.GA2945961@coredump.intra.peff.net>
URL: https://gitlist.dev/e/20200116181940.GA2945961%40coredump.intra.peff.net

```
A test in t7800 tries to make sure that when git-difftool runs an
external tool that fails, it stops looking at files. Our fake failing
tool prints the file name it was asked to diff before exiting non-zero,
and then we confirm the output contains only that file.

However, this subtly relies on our internal reuse_worktree_file().
Because we're diffing between branches, the command run by difftool
might see:

  - the git-stored filename (e.g., "file"), if we decided that the
    working tree contents were up-to-date with the object in the index
    and HEAD, and we could reuse them

  - a temporary filename (e.g. "/tmp/abc123_file") if we had to dump the
    contents from the object database

If the latter case happens, then the test fails, because it's expecting
the string "file". I discovered this when debugging something unrelated
with reuse_worktree_file(). I _thought_ it should be able to be
triggered by a racy-git situation, but running:

  ./t7800-difftool.sh --stress --run=2,13

never seems to fail. However, by my reading of reuse_worktree_file(),
this would probably always fail under Cygwin, because it sets
NO_FAST_WORKING_DIRECTORY. At any rate, since reuse_worktree_file()
is meant to be an optimization that may or may not trigger, our test
should be robust either way.

Instead of checking the filename, let's just make sure we got a single
line of output (which would not be true if we continued after the first
failure).

Signed-off-by: Jeff King <peff@peff.net>
---
 t/t7800-difftool.sh | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/t/t7800-difftool.sh b/t/t7800-difftool.sh
index 6bac9ed180..29b92907e2 100755
--- a/t/t7800-difftool.sh
+++ b/t/t7800-difftool.sh
@@ -125,15 +125,14 @@ test_expect_success 'difftool stops on error with --trust-exit-code' '
 	test_when_finished "rm -f for-diff .git/fail-right-file" &&
 	test_when_finished "git reset -- for-diff" &&
 	write_script .git/fail-right-file <<-\EOF &&
-	echo "$2"
+	echo failed
 	exit 1
 	EOF
 	>for-diff &&
 	git add for-diff &&
-	echo file >expect &&
 	test_must_fail git difftool -y --trust-exit-code \
 		--extcmd .git/fail-right-file branch >actual &&
-	test_cmp expect actual
+	test_line_count = 1 actual
 '
 
 test_expect_success 'difftool honors exit status if command not found' '
-- 
2.25.0.318.gee4019ba55

```

## Johannes Schindelin, 2020-01-16 21:08

Subject: Re: [PATCH] t7800: don't rely on reuse_worktree_file()
Message-ID: <nycvar.QRO.7.76.6.2001162207220.46@tvgsbejvaqbjf.bet>
URL: https://gitlist.dev/e/nycvar.QRO.7.76.6.2001162207220.46%40tvgsbejvaqbjf.bet
In-Reply-To: <20200116181940.GA2945961@coredump.intra.peff.net>

```
Hi Peff,

On Thu, 16 Jan 2020, Jeff King wrote:

> A test in t7800 tries to make sure that when git-difftool runs an
> external tool that fails, it stops looking at files. Our fake failing
> tool prints the file name it was asked to diff before exiting non-zero,
> and then we confirm the output contains only that file.
>
> However, this subtly relies on our internal reuse_worktree_file().
> Because we're diffing between branches, the command run by difftool
> might see:
>
>   - the git-stored filename (e.g., "file"), if we decided that the
>     working tree contents were up-to-date with the object in the index
>     and HEAD, and we could reuse them
>
>   - a temporary filename (e.g. "/tmp/abc123_file") if we had to dump the
>     contents from the object database
>
> If the latter case happens, then the test fails, because it's expecting
> the string "file". I discovered this when debugging something unrelated
> with reuse_worktree_file(). I _thought_ it should be able to be
> triggered by a racy-git situation, but running:
>
>   ./t7800-difftool.sh --stress --run=2,13
>
> never seems to fail. However, by my reading of reuse_worktree_file(),
> this would probably always fail under Cygwin, because it sets
> NO_FAST_WORKING_DIRECTORY. At any rate, since reuse_worktree_file()
> is meant to be an optimization that may or may not trigger, our test
> should be robust either way.
>
> Instead of checking the filename, let's just make sure we got a single
> line of output (which would not be true if we continued after the first
> failure).
>
> Signed-off-by: Jeff King <peff@peff.net>
> ---

The reasoning and the patch seem sound to me.

Thanks,
Dscho

>  t/t7800-difftool.sh | 5 ++---
>  1 file changed, 2 insertions(+), 3 deletions(-)
>
> diff --git a/t/t7800-difftool.sh b/t/t7800-difftool.sh
> index 6bac9ed180..29b92907e2 100755
> --- a/t/t7800-difftool.sh
> +++ b/t/t7800-difftool.sh
> @@ -125,15 +125,14 @@ test_expect_success 'difftool stops on error with --trust-exit-code' '
>  	test_when_finished "rm -f for-diff .git/fail-right-file" &&
>  	test_when_finished "git reset -- for-diff" &&
>  	write_script .git/fail-right-file <<-\EOF &&
> -	echo "$2"
> +	echo failed
>  	exit 1
>  	EOF
>  	>for-diff &&
>  	git add for-diff &&
> -	echo file >expect &&
>  	test_must_fail git difftool -y --trust-exit-code \
>  		--extcmd .git/fail-right-file branch >actual &&
> -	test_cmp expect actual
> +	test_line_count = 1 actual
>  '
>
>  test_expect_success 'difftool honors exit status if command not found' '
> --
> 2.25.0.318.gee4019ba55
>

```

## Junio C Hamano, 2020-01-16 22:48

Subject: Re: [PATCH] t7800: don't rely on reuse_worktree_file()
Message-ID: <xmqqo8v3f26k.fsf@gitster-ct.c.googlers.com>
URL: https://gitlist.dev/e/xmqqo8v3f26k.fsf%40gitster-ct.c.googlers.com
In-Reply-To: <20200116181940.GA2945961@coredump.intra.peff.net>

```
Jeff King <peff@peff.net> writes:

> ... At any rate, since reuse_worktree_file()
> is meant to be an optimization that may or may not trigger, our test
> should be robust either way.
>
> Instead of checking the filename, let's just make sure we got a single
> line of output (which would not be true if we continued after the first
> failure).

Makes sense.  Thanks for spotting.

> Signed-off-by: Jeff King <peff@peff.net>
> ---
>  t/t7800-difftool.sh | 5 ++---
>  1 file changed, 2 insertions(+), 3 deletions(-)
>
> diff --git a/t/t7800-difftool.sh b/t/t7800-difftool.sh
> index 6bac9ed180..29b92907e2 100755
> --- a/t/t7800-difftool.sh
> +++ b/t/t7800-difftool.sh
> @@ -125,15 +125,14 @@ test_expect_success 'difftool stops on error with --trust-exit-code' '
>  	test_when_finished "rm -f for-diff .git/fail-right-file" &&
>  	test_when_finished "git reset -- for-diff" &&
>  	write_script .git/fail-right-file <<-\EOF &&
> -	echo "$2"
> +	echo failed
>  	exit 1
>  	EOF
>  	>for-diff &&
>  	git add for-diff &&
> -	echo file >expect &&
>  	test_must_fail git difftool -y --trust-exit-code \
>  		--extcmd .git/fail-right-file branch >actual &&
> -	test_cmp expect actual
> +	test_line_count = 1 actual
>  '
>  
>  test_expect_success 'difftool honors exit status if command not found' '

```
