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>
This commit is contained in:
Eric Sunshine 2018-07-22 05:57:04 -04:00 коммит произвёл Junio C Hamano
Родитель b7bd9486b0
Коммит fa5b7ea670
1 изменённых файлов: 23 добавлений и 20 удалений

Просмотреть файл

@ -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)