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

[PATCH v2 2/2] format-patch: move range/inter diff at the end of a single patch output

From
Junio C Hamano <gitster@pobox.com>
Date
May 24, 2024, 23:02 UTC
Message-ID
<xmqqed9qke3k.fsf_-_@gitster.g>
In-Reply-To
<20240523225007.2871766-3-gitster@pobox.com>

When running "format-patch" on a multiple patch series, the output coming from "--interdiff" and "--range-diff" options is inserted after the "shortlog" list of commits and the overall diffstat.

The idea is that shortlog/diffstat are shorter and with denser information content, which gives a better overview before the readers dive into more details of range/inter diff.

When working on a single patch, however, we stuff the inter/range diff output before the actual patch, next to the diffstat. This pushes down the patch text way down with inter/range diff output, distracting readers.

Move the inter/range diff output to the very end of the output, after all the patch text is shown.

As the inter/range diff is no longer part of the commentary block (i.e., what comes after the log message and "---", but before the patch text), stop producing "---" in the function that generates them. But to separate it out visually (note: this is not needed to help tools like "git apply" that pay attention to the hunk headers to figure out the length of the hunks), add an extra blank line between the end of the patch text and the inter/range diff.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 * The [1/2] patch is not shown as it is unchanged, to pretend that
   this [2/2] is a "single patch series".  This output (except for
   this commentary) was created with
   $ git format-patch --interdiff=@{24.hours} -1
 log-tree.c              | 11 +++++------
 t/t4014-format-patch.sh | 36 ++++++++++++++++++++++++++++++------
 2 files changed, 35 insertions(+), 12 deletions(-)
diff --git a/log-tree.c b/log-tree.c
index e7cd2c491f..7de744911e 100644
--- a/log-tree.c
+++ b/log-tree.c
@@ -684,8 +684,7 @@ static void show_diff_of_diff(struct rev_info *opt)
 		memcpy(&dq, &diff_queued_diff, sizeof(diff_queued_diff));
 		DIFF_QUEUE_CLEAR(&diff_queued_diff);
 
-		next_commentary_block(opt, NULL);
-		fprintf_ln(opt->diffopt.file, "%s", opt->idiff_title);
+		fprintf_ln(opt->diffopt.file, "\n%s", opt->idiff_title);
 		show_interdiff(opt->idiff_oid1, opt->idiff_oid2, 2,
 			       &opt->diffopt);
 
@@ -704,8 +703,7 @@ static void show_diff_of_diff(struct rev_info *opt)
 		memcpy(&dq, &diff_queued_diff, sizeof(diff_queued_diff));
 		DIFF_QUEUE_CLEAR(&diff_queued_diff);
 
-		next_commentary_block(opt, NULL);
-		fprintf_ln(opt->diffopt.file, "%s", opt->rdiff_title);
+		fprintf_ln(opt->diffopt.file, "\n%s", opt->rdiff_title);
 		/*
 		 * Pass minimum required diff-options to range-diff; others
 		 * can be added later if deemed desirable.
@@ -903,8 +901,6 @@ void show_log(struct rev_info *opt)
 	strbuf_release(&msgbuf);
 	free(ctx.notes_message);
 	free(ctx.after_subject);
-
-	show_diff_of_diff(opt);
 }
 
 int log_tree_diff_flush(struct rev_info *opt)
@@ -1173,9 +1169,12 @@ int log_tree_commit(struct rev_info *opt, struct commit *commit)
 	}
 	if (opt->track_linear && !opt->linear && opt->reverse_output_stage)
 		fprintf(opt->diffopt.file, "\n%s\n", opt->break_bar);
+	if (shown)
+		show_diff_of_diff(opt);
 	opt->loginfo = NULL;
 	maybe_flush_or_die(opt->diffopt.file, "stdout");
 	opt->diffopt.no_free = no_free;
+
 	diff_free(&opt->diffopt);
 	return shown;
 }
diff --git a/t/t4014-format-patch.sh b/t/t4014-format-patch.sh
index ba85b582c5..de039825a9 100755
--- a/t/t4014-format-patch.sh
+++ b/t/t4014-format-patch.sh
@@ -2482,13 +2482,37 @@ test_expect_success 'interdiff: reroll-count with a integer' '
 '
 
 test_expect_success 'interdiff: solo-patch' '
-	cat >expect <<-\EOF &&
-	  +fleep
-
-	EOF
 	git format-patch --interdiff=boop~2 -1 boop &&
-	test_grep "^Interdiff:$" 0001-fleep.patch &&
-	sed "1,/^  @@ /d; /^$/q" 0001-fleep.patch >actual &&
+
+	# remove up to the last "patch" output line,
+	# and remove everything below the signature mark.
+	sed -e "1,/^+fleep\$/d" -e "/^-- /,\$d" 0001-fleep.patch >actual &&
+
+	# fabricate Interdiff output.
+	git diff boop~2 boop >inter &&
+	{
+		echo &&
+		echo "Interdiff:" &&
+		sed -e "s/^/  /" inter
+	} >expect &&
+	test_cmp expect actual
+'
+
+test_expect_success 'range-diff: solo-patch' '
+	git format-patch --creation-factor=999 \
+		--range-diff=boop~2..boop~1 -1 boop &&
+
+	# remove up to the last "patch" output line,
+	# and remove everything below the signature mark.
+	sed -e "1,/^+fleep\$/d" -e "/^-- /,\$d" 0001-fleep.patch >actual &&
+
+	# fabricate range-diff output.
+	{
+		echo &&
+		echo "Range-diff:" &&
+		git range-diff --creation-factor=999 \
+			boop~2..boop~1 boop~1..boop
+	} >expect &&
 	test_cmp expect actual
 '
 

Interdiff:
  diff --git a/log-tree.c b/log-tree.c
  index f28c4d0bb0..7de744911e 100644
  --- a/log-tree.c
  +++ b/log-tree.c
  @@ -684,7 +684,7 @@ static void show_diff_of_diff(struct rev_info *opt)
   		memcpy(&dq, &diff_queued_diff, sizeof(diff_queued_diff));
   		DIFF_QUEUE_CLEAR(&diff_queued_diff);
   
  -		fprintf_ln(opt->diffopt.file, "%s", opt->idiff_title);
  +		fprintf_ln(opt->diffopt.file, "\n%s", opt->idiff_title);
   		show_interdiff(opt->idiff_oid1, opt->idiff_oid2, 2,
   			       &opt->diffopt);
   
  @@ -703,7 +703,7 @@ static void show_diff_of_diff(struct rev_info *opt)
   		memcpy(&dq, &diff_queued_diff, sizeof(diff_queued_diff));
   		DIFF_QUEUE_CLEAR(&diff_queued_diff);
   
  -		fprintf_ln(opt->diffopt.file, "%s", opt->rdiff_title);
  +		fprintf_ln(opt->diffopt.file, "\n%s", opt->rdiff_title);
   		/*
   		 * Pass minimum required diff-options to range-diff; others
   		 * can be added later if deemed desirable.
  @@ -1169,11 +1169,11 @@ int log_tree_commit(struct rev_info *opt, struct commit *commit)
   	}
   	if (opt->track_linear && !opt->linear && opt->reverse_output_stage)
   		fprintf(opt->diffopt.file, "\n%s\n", opt->break_bar);
  +	if (shown)
  +		show_diff_of_diff(opt);
   	opt->loginfo = NULL;
   	maybe_flush_or_die(opt->diffopt.file, "stdout");
   	opt->diffopt.no_free = no_free;
  -	if (shown)
  -		show_diff_of_diff(opt);
   
   	diff_free(&opt->diffopt);
   	return shown;
  diff --git a/t/t4014-format-patch.sh b/t/t4014-format-patch.sh
  index c0c5eccb7c..de039825a9 100755
  --- a/t/t4014-format-patch.sh
  +++ b/t/t4014-format-patch.sh
  @@ -2491,12 +2491,31 @@ test_expect_success 'interdiff: solo-patch' '
   	# fabricate Interdiff output.
   	git diff boop~2 boop >inter &&
   	{
  +		echo &&
   		echo "Interdiff:" &&
   		sed -e "s/^/  /" inter
   	} >expect &&
   	test_cmp expect actual
   '
   
  +test_expect_success 'range-diff: solo-patch' '
  +	git format-patch --creation-factor=999 \
  +		--range-diff=boop~2..boop~1 -1 boop &&
  +
  +	# remove up to the last "patch" output line,
  +	# and remove everything below the signature mark.
  +	sed -e "1,/^+fleep\$/d" -e "/^-- /,\$d" 0001-fleep.patch >actual &&
  +
  +	# fabricate range-diff output.
  +	{
  +		echo &&
  +		echo "Range-diff:" &&
  +		git range-diff --creation-factor=999 \
  +			boop~2..boop~1 boop~1..boop
  +	} >expect &&
  +	test_cmp expect actual
  +'
  +
   test_expect_success 'format-patch does not respect diff.noprefix' '
   	git -c diff.noprefix format-patch -1 --stdout >actual &&
   	grep "^--- a/blorp" actual
-- 
2.45.1-248-g15a88ae3cc
Previous: Dragan SimicNext: Dragan Simic
Message 14 of 18 in “give range-diff at the end of single patch output”
  1. 0/2 give range-diff at the end of single patch outputJunio C Hamano, May 23, 2024
  2. 1/2 show_log: factor out interdiff/range-diff generationJunio C Hamano, May 23, 2024
  3. 2/2 format-patch: move range/inter diff at the end of a single patch outputJunio C Hamano, May 23, 2024
  4. Patrick SteinhardtMay 24, 2024
  5. Junio C HamanoMay 24, 2024
  6. Patrick SteinhardtMay 27, 2024
  7. Dragan SimicMay 27, 2024
  8. Junio C HamanoMay 27, 2024
  9. Patrick SteinhardtMay 28, 2024
  10. Junio C HamanoMay 28, 2024
  11. Patrick SteinhardtMay 29, 2024
  12. Junio C HamanoMay 29, 2024
  13. Dragan SimicMay 30, 2024
  14. 2/2 format-patch: move range/inter diff at the end of a single patch outputJunio C Hamano, May 24, 2024
  15. Dragan SimicMay 23, 2024
  16. Junio C HamanoMay 23, 2024
  17. Dragan SimicMay 23, 2024
  18. Junio C HamanoMay 24, 2024

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.