[PATCH v2] builtin/merges: clarify --squash behavior with --commit
From: Vishal Verma <vishal@stellar.sh>
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.
Add a note to the --squash option for git-merge to clarify the incompatibility.
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.
Cc: Junio C Hamano <gitster@pobox.com>
Cc: Rafael Ascensão <rafa.almas@gmail.com>
Signed-off-by: Vishal Verma <vishal@stellar.sh>
---
v2:
- Error out when both --squash and --commit are supplied (Junio)
- Adjust the documentation accordingly.
Documentation/merge-options.txt | 2 ++
builtin/merge.c | 18 +++++++++++++++++-
2 files changed, 19 insertions(+), 1 deletion(-)
Show changes to 2 files +19 −1
Documentation/merge-options.txt, builtin/merge.c
diff --git a/Documentation/merge-options.txt b/Documentation/merge-options.txt
index 92a7d936c1..263b194247 100644
--- a/Documentation/merge-options.txt
+++ b/Documentation/merge-options.txt
@@ -95,6 +95,8 @@ merge.
+
With --no-squash perform the merge and commit the result. This
option can be used to override --squash.
++
+With --squash, --commit is not allowed, and will fail.
-s <strategy>::
--strategy=<strategy>::
diff --git a/builtin/merge.c b/builtin/merge.c
index 5ce8946d39..98f268ac57 100644
--- a/builtin/merge.c
+++ b/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 option_commit = 1;
+static int option_commit = -1;
static int option_edit = -1;
static int allow_trivial = 1, have_message, verify_signatures;
static int overwrite_ignore = 1;
@@ -1304,9 +1304,25 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
if (verbosity < 0)
show_diffstat = 0;
+ /*
+ * This indicates option_commit was influenced by the command line.
+ * Check and error out for the squash case.
+ */
+ if ((option_commit > 0) && squash)
+ die(_("You cannot combine --squash with --commit."));
+
+ /* If option_commit is the default '-1', we can 'enable' it */
+ if (option_commit < 0)
+ option_commit = 1;
+
if (squash) {
if (fast_forward == FF_NO)
die(_("You cannot combine --squash with --no-ff."));
+ /*
+ * 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;
}
--
2.20.1