Skip to content

Commit

Permalink
am: make direct call to mailinfo
Browse files Browse the repository at this point in the history
And finally the endgame.  Instead of spawning "git mailinfo" via the
run_command() API the same number of times as there are incoming
patches, make direct internal call to the libified mailinfo() from
"git am" to reduce the spawning overhead, which would matter on some
platforms.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Junio C Hamano committed Oct 21, 2015
1 parent 6ac617a commit 4b98bae
Showing 1 changed file with 23 additions and 19 deletions.
42 changes: 23 additions & 19 deletions builtin/am.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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");
Expand Down Expand Up @@ -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);
stripspace(&msg, 0);

if (state->signoff)
Expand All @@ -1366,6 +1369,7 @@ static int parse_mail(struct am_state *state, const char *mail)
strbuf_release(&author_email);
strbuf_release(&author_name);
strbuf_release(&sb);
clear_mailinfo(&mi);
return ret;
}

Expand Down

0 comments on commit 4b98bae

Please sign in to comment.