Navigation Menu

Skip to content

Commit

Permalink
format-patch: refactor get_patch_filename
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
peff authored and gitster committed May 22, 2012
1 parent be641ab commit a21c2f9
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 38 deletions.
35 changes: 7 additions & 28 deletions builtin/log.c
Expand Up @@ -663,7 +663,8 @@ static FILE *realstdout = NULL;
static const char *output_directory = NULL; static const char *output_directory = NULL;
static int outdir_offset; static int outdir_offset;


static int reopen_stdout(struct commit *commit, struct rev_info *rev, int quiet) static int reopen_stdout(struct commit *commit, const char *subject,
struct rev_info *rev, int quiet)
{ {
struct strbuf filename = STRBUF_INIT; struct strbuf filename = STRBUF_INIT;
int suffix_len = strlen(fmt_patch_suffix) + 1; int suffix_len = strlen(fmt_patch_suffix) + 1;
Expand All @@ -677,7 +678,7 @@ static int reopen_stdout(struct commit *commit, struct rev_info *rev, int quiet)
strbuf_addch(&filename, '/'); strbuf_addch(&filename, '/');
} }


get_patch_filename(commit, rev->nr, fmt_patch_suffix, &filename); get_patch_filename(commit, subject, rev->nr, fmt_patch_suffix, &filename);


if (!quiet) if (!quiet)
fprintf(realstdout, "%s\n", filename.buf + outdir_offset); fprintf(realstdout, "%s\n", filename.buf + outdir_offset);
Expand Down Expand Up @@ -778,39 +779,17 @@ static void make_cover_letter(struct rev_info *rev, int use_stdout,
const char *encoding = "UTF-8"; const char *encoding = "UTF-8";
struct diff_options opts; struct diff_options opts;
int need_8bit_cte = 0; int need_8bit_cte = 0;
struct commit *commit = NULL;
struct pretty_print_context pp = {0}; struct pretty_print_context pp = {0};


if (rev->commit_format != CMIT_FMT_EMAIL) if (rev->commit_format != CMIT_FMT_EMAIL)
die(_("Cover letter needs email format")); die(_("Cover letter needs email format"));


committer = git_committer_info(0); committer = git_committer_info(0);


if (!numbered_files) { if (!use_stdout &&
/* reopen_stdout(NULL, numbered_files ? NULL : "cover-letter", rev, quiet))
* We fake a commit for the cover letter so we get the filename
* desired.
*/
commit = xcalloc(1, sizeof(*commit));
commit->buffer = xmalloc(400);
snprintf(commit->buffer, 400,
"tree 0000000000000000000000000000000000000000\n"
"parent %s\n"
"author %s\n"
"committer %s\n\n"
"cover letter\n",
sha1_to_hex(head->object.sha1), committer, committer);
}

if (!use_stdout && reopen_stdout(commit, rev, quiet))
return; return;


if (commit) {

free(commit->buffer);
free(commit);
}

log_write_email_headers(rev, head, &pp.subject, &pp.after_subject, log_write_email_headers(rev, head, &pp.subject, &pp.after_subject,
&need_8bit_cte); &need_8bit_cte);


Expand Down Expand Up @@ -1405,8 +1384,8 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
gen_message_id(&rev, sha1_to_hex(commit->object.sha1)); gen_message_id(&rev, sha1_to_hex(commit->object.sha1));
} }


if (!use_stdout && reopen_stdout(numbered_files ? NULL : commit, if (!use_stdout &&
&rev, quiet)) reopen_stdout(numbered_files ? NULL : commit, NULL, &rev, quiet))
die(_("Failed to create output files")); die(_("Failed to create output files"));
shown = log_tree_commit(&rev, commit); shown = log_tree_commit(&rev, commit);
free(commit->buffer); free(commit->buffer);
Expand Down
19 changes: 11 additions & 8 deletions log-tree.c
Expand Up @@ -299,19 +299,22 @@ static unsigned int digits_in_number(unsigned int number)
return result; return result;
} }


void get_patch_filename(struct commit *commit, int nr, const char *suffix, void get_patch_filename(struct commit *commit, const char *subject, int nr,
struct strbuf *buf) const char *suffix, struct strbuf *buf)
{ {
int suffix_len = strlen(suffix) + 1; int suffix_len = strlen(suffix) + 1;
int start_len = buf->len; int start_len = buf->len;


strbuf_addf(buf, commit ? "%04d-" : "%d", nr); strbuf_addf(buf, commit || subject ? "%04d-" : "%d", nr);
if (commit) { if (commit || subject) {
int max_len = start_len + FORMAT_PATCH_NAME_MAX - suffix_len; int max_len = start_len + FORMAT_PATCH_NAME_MAX - suffix_len;
struct pretty_print_context ctx = {0}; 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) if (max_len < buf->len)
strbuf_setlen(buf, max_len); strbuf_setlen(buf, max_len);
strbuf_addstr(buf, suffix); strbuf_addstr(buf, suffix);
Expand Down Expand Up @@ -384,8 +387,8 @@ void log_write_email_headers(struct rev_info *opt, struct commit *commit,
mime_boundary_leader, opt->mime_boundary); mime_boundary_leader, opt->mime_boundary);
extra_headers = subject_buffer; extra_headers = subject_buffer;


get_patch_filename(opt->numbered_files ? NULL : commit, opt->nr, get_patch_filename(opt->numbered_files ? NULL : commit, NULL,
opt->patch_suffix, &filename); opt->nr, opt->patch_suffix, &filename);
snprintf(buffer, sizeof(buffer) - 1, snprintf(buffer, sizeof(buffer) - 1,
"\n--%s%s\n" "\n--%s%s\n"
"Content-Type: text/x-patch;" "Content-Type: text/x-patch;"
Expand Down
4 changes: 2 additions & 2 deletions log-tree.h
Expand Up @@ -21,7 +21,7 @@ void log_write_email_headers(struct rev_info *opt, struct commit *commit,
void load_ref_decorations(int flags); void load_ref_decorations(int flags);


#define FORMAT_PATCH_NAME_MAX 64 #define FORMAT_PATCH_NAME_MAX 64
void get_patch_filename(struct commit *commit, int nr, const char *suffix, void get_patch_filename(struct commit *commit, const char *subject, int nr,
struct strbuf *buf); const char *suffix, struct strbuf *buf);


#endif #endif

0 comments on commit a21c2f9

Please sign in to comment.