Browse Source

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>
maint
Vishal Verma 6 years ago committed by Junio C Hamano
parent
commit
1d14d0c994
  1. 2
      Documentation/merge-options.txt
  2. 12
      builtin/merge.c
  3. 6
      t/t7600-merge.sh

2
Documentation/merge-options.txt

@ -90,6 +90,8 @@ merge.
+ +
With --no-squash perform the merge and commit the result. This With --no-squash perform the merge and commit the result. This
option can be used to override --squash. option can be used to override --squash.
+
With --squash, --commit is not allowed, and will fail.


-s <strategy>:: -s <strategy>::
--strategy=<strategy>:: --strategy=<strategy>::

12
builtin/merge.c

@ -57,7 +57,7 @@ static const char * const builtin_merge_usage[] = {
}; };


static int show_diffstat = 1, shortlog_len = -1, squash; static int show_diffstat = 1, shortlog_len = -1, squash;
static int option_commit = 1; static int option_commit = -1;
static int option_edit = -1; static int option_edit = -1;
static int allow_trivial = 1, have_message, verify_signatures; static int allow_trivial = 1, have_message, verify_signatures;
static int overwrite_ignore = 1; static int overwrite_ignore = 1;
@ -1304,9 +1304,19 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
if (squash) { if (squash) {
if (fast_forward == FF_NO) if (fast_forward == FF_NO)
die(_("You cannot combine --squash with --no-ff.")); die(_("You cannot combine --squash with --no-ff."));
if (option_commit > 0)
die(_("You cannot combine --squash with --commit."));
/*
* squash can now silently disable option_commit - this is not
* a problem as it is only overriding the default, not a user
* supplied option.
*/
option_commit = 0; option_commit = 0;
} }


if (option_commit < 0)
option_commit = 1;

if (!argc) { if (!argc) {
if (default_to_upstream) if (default_to_upstream)
argc = setup_with_upstream(&argv); argc = setup_with_upstream(&argv);

6
t/t7600-merge.sh

@ -525,6 +525,12 @@ test_expect_success 'combining --squash and --no-ff is refused' '
test_must_fail git merge --no-ff --squash c1 test_must_fail git merge --no-ff --squash c1
' '


test_expect_success 'combining --squash and --commit is refused' '
git reset --hard c0 &&
test_must_fail git merge --squash --commit c1 &&
test_must_fail git merge --commit --squash c1
'

test_expect_success 'option --ff-only overwrites --no-ff' ' test_expect_success 'option --ff-only overwrites --no-ff' '
git merge --no-ff --ff-only c1 && git merge --no-ff --ff-only c1 &&
test_must_fail git merge --no-ff --ff-only c2 test_must_fail git merge --no-ff --ff-only c2

Loading…
Cancel
Save