diff options
Diffstat (limited to 'builtin/am.c')
-rw-r--r-- | builtin/am.c | 58 |
1 files changed, 55 insertions, 3 deletions
diff --git a/builtin/am.c b/builtin/am.c index 8355e35..e4a0ff9 100644 --- a/builtin/am.c +++ b/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. */ @@ -198,6 +210,7 @@ static void write_state_bool(const struct am_state *state, * If state->quiet is false, calls fprintf(fp, fmt, ...), and appends a newline * at the end. */ +__attribute__((format (printf, 3, 4))) static void say(const struct am_state *state, FILE *fp, const char *fmt, ...) { va_list ap; @@ -397,6 +410,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 +1021,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 +1199,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"))) @@ -1771,7 +1820,7 @@ static void am_run(struct am_state *state, int resume) printf_ln(_("Patch failed at %s %.*s"), msgnum(state), linelen(state->msg), state->msg); - if (advice_amworkdir) + if (advice_enabled(ADVICE_AM_WORK_DIR)) advise(_("Use 'git am --show-current-patch=diff' to see the failed patch")); die_user_resolve(state); @@ -1799,7 +1848,6 @@ next: */ if (!state->rebasing) { am_destroy(state); - close_object_store(the_repository->objects); run_auto_maintenance(state->quiet); } } @@ -2057,7 +2105,8 @@ static void am_abort(struct am_state *state) if (!has_orig_head) oidcpy(&orig_head, the_hash_algo->empty_tree); - clean_index(&curr_head, &orig_head); + if (clean_index(&curr_head, &orig_head)) + die(_("failed to clean index")); if (has_orig_head) update_ref("am --abort", "HEAD", &orig_head, @@ -2242,6 +2291,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), |