format-patch: refactor get_patch_filename

The get_patch_filename function expects a commit argument
and uses it to get the sanitized subject line when making a
patch filename. However, we also want to use this same
function for the cover letter, which does not have a commit
object. The current solution is to create a fake commit with
the subject "cover letter". Instead, let's make the
get_patch_filename interface more flexibile, and allow
passing a direct subject.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jeff King
2012-05-21 19:10:32 -04:00
committed by Junio C Hamano
parent be641abdb5
commit a21c2f94fb
3 changed files with 20 additions and 38 deletions

View File

@ -299,19 +299,22 @@ static unsigned int digits_in_number(unsigned int number)
return result;
}
void get_patch_filename(struct commit *commit, int nr, const char *suffix,
struct strbuf *buf)
void get_patch_filename(struct commit *commit, const char *subject, int nr,
const char *suffix, struct strbuf *buf)
{
int suffix_len = strlen(suffix) + 1;
int start_len = buf->len;
strbuf_addf(buf, commit ? "%04d-" : "%d", nr);
if (commit) {
strbuf_addf(buf, commit || subject ? "%04d-" : "%d", nr);
if (commit || subject) {
int max_len = start_len + FORMAT_PATCH_NAME_MAX - suffix_len;
struct pretty_print_context ctx = {0};
ctx.date_mode = DATE_NORMAL;
format_commit_message(commit, "%f", buf, &ctx);
if (subject)
strbuf_addstr(buf, subject);
else if (commit)
format_commit_message(commit, "%f", buf, &ctx);
if (max_len < buf->len)
strbuf_setlen(buf, max_len);
strbuf_addstr(buf, suffix);
@ -384,8 +387,8 @@ void log_write_email_headers(struct rev_info *opt, struct commit *commit,
mime_boundary_leader, opt->mime_boundary);
extra_headers = subject_buffer;
get_patch_filename(opt->numbered_files ? NULL : commit, opt->nr,
opt->patch_suffix, &filename);
get_patch_filename(opt->numbered_files ? NULL : commit, NULL,
opt->nr, opt->patch_suffix, &filename);
snprintf(buffer, sizeof(buffer) - 1,
"\n--%s%s\n"
"Content-Type: text/x-patch;"