merge: refuse --commit with --squash

Convert option_commit to tristate, representing the states of 'default/untouched', 'enabled-by-cli', 'disabled-by-cli'. With this in place, check whether option_commit was enabled by cli when squashing a merge. If so, error out, as this is not supported. Previously, when --squash was supplied, 'option_commit' was silently dropped. This could have been surprising to a user who tried to override the no-commit behavior of squash using --commit explicitly. Add a note to the --squash option for git-merge to clarify the incompatibility, and add a test case to t7600-merge.sh Cc: Junio C Hamano <gitster@pobox.com> Cc: Rafael Ascensão <rafa.almas@gmail.com> Cc: Johannes Schindelin <Johannes.Schindelin@gmx.de> Signed-off-by: Vishal Verma <vishal@stellar.sh> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Vishal Verma committed May 24, 2019 at 12:36 UTC 1d14d0c9949c02260fe4f8b3a54a1b5c605823a2
3 files changed +19 -1
Documentation/merge-options.txt
+2
@@ -90,6 +90,8 @@ merge.
90 +
91 With --no-squash perform the merge and commit the result. This
92 option can be used to override --squash.
93 ++
94 +With --squash, --commit is not allowed, and will fail.
95
96 -s <strategy>::
97 --strategy=<strategy>::
builtin/merge.c
+11 -1
@@ -57,7 +57,7 @@ static const char * const builtin_merge_usage[] = {
57 };
58
59 static int show_diffstat = 1, shortlog_len = -1, squash;
60 -static int option_commit = 1;
60 +static int option_commit = -1;
61 static int option_edit = -1;
62 static int allow_trivial = 1, have_message, verify_signatures;
63 static int overwrite_ignore = 1;
@@ -1304,9 +1304,19 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
1304 if (squash) {
1305 if (fast_forward == FF_NO)
1306 die(_("You cannot combine --squash with --no-ff."));
1307 + if (option_commit > 0)
1308 + die(_("You cannot combine --squash with --commit."));
1309 + /*
1310 + * squash can now silently disable option_commit - this is not
1311 + * a problem as it is only overriding the default, not a user
1312 + * supplied option.
1313 + */
1314 option_commit = 0;
1315 }
1316
1317 + if (option_commit < 0)
1318 + option_commit = 1;
1319 +
1320 if (!argc) {
1321 if (default_to_upstream)
1322 argc = setup_with_upstream(&argv);
t/t7600-merge.sh
+6
@@ -525,6 +525,12 @@ test_expect_success 'combining --squash and --no-ff is refused' '
525 test_must_fail git merge --no-ff --squash c1
526 '
527
528 +test_expect_success 'combining --squash and --commit is refused' '
529 + git reset --hard c0 &&
530 + test_must_fail git merge --squash --commit c1 &&
531 + test_must_fail git merge --commit --squash c1
532 +'
533 +
534 test_expect_success 'option --ff-only overwrites --no-ff' '
535 git merge --no-ff --ff-only c1 &&
536 test_must_fail git merge --no-ff --ff-only c2