]> git.ipfire.org Git - thirdparty/git.git/commitdiff
format-patch: allow --range-diff to apply to a lone-patch
authorEric Sunshine <sunshine@sunshineco.com>
Sun, 22 Jul 2018 09:57:17 +0000 (05:57 -0400)
committerJunio C Hamano <gitster@pobox.com>
Tue, 14 Aug 2018 21:27:05 +0000 (14:27 -0700)
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>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/git-format-patch.txt
builtin/log.c
log-tree.c

index 9b2e17215999cc56553ed3234e6084bc7cc8a580..aba4c5febeb7ef4248d50a638d0a8bd58f7d553b 100644 (file)
@@ -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
index 05965a57ca6ea43a3de19283d278051120d75697..f69b67b9cef050e1e5506d2b3a9f7c1f9c519a18 100644 (file)
@@ -1576,7 +1576,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()
@@ -1817,8 +1817,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]);
@@ -1867,8 +1867,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;
 
index e21c3d959fccc6266fb119edd5be459a0f3c02ce..cec983a4610649e3a8a80d70865549f48f645bea 100644 (file)
@@ -16,6 +16,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;
@@ -751,6 +752,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)