summaryrefslogtreecommitdiff
path: root/builtin/am.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2015-10-29 20:59:23 (GMT)
committerJunio C Hamano <gitster@pobox.com>2015-10-29 20:59:23 (GMT)
commit95b86a60cfe36055671006aa06c8d9ef27cb5bd6 (patch)
treef6dfde7ab9377e6dcb726ea6322ac290d4b0f527 /builtin/am.c
parentba5312da19c6fdb6c6747d479f58932aae6e900c (diff)
parent4b98bae2cbc6bf49a5fd7bab330191d002e6e2fc (diff)
downloadgit-95b86a60cfe36055671006aa06c8d9ef27cb5bd6.zip
git-95b86a60cfe36055671006aa06c8d9ef27cb5bd6.tar.gz
git-95b86a60cfe36055671006aa06c8d9ef27cb5bd6.tar.bz2
Merge branch 'jc/am-mailinfo-direct'
"git am" used to spawn "git mailinfo" via run_command() API once per each patch, but learned to make a direct call to mailinfo() instead. * jc/am-mailinfo-direct: am: make direct call to mailinfo
Diffstat (limited to 'builtin/am.c')
-rw-r--r--builtin/am.c42
1 files changed, 23 insertions, 19 deletions
diff --git a/builtin/am.c b/builtin/am.c
index 4e396c8..f1a25ab 100644
--- a/builtin/am.c
+++ b/builtin/am.c
@@ -27,6 +27,7 @@
#include "notes-utils.h"
#include "rerere.h"
#include "prompt.h"
+#include "mailinfo.h"
/**
* Returns 1 if the file is empty or does not exist, 0 otherwise.
@@ -1258,58 +1259,61 @@ static void am_append_signoff(struct am_state *state)
static int parse_mail(struct am_state *state, const char *mail)
{
FILE *fp;
- struct child_process cp = CHILD_PROCESS_INIT;
struct strbuf sb = STRBUF_INIT;
struct strbuf msg = STRBUF_INIT;
struct strbuf author_name = STRBUF_INIT;
struct strbuf author_date = STRBUF_INIT;
struct strbuf author_email = STRBUF_INIT;
int ret = 0;
+ struct mailinfo mi;
- cp.git_cmd = 1;
- cp.in = xopen(mail, O_RDONLY, 0);
- cp.out = xopen(am_path(state, "info"), O_WRONLY | O_CREAT, 0777);
+ setup_mailinfo(&mi);
- argv_array_push(&cp.args, "mailinfo");
- argv_array_push(&cp.args, state->utf8 ? "-u" : "-n");
+ if (state->utf8)
+ mi.metainfo_charset = get_commit_output_encoding();
+ else
+ mi.metainfo_charset = NULL;
switch (state->keep) {
case KEEP_FALSE:
break;
case KEEP_TRUE:
- argv_array_push(&cp.args, "-k");
+ mi.keep_subject = 1;
break;
case KEEP_NON_PATCH:
- argv_array_push(&cp.args, "-b");
+ mi.keep_non_patch_brackets_in_subject = 1;
break;
default:
die("BUG: invalid value for state->keep");
}
if (state->message_id)
- argv_array_push(&cp.args, "-m");
+ mi.add_message_id = 1;
switch (state->scissors) {
case SCISSORS_UNSET:
break;
case SCISSORS_FALSE:
- argv_array_push(&cp.args, "--no-scissors");
+ mi.use_scissors = 0;
break;
case SCISSORS_TRUE:
- argv_array_push(&cp.args, "--scissors");
+ mi.use_scissors = 1;
break;
default:
die("BUG: invalid value for state->scissors");
}
- argv_array_push(&cp.args, am_path(state, "msg"));
- argv_array_push(&cp.args, am_path(state, "patch"));
-
- if (run_command(&cp) < 0)
+ mi.input = fopen(mail, "r");
+ if (!mi.input)
+ die("could not open input");
+ mi.output = fopen(am_path(state, "info"), "w");
+ if (!mi.output)
+ die("could not open output 'info'");
+ if (mailinfo(&mi, am_path(state, "msg"), am_path(state, "patch")))
die("could not parse patch");
- close(cp.in);
- close(cp.out);
+ fclose(mi.input);
+ fclose(mi.output);
/* Extract message and author information */
fp = xfopen(am_path(state, "info"), "r");
@@ -1341,8 +1345,7 @@ static int parse_mail(struct am_state *state, const char *mail)
}
strbuf_addstr(&msg, "\n\n");
- if (strbuf_read_file(&msg, am_path(state, "msg"), 0) < 0)
- die_errno(_("could not read '%s'"), am_path(state, "msg"));
+ strbuf_addbuf(&msg, &mi.log_message);
strbuf_stripspace(&msg, 0);
if (state->signoff)
@@ -1366,6 +1369,7 @@ finish:
strbuf_release(&author_email);
strbuf_release(&author_name);
strbuf_release(&sb);
+ clear_mailinfo(&mi);
return ret;
}