builtin/am: allow disabling conflict advice

When 'git am' or 'git rebase --apply' encounter a conflict, they show a message instructing the user how to continue the operation. This message can't be disabled. Use ADVICE_MERGE_CONFLICT introduced in the previous commit to allow disabling it. Update the tests accordingly, as the advice output is now on stderr instead of stdout. In t4150, redirect stdout to 'out' and stderr to 'err', since this is less confusing. In t4254, as we are testing a specific failure mode of 'git am', simply disable the advice. Note that we are not testing that this advice is shown in 'git rebase' for the apply backend since 2ac0d6273f (rebase: change the default backend from "am" to "merge", 2020-02-15). Helped-by: Phillip Wood <phillip.wood@dunelm.org.uk> Helped-by: Junio C Hamano <gitster@pobox.com> Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Philippe Blain committed Mar 16, 2024 at 21:16 UTC 37ce97353c5be708ce2f86e176e99b62507332cc
3 files changed +14 -10
builtin/am.c
+9 -5
@@ -1150,19 +1150,23 @@ static const char *msgnum(const struct am_state *state)
1150 static void NORETURN die_user_resolve(const struct am_state *state)
1151 {
1152 if (state->resolvemsg) {
1153 - printf_ln("%s", state->resolvemsg);
1153 + advise_if_enabled(ADVICE_MERGE_CONFLICT, "%s", state->resolvemsg);
1154 } else {
1155 const char *cmdline = state->interactive ? "git am -i" : "git am";
1156 + struct strbuf sb = STRBUF_INIT;
1157
1157 - printf_ln(_("When you have resolved this problem, run \"%s --continue\"."), cmdline);
1158 - printf_ln(_("If you prefer to skip this patch, run \"%s --skip\" instead."), cmdline);
1158 + strbuf_addf(&sb, _("When you have resolved this problem, run \"%s --continue\".\n"), cmdline);
1159 + strbuf_addf(&sb, _("If you prefer to skip this patch, run \"%s --skip\" instead.\n"), cmdline);
1160
1161 if (advice_enabled(ADVICE_AM_WORK_DIR) &&
1162 is_empty_or_missing_file(am_path(state, "patch")) &&
1163 !repo_index_has_changes(the_repository, NULL, NULL))
1163 - printf_ln(_("To record the empty patch as an empty commit, run \"%s --allow-empty\"."), cmdline);
1164 + strbuf_addf(&sb, _("To record the empty patch as an empty commit, run \"%s --allow-empty\".\n"), cmdline);
1165
1165 - printf_ln(_("To restore the original branch and stop patching, run \"%s --abort\"."), cmdline);
1166 + strbuf_addf(&sb, _("To restore the original branch and stop patching, run \"%s --abort\"."), cmdline);
1167 +
1168 + advise_if_enabled(ADVICE_MERGE_CONFLICT, "%s", sb.buf);
1169 + strbuf_release(&sb);
1170 }
1171
1172 exit(128);
t/t4150-am.sh
+4 -4
@@ -1224,8 +1224,8 @@ test_expect_success 'record as an empty commit when meeting e-mail message that
1224
1225 test_expect_success 'skip an empty patch in the middle of an am session' '
1226 git checkout empty-commit^ &&
1227 - test_must_fail git am empty-commit.patch >err &&
1228 - grep "Patch is empty." err &&
1227 + test_must_fail git am empty-commit.patch >out 2>err &&
1228 + grep "Patch is empty." out &&
1229 grep "To record the empty patch as an empty commit, run \"git am --allow-empty\"." err &&
1230 git am --skip &&
1231 test_path_is_missing .git/rebase-apply &&
@@ -1236,8 +1236,8 @@ test_expect_success 'skip an empty patch in the middle of an am session' '
1236
1237 test_expect_success 'record an empty patch as an empty commit in the middle of an am session' '
1238 git checkout empty-commit^ &&
1239 - test_must_fail git am empty-commit.patch >err &&
1240 - grep "Patch is empty." err &&
1239 + test_must_fail git am empty-commit.patch >out 2>err &&
1240 + grep "Patch is empty." out &&
1241 grep "To record the empty patch as an empty commit, run \"git am --allow-empty\"." err &&
1242 git am --allow-empty >output &&
1243 grep "No changes - recorded it as an empty commit." output &&
t/t4254-am-corrupt.sh
+1 -1
@@ -59,7 +59,7 @@ test_expect_success setup '
59 # Also, it had the unwanted side-effect of deleting f.
60 test_expect_success 'try to apply corrupted patch' '
61 test_when_finished "git am --abort" &&
62 - test_must_fail git -c advice.amWorkDir=false am bad-patch.diff 2>actual &&
62 + test_must_fail git -c advice.amWorkDir=false -c advice.mergeConflict=false am bad-patch.diff 2>actual &&
63 echo "error: git diff header lacks filename information (line 4)" >expected &&
64 test_path_is_file f &&
65 test_cmp expected actual