summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar Junio C Hamano <gitster@pobox.com>2015-10-14 17:43:27 -0700
committerLibravatar Junio C Hamano <gitster@pobox.com>2015-10-21 15:57:17 -0700
commit05e625e5bf5231af984f17b82be9c48063b37242 (patch)
tree8bffc18f516eee935512382ed929ebeda4456280
parentmailinfo: handle_commit_msg() shouldn't be called after finding patchbreak (diff)
downloadtgif-05e625e5bf5231af984f17b82be9c48063b37242.tar.xz
mailinfo: keep the parsed log message in a strbuf
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>
-rw-r--r--builtin/mailinfo.c28
1 files changed, 16 insertions, 12 deletions
diff --git a/builtin/mailinfo.c b/builtin/mailinfo.c
index 4a8c704c8a..11c8ee0ece 100644
--- a/builtin/mailinfo.c
+++ b/builtin/mailinfo.c
@@ -12,7 +12,6 @@
struct mailinfo {
FILE *input;
FILE *output;
- FILE *cmitmsg;
FILE *patchfile;
struct strbuf name;
@@ -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)
@@ -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;
/*
@@ -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;
}
@@ -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;
}
@@ -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);
@@ -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;
@@ -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[] =