path: root/log-tree.c
diff options
authorEric Sunshine <>2018-07-22 09:57:17 (GMT)
committerJunio C Hamano <>2018-08-14 21:27:05 (GMT)
commit40ce41604daf200cdc85abded0133d40faafc2f8 (patch)
tree39eebe33daf043ff9033a4728b5c278b86d8e54b /log-tree.c
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 <> Signed-off-by: Junio C Hamano <>
Diffstat (limited to 'log-tree.c')
1 files changed, 15 insertions, 0 deletions
diff --git a/log-tree.c b/log-tree.c
index e21c3d9..cec983a 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)