diff options
author | Eric Sunshine <sunshine@sunshineco.com> | 2018-07-22 09:57:04 (GMT) |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2018-07-23 19:50:05 (GMT) |
commit | fa5b7ea670f4c5ee377e7fce799300829eabb291 (patch) | |
tree | d44e4d6dd94bafc77012cbe5cff5b195378830ab /builtin/log.c | |
parent | b7bd9486b055c3f967a870311e704e3bb0654e4f (diff) | |
download | git-fa5b7ea670f4c5ee377e7fce799300829eabb291.zip git-fa5b7ea670f4c5ee377e7fce799300829eabb291.tar.gz git-fa5b7ea670f4c5ee377e7fce799300829eabb291.tar.bz2 |
format-patch: allow additional generated content in make_cover_letter()
make_cover_letter() returns early when it lacks sufficient state to emit
a diffstat, which makes it difficult to extend the function to reliably
emit additional generated content. Work around this shortcoming by
factoring diffstat-printing logic out to its own function and calling it
as needed without otherwise inhibiting normal control flow.
Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin/log.c')
-rw-r--r-- | builtin/log.c | 43 |
1 files changed, 23 insertions, 20 deletions
diff --git a/builtin/log.c b/builtin/log.c index 805f89d..873aabc 100644 --- a/builtin/log.c +++ b/builtin/log.c @@ -997,6 +997,26 @@ static char *find_branch_name(struct rev_info *rev) return branch; } +static void show_diffstat(struct rev_info *rev, + struct commit *origin, struct commit *head) +{ + struct diff_options opts; + + memcpy(&opts, &rev->diffopt, sizeof(opts)); + opts.output_format = DIFF_FORMAT_SUMMARY | DIFF_FORMAT_DIFFSTAT; + opts.stat_width = MAIL_DEFAULT_WRAP; + + diff_setup_done(&opts); + + diff_tree_oid(get_commit_tree_oid(origin), + get_commit_tree_oid(head), + "", &opts); + diffcore_std(&opts); + diff_flush(&opts); + + fprintf(rev->diffopt.file, "\n"); +} + static void make_cover_letter(struct rev_info *rev, int use_stdout, struct commit *origin, int nr, struct commit **list, @@ -1010,7 +1030,6 @@ static void make_cover_letter(struct rev_info *rev, int use_stdout, struct strbuf sb = STRBUF_INIT; int i; const char *encoding = "UTF-8"; - struct diff_options opts; int need_8bit_cte = 0; struct pretty_print_context pp = {0}; struct commit *head = list[0]; @@ -1060,25 +1079,9 @@ static void make_cover_letter(struct rev_info *rev, int use_stdout, shortlog_output(&log); - /* - * We can only do diffstat with a unique reference point - */ - if (!origin) - return; - - memcpy(&opts, &rev->diffopt, sizeof(opts)); - opts.output_format = DIFF_FORMAT_SUMMARY | DIFF_FORMAT_DIFFSTAT; - opts.stat_width = MAIL_DEFAULT_WRAP; - - diff_setup_done(&opts); - - diff_tree_oid(get_commit_tree_oid(origin), - get_commit_tree_oid(head), - "", &opts); - diffcore_std(&opts); - diff_flush(&opts); - - fprintf(rev->diffopt.file, "\n"); + /* We can only do diffstat with a unique reference point */ + if (origin) + show_diffstat(rev, origin, head); } static const char *clean_message_id(const char *msg_id) |