The function switched between two operating modes depending on the NULL-ness of its two parameters, as a hacky way to share small part of implementation, sacrificing cleanliness of the API. Implement "fmt_output_subject()" function that takes a subject string and gives the name for the output file, and on top of it, implement "fmt_output_commit()" function that takes a commit and gives the name for the output file. Signed-off-by: Junio C Hamano <gitster@xxxxxxxxx> --- builtin/log.c | 4 +++- log-tree.c | 41 +++++++++++++++++++++++------------------ log-tree.h | 5 ++--- 3 files changed, 28 insertions(+), 22 deletions(-) diff --git a/builtin/log.c b/builtin/log.c index 3c6f20a..8cfb4da 100644 --- a/builtin/log.c +++ b/builtin/log.c @@ -686,8 +686,10 @@ static int reopen_stdout(struct commit *commit, const char *subject, if (rev->numbered_files) strbuf_addf(&filename, "%d", rev->nr); + else if (commit) + fmt_output_commit(&filename, commit, rev); else - get_patch_filename(&filename, commit, subject, rev); + fmt_output_subject(&filename, subject, rev); if (!quiet) fprintf(realstdout, "%s\n", filename.buf + outdir_offset); diff --git a/log-tree.c b/log-tree.c index d9f86ce..670beae 100644 --- a/log-tree.c +++ b/log-tree.c @@ -299,26 +299,32 @@ static unsigned int digits_in_number(unsigned int number) return result; } -void get_patch_filename(struct strbuf *buf, - struct commit *commit, const char *subject, +void fmt_output_subject(struct strbuf *filename, + const char *subject, struct rev_info *info) { const char *suffix = info->patch_suffix; int nr = info->nr; - int suffix_len = strlen(suffix) + 1; - int start_len = buf->len; - int max_len = start_len + FORMAT_PATCH_NAME_MAX - suffix_len; - - strbuf_addf(buf, "%04d-", nr); - if (subject) - strbuf_addstr(buf, subject); - else if (commit) { - struct pretty_print_context ctx = {0}; - format_commit_message(commit, "%f", buf, &ctx); - } - if (max_len < buf->len) - strbuf_setlen(buf, max_len); - strbuf_addstr(buf, suffix); + int start_len = filename->len; + int max_len = start_len + FORMAT_PATCH_NAME_MAX - (strlen(suffix) + 1); + + strbuf_addf(filename, "%04d-%s", nr, subject); + + if (max_len < filename->len) + strbuf_setlen(filename, max_len); + strbuf_addstr(filename, suffix); +} + +void fmt_output_commit(struct strbuf *filename, + struct commit *commit, + struct rev_info *info) +{ + struct pretty_print_context ctx = {0}; + struct strbuf subject = STRBUF_INIT; + + format_commit_message(commit, "%f", &subject, &ctx); + fmt_output_subject(filename, subject.buf, info); + strbuf_release(&subject); } void log_write_email_headers(struct rev_info *opt, struct commit *commit, @@ -390,8 +396,7 @@ void log_write_email_headers(struct rev_info *opt, struct commit *commit, if (opt->numbered_files) strbuf_addf(&filename, "%d", opt->nr); else - get_patch_filename(&filename, commit, NULL, - opt); + fmt_output_commit(&filename, commit, opt); snprintf(buffer, sizeof(buffer) - 1, "\n--%s%s\n" "Content-Type: text/x-patch;" diff --git a/log-tree.h b/log-tree.h index c6a944a..9140f48 100644 --- a/log-tree.h +++ b/log-tree.h @@ -21,8 +21,7 @@ void log_write_email_headers(struct rev_info *opt, struct commit *commit, void load_ref_decorations(int flags); #define FORMAT_PATCH_NAME_MAX 64 -void get_patch_filename(struct strbuf *buf, - struct commit *commit, const char *subject, - struct rev_info *); +void fmt_output_commit(struct strbuf *, struct commit *, struct rev_info *); +void fmt_output_subject(struct strbuf *, const char *subject, struct rev_info *); #endif -- 1.8.0.6.gd28b5d4.dirty -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html