am: learn to process quoted lines that ends with CRLF
In previous changes, mailinfo has learnt to process lines that decoded from base64 or quoted-printable, and ends with CRLF. Let's teach "am" that new trick, too. Signed-off-by: Đoàn Trần Công Danh <congdanhqx@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
133a4fda59
commit
59b519ab7e
51
builtin/am.c
51
builtin/am.c
@ -116,6 +116,7 @@ struct am_state {
|
||||
int keep; /* enum keep_type */
|
||||
int message_id;
|
||||
int scissors; /* enum scissors_type */
|
||||
int quoted_cr; /* enum quoted_cr_action */
|
||||
struct strvec git_apply_opts;
|
||||
const char *resolvemsg;
|
||||
int committer_date_is_author_date;
|
||||
@ -145,6 +146,7 @@ static void am_state_init(struct am_state *state)
|
||||
git_config_get_bool("am.messageid", &state->message_id);
|
||||
|
||||
state->scissors = SCISSORS_UNSET;
|
||||
state->quoted_cr = quoted_cr_unset;
|
||||
|
||||
strvec_init(&state->git_apply_opts);
|
||||
|
||||
@ -165,6 +167,16 @@ static void am_state_release(struct am_state *state)
|
||||
strvec_clear(&state->git_apply_opts);
|
||||
}
|
||||
|
||||
static int am_option_parse_quoted_cr(const struct option *opt,
|
||||
const char *arg, int unset)
|
||||
{
|
||||
BUG_ON_OPT_NEG(unset);
|
||||
|
||||
if (mailinfo_parse_quoted_cr_action(arg, opt->value) != 0)
|
||||
return error(_("bad action '%s' for '%s'"), arg, "--quoted-cr");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns path relative to the am_state directory.
|
||||
*/
|
||||
@ -397,6 +409,12 @@ static void am_load(struct am_state *state)
|
||||
else
|
||||
state->scissors = SCISSORS_UNSET;
|
||||
|
||||
read_state_file(&sb, state, "quoted-cr", 1);
|
||||
if (!*sb.buf)
|
||||
state->quoted_cr = quoted_cr_unset;
|
||||
else if (mailinfo_parse_quoted_cr_action(sb.buf, &state->quoted_cr) != 0)
|
||||
die(_("could not parse %s"), am_path(state, "quoted-cr"));
|
||||
|
||||
read_state_file(&sb, state, "apply-opt", 1);
|
||||
strvec_clear(&state->git_apply_opts);
|
||||
if (sq_dequote_to_strvec(sb.buf, &state->git_apply_opts) < 0)
|
||||
@ -1002,6 +1020,24 @@ static void am_setup(struct am_state *state, enum patch_format patch_format,
|
||||
}
|
||||
write_state_text(state, "scissors", str);
|
||||
|
||||
switch (state->quoted_cr) {
|
||||
case quoted_cr_unset:
|
||||
str = "";
|
||||
break;
|
||||
case quoted_cr_nowarn:
|
||||
str = "nowarn";
|
||||
break;
|
||||
case quoted_cr_warn:
|
||||
str = "warn";
|
||||
break;
|
||||
case quoted_cr_strip:
|
||||
str = "strip";
|
||||
break;
|
||||
default:
|
||||
BUG("invalid value for state->quoted_cr");
|
||||
}
|
||||
write_state_text(state, "quoted-cr", str);
|
||||
|
||||
sq_quote_argv(&sb, state->git_apply_opts.v);
|
||||
write_state_text(state, "apply-opt", sb.buf);
|
||||
|
||||
@ -1162,6 +1198,18 @@ static int parse_mail(struct am_state *state, const char *mail)
|
||||
BUG("invalid value for state->scissors");
|
||||
}
|
||||
|
||||
switch (state->quoted_cr) {
|
||||
case quoted_cr_unset:
|
||||
break;
|
||||
case quoted_cr_nowarn:
|
||||
case quoted_cr_warn:
|
||||
case quoted_cr_strip:
|
||||
mi.quoted_cr = state->quoted_cr;
|
||||
break;
|
||||
default:
|
||||
BUG("invalid value for state->quoted_cr");
|
||||
}
|
||||
|
||||
mi.input = xfopen(mail, "r");
|
||||
mi.output = xfopen(am_path(state, "info"), "w");
|
||||
if (mailinfo(&mi, am_path(state, "msg"), am_path(state, "patch")))
|
||||
@ -2242,6 +2290,9 @@ int cmd_am(int argc, const char **argv, const char *prefix)
|
||||
0, PARSE_OPT_NONEG),
|
||||
OPT_BOOL('c', "scissors", &state.scissors,
|
||||
N_("strip everything before a scissors line")),
|
||||
OPT_CALLBACK_F(0, "quoted-cr", &state.quoted_cr, N_("action"),
|
||||
N_("pass it through git-mailinfo"),
|
||||
PARSE_OPT_NONEG, am_option_parse_quoted_cr),
|
||||
OPT_PASSTHRU_ARGV(0, "whitespace", &state.git_apply_opts, N_("action"),
|
||||
N_("pass it through git-apply"),
|
||||
0),
|
||||
|
||||
Reference in New Issue
Block a user