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

[PATCH 14/14] format-patch: allow --range-diff to apply to a lone-patch

From
Eric Sunshine <sunshine@sunshineco.com>
Date
Jul 22, 2018, 09:57 UTC
Message-ID
<20180722095717.17912-15-sunshine@sunshineco.com>
In-Reply-To
<20180722095717.17912-1-sunshine@sunshineco.com>

When submitting a revised version of a patch or series, it can be helpful (to reviewers) to include a summary of changes since the previous attempt in the form of a range-diff, typically in the cover letter. However, it is occasionally useful, despite making for a noisy read, to insert a range-diff into the commentary section of the lone patch of a 1-patch series.

Therefore, extend "git format-patch --range-diff=<refspec>" to insert a range-diff into the commentary section of a lone patch rather than requiring a cover letter.

Implementation note: Generating a range-diff for insertion into the commentary section of a patch which itself is currently being generated requires invoking the diffing machinery recursively. However, the machinery does not (presently) support this since it uses global state. Consequently, we need to take care to stash away the state of the in-progress operation while generating the range-diff, and restore it after.

Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
---
 Documentation/git-format-patch.txt |  3 ++-
 builtin/log.c                      |  9 +++++----
 log-tree.c                         | 15 +++++++++++++++
 3 files changed, 22 insertions(+), 5 deletions(-)
diff --git a/Documentation/git-format-patch.txt b/Documentation/git-format-patch.txt
index 9b2e172159..aba4c5febe 100644
--- a/Documentation/git-format-patch.txt
+++ b/Documentation/git-format-patch.txt
@@ -241,7 +241,8 @@ feeding the result to `git send-email`.
 
 --range-diff=<previous>::
 	As a reviewer aid, insert a range-diff (see linkgit:git-range-diff[1])
-	into the cover letter showing the differences between the previous
+	into the cover letter, or as commentary of the lone patch of a
+	1-patch series, showing the differences between the previous
 	version of the patch series and the series currently being formatted.
 	`previous` can be a single revision naming the tip of the previous
 	series if it shares a common base with the series being formatted (for
diff --git a/builtin/log.c b/builtin/log.c
index 10c3801ceb..f0e99256a0 100644
--- a/builtin/log.c
+++ b/builtin/log.c
@@ -1575,7 +1575,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
 			     N_("show changes against <rev> in cover letter or single patch"),
 			     parse_opt_object_name),
 		OPT_STRING(0, "range-diff", &rdiff_prev, N_("refspec"),
-			   N_("show changes against <refspec> in cover letter")),
+			   N_("show changes against <refspec> in cover letter or single patch")),
 		OPT_INTEGER(0, "creation-factor", &creation_factor,
 			    N_("percentage by which creation is weighted")),
 		OPT_END()
@@ -1816,8 +1816,8 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
 		die(_("--creation-factor requires --range-diff"));
 
 	if (rdiff_prev) {
-		if (!cover_letter)
-			die(_("--range-diff requires --cover-letter"));
+		if (!cover_letter && total != 1)
+			die(_("--range-diff requires --cover-letter or single patch"));
 
 		infer_range_diff_ranges(&rdiff1, &rdiff2, rdiff_prev,
 					origin, list[0]);
@@ -1866,8 +1866,9 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
 		print_signature(rev.diffopt.file);
 		total++;
 		start_number--;
-		/* interdiff in cover-letter; omit from patches */
+		/* interdiff/range-diff in cover-letter; omit from patches */
 		rev.idiff_oid1 = NULL;
+		rev.rdiff1 = NULL;
 	}
 	rev.add_signoff = do_signoff;
 
diff --git a/log-tree.c b/log-tree.c
index 56513fa83d..37afc585dc 100644
--- a/log-tree.c
+++ b/log-tree.c
@@ -15,6 +15,7 @@
 #include "line-log.h"
 #include "help.h"
 #include "interdiff.h"
+#include "range-diff.h"
 
 static struct decoration name_decoration = { "object names" };
 static int decoration_loaded;
@@ -750,6 +751,20 @@ void show_log(struct rev_info *opt)
 
 		memcpy(&diff_queued_diff, &dq, sizeof(diff_queued_diff));
 	}
+
+	if (cmit_fmt_is_mail(ctx.fmt) && opt->rdiff1) {
+		struct diff_queue_struct dq;
+
+		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);
+		show_range_diff(opt->rdiff1, opt->rdiff2,
+				opt->creation_factor, 1, &opt->diffopt);
+
+		memcpy(&diff_queued_diff, &dq, sizeof(diff_queued_diff));
+	}
 }
 
 int log_tree_diff_flush(struct rev_info *opt)
-- 
2.18.0.345.g5c9ce644c3
Previous: Eric SunshineNext: Junio C Hamano
Message 30 of 38 in “format-patch: add --interdiff and --range-diff options”
  1. 00/14 format-patch: add --interdiff and --range-diff optionsEric Sunshine, Jul 22, 2018
  2. 01/14 format-patch: allow additional generated content in make_cover_letter()Eric Sunshine, Jul 22, 2018
  3. 02/14 format-patch: add --interdiff option to embed diff in cover letterEric Sunshine, Jul 22, 2018
  4. Eric SunshineJul 22, 2018
  5. Duy NguyenJul 23, 2018
  6. Eric SunshineJul 23, 2018
  7. Junio C HamanoJul 23, 2018
  8. 03/14 format-patch: teach --interdiff to respect -v/--reroll-countEric Sunshine, Jul 22, 2018
  9. Duy NguyenJul 23, 2018
  10. Eric SunshineJul 23, 2018
  11. 04/14 interdiff: teach show_interdiff() to indent interdiffEric Sunshine, Jul 22, 2018
  12. 05/14 log-tree: show_log: make commentary block delimiting reusableEric Sunshine, Jul 22, 2018
  13. 06/14 format-patch: allow --interdiff to apply to a lone-patchEric Sunshine, Jul 22, 2018
  14. Duy NguyenJul 23, 2018
  15. Eric SunshineJul 23, 2018
  16. 08/14 range-diff: publish default creation factorEric Sunshine, Jul 22, 2018
  17. 09/14 range-diff: relieve callers of low-level configuration burdenEric Sunshine, Jul 22, 2018
  18. 10/14 format-patch: add --range-diff option to embed diff in cover letterEric Sunshine, Jul 22, 2018
  19. Duy NguyenJul 23, 2018
  20. Eric SunshineJul 23, 2018
  21. Junio C HamanoJul 25, 2018
  22. Eric SunshineJul 25, 2018
  23. Junio C HamanoJul 25, 2018
  24. Duy NguyenJul 25, 2018
  25. 07/14 range-diff: respect diff_option.file rather than assuming 'stdout'Eric Sunshine, Jul 22, 2018
  26. Stefan BellerJul 23, 2018
  27. Eric SunshineJul 23, 2018
  28. Junio C HamanoJul 25, 2018
  29. 12/14 format-patch: teach --range-diff to respect -v/--reroll-countEric Sunshine, Jul 22, 2018
  30. 14/14 format-patch: allow --range-diff to apply to a lone-patchEric Sunshine, Jul 22, 2018
  31. Junio C HamanoJul 25, 2018
  32. Eric SunshineSep 7, 2018
  33. 13/14 format-patch: add --creation-factor tweak for --range-diffEric Sunshine, Jul 22, 2018
  34. 11/14 format-patch: extend --range-diff to accept revision rangeEric Sunshine, Jul 22, 2018
  35. Junio C HamanoJul 25, 2018
  36. Eric SunshineSep 7, 2018
  37. Duy NguyenJul 23, 2018
  38. Eric SunshineJul 23, 2018

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.