git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 1/3] t/t3430: avoid undocumented git diff behavior

From
Junio C Hamano <gitster@pobox.com>
Date
Jun 9, 2020, 05:18 UTC
Message-ID
<xmqqr1uoizqc.fsf@gitster.c.googlers.com>
In-Reply-To
<414163bbc3cbdda241bedc7bc4dfb8b493071dcb.1591661021.git.gitgitgadget@gmail.com>
"Chris Torek via GitGitGadget" <gitgitgadget@gmail.com> writes:
Show 10 quoted lines
> From: Chris Torek <chris.torek@gmail.com>
>
> According to the documentation, "git diff" takes at most two commit-ish,
> or an A..B style range, or an A...B style symmetric difference range.
> The autosquash-and-exec test relied on "git diff HEAD^!", which works
> fine for ordinary commits as the revision parse produces two commit-ish,
> namely ^HEAD^ and HEAD.
>
> For merge commits, however, this test makes use of an undocumented
> feature:
s/undocumented feature/undefined behaviour/;

The show.sh scripts wants to compute the diff against first parent, and it uses a range notation HEAD^! which happens to mean HEAD^..HEAD for a single parent commit, but it forgets that the commit it may get fed could be a merge. What the code happens to do when given "git diff ^HEAD^2 HEAD^..HEAD" is undefined behaviour and does not even ...

Show 6 quoted lines
> the resulting revision parse has all the parents as UNINTERESTING
> followed by the HEAD commit.  This looks identical to a symmetric
> diff parse, which lists the merge bases as UNINTERESTING, followed by
> the A (UNINTERESTING) and B revs.  So the diff winds up treating it
> as one, using the first oid (i.e., HEAD^) and the last (i.e., HEAD).
> The documentation, however, says nothing about this usage.
...deserve to be explained in a paragraph like this, I would think.
> Since diff actually just uses HEAD^ and HEAD, call for these directly
> here.  That makes it possible to improve the diff code's handling of
> symmetric difference arguments.
Yes, the resulting code expresses the intent much better.
Show 19 quoted lines
>
> Signed-off-by: Chris Torek <chris.torek@gmail.com>
> ---
>  t/t3430-rebase-merges.sh | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/t/t3430-rebase-merges.sh b/t/t3430-rebase-merges.sh
> index a1bc3e20016..b454f400ebd 100755
> --- a/t/t3430-rebase-merges.sh
> +++ b/t/t3430-rebase-merges.sh
> @@ -420,7 +420,7 @@ test_expect_success 'with --autosquash and --exec' '
>  	git commit --fixup B B.t &&
>  	write_script show.sh <<-\EOF &&
>  	subject="$(git show -s --format=%s HEAD)"
> -	content="$(git diff HEAD^! | tail -n 1)"
> +	content="$(git diff HEAD^ HEAD | tail -n 1)"
>  	echo "$subject: $content"
>  	EOF
>  	test_tick &&
Previous: Chris Torek via GitGitGadgetNext: Chris Torek via GitGitGadget
Message 7 of 26 in “improve git-diff documentation and A...B handling”
  1. 0/3 improve git-diff documentation and A...B handlingChris Torek via GitGitGadget, Jun 9, 2020
  2. 2/3 git diff: improve A...B merge-base handlingChris Torek via GitGitGadget, Jun 9, 2020
  3. Junio C HamanoJun 9, 2020
  4. Philip OakleyJun 12, 2020
  5. Junio C HamanoJun 12, 2020
  6. 1/3 t/t3430: avoid undocumented git diff behaviorChris Torek via GitGitGadget, Jun 9, 2020
  7. Junio C HamanoJun 9, 2020
  8. 3/3 Documentation: tweak git diff help slightlyChris Torek via GitGitGadget, Jun 9, 2020
  9. Junio C HamanoJun 9, 2020
  10. 0/3 improve git-diff documentation and A...B handlingChris Torek via GitGitGadget, Jun 9, 2020
  11. 1/3 t/t3430: avoid undefined git diff behaviorChris Torek via GitGitGadget, Jun 9, 2020
  12. 2/3 git diff: improve A...B merge-base handlingChris Torek via GitGitGadget, Jun 9, 2020
  13. Junio C HamanoJun 9, 2020
  14. 3/3 Documentation: tweak git diff help slightlyChris Torek via GitGitGadget, Jun 9, 2020
  15. Junio C HamanoJun 9, 2020
  16. 0/3 improve git-diff documentation and A...B handlingChris Torek via GitGitGadget, Jun 11, 2020
  17. 1/3 t/t3430: avoid undefined git diff behaviorChris Torek via GitGitGadget, Jun 11, 2020
  18. 2/3 git diff: improve range handlingChris Torek via GitGitGadget, Jun 11, 2020
  19. Chris TorekJun 11, 2020
  20. 3/3 Documentation: usage for diff combined commitsChris Torek via GitGitGadget, Jun 11, 2020
  21. 0/3 improve git-diff documentation and A...B handlingChris Torek via GitGitGadget, Jun 12, 2020
  22. 1/3 t/t3430: avoid undefined git diff behaviorChris Torek via GitGitGadget, Jun 12, 2020
  23. 2/3 git diff: improve range handlingChris Torek via GitGitGadget, Jun 12, 2020
  24. Junio C HamanoJun 12, 2020
  25. Chris TorekJun 12, 2020
  26. 3/3 Documentation: usage for diff combined commitsChris Torek via GitGitGadget, Jun 12, 2020

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.