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:
parent
be641abdb5
commit
a21c2f94fb
@ -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;
|
||||||
@ -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);
|
||||||
@ -778,7 +779,6 @@ 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)
|
||||||
@ -786,31 +786,10 @@ static void make_cover_letter(struct rev_info *rev, int use_stdout,
|
|||||||
|
|
||||||
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);
|
||||||
|
|
||||||
@ -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);
|
||||||
|
19
log-tree.c
19
log-tree.c
@ -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);
|
||||||
@ -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;"
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user