Skip to content

Commit

Permalink
mailinfo: keep the parsed log message in a strbuf
Browse files Browse the repository at this point in the history
When mailinfo() is eventually libified, the calling "git am" still
will have to write out the log message in the "msg" file for hooks
and other users of the information, but it does not have to reopen
and reread what it wrote earlier if the function kept it in a strbuf.

This also removes the need for seeking and truncating the output
file when we see a scissors mark in the input, which in turn allows
us to lose two callsites of die_errno().

Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Junio C Hamano committed Oct 21, 2015
1 parent 4933910 commit 05e625e
Showing 1 changed file with 16 additions and 12 deletions.
28 changes: 16 additions & 12 deletions builtin/mailinfo.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
struct mailinfo {
FILE *input;
FILE *output;
FILE *cmitmsg;
FILE *patchfile;

struct strbuf name;
Expand All @@ -36,6 +35,8 @@ struct mailinfo {
int header_stage; /* still checking in-body headers? */
struct strbuf **p_hdr_data;
struct strbuf **s_hdr_data;

struct strbuf log_message;
};

static void cleanup_space(struct strbuf *sb)
Expand Down Expand Up @@ -676,10 +677,8 @@ static int handle_commit_msg(struct mailinfo *mi, struct strbuf *line)

if (mi->use_scissors && is_scissors_line(line)) {
int i;
if (fseek(mi->cmitmsg, 0L, SEEK_SET))
die_errno("Could not rewind output message file");
if (ftruncate(fileno(mi->cmitmsg), 0))
die_errno("Could not truncate output message file at scissors");

strbuf_setlen(&mi->log_message, 0);
mi->header_stage = 1;

/*
Expand All @@ -696,13 +695,12 @@ static int handle_commit_msg(struct mailinfo *mi, struct strbuf *line)

if (patchbreak(line)) {
if (mi->message_id)
fprintf(mi->cmitmsg, "Message-Id: %s\n", mi->message_id);
fclose(mi->cmitmsg);
mi->cmitmsg = NULL;
strbuf_addf(&mi->log_message,
"Message-Id: %s\n", mi->message_id);
return 1;
}

fputs(line->buf, mi->cmitmsg);
strbuf_addbuf(&mi->log_message, line);
return 0;
}

Expand Down Expand Up @@ -968,18 +966,19 @@ static void handle_info(struct mailinfo *mi)

static int mailinfo(struct mailinfo *mi, const char *msg, const char *patch)
{
FILE *cmitmsg;
int peek;
struct strbuf line = STRBUF_INIT;

mi->cmitmsg = fopen(msg, "w");
if (!mi->cmitmsg) {
cmitmsg = fopen(msg, "w");
if (!cmitmsg) {
perror(msg);
return -1;
}
mi->patchfile = fopen(patch, "w");
if (!mi->patchfile) {
perror(patch);
fclose(mi->cmitmsg);
fclose(cmitmsg);
return -1;
}

Expand All @@ -996,6 +995,8 @@ static int mailinfo(struct mailinfo *mi, const char *msg, const char *patch)
check_header(mi, &line, mi->p_hdr_data, 1);

handle_body(mi, &line);
fwrite(mi->log_message.buf, 1, mi->log_message.len, cmitmsg);
fclose(cmitmsg);
fclose(mi->patchfile);

handle_info(mi);
Expand Down Expand Up @@ -1023,6 +1024,7 @@ static void setup_mailinfo(struct mailinfo *mi)
strbuf_init(&mi->name, 0);
strbuf_init(&mi->email, 0);
strbuf_init(&mi->charset, 0);
strbuf_init(&mi->log_message, 0);
mi->header_stage = 1;
mi->use_inbody_headers = 1;
mi->content_top = mi->content;
Expand All @@ -1049,6 +1051,8 @@ static void clear_mailinfo(struct mailinfo *mi)
free(*(mi->content_top));
mi->content_top--;
}

strbuf_release(&mi->log_message);
}

static const char mailinfo_usage[] =
Expand Down

0 comments on commit 05e625e

Please sign in to comment.