Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.kernel.org/pub/scm/git/git.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Sunshine <sunshine@sunshineco.com>2018-07-22 12:57:17 +0300
committerJunio C Hamano <gitster@pobox.com>2018-08-15 00:27:05 +0300
commit40ce41604daf200cdc85abded0133d40faafc2f8 (patch)
tree39eebe33daf043ff9033a4728b5c278b86d8e54b
parent8631bf1cdd7296684deebab2708761bfc8085fc2 (diff)
format-patch: allow --range-diff to apply to a lone-patch
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>
-rw-r--r--Documentation/git-format-patch.txt3
-rw-r--r--builtin/log.c9
-rw-r--r--log-tree.c15
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 05965a57ca..f69b67b9ce 100644
--- a/builtin/log.c
+++ b/builtin/log.c
@@ -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;
diff --git a/log-tree.c b/log-tree.c
index e21c3d959f..cec983a461 100644
--- a/log-tree.c
+++ b/log-tree.c
@@ -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)