All of lore.kernel.org
 help / color / mirror / Atom feed
From: Felipe Contreras <felipe.contreras@gmail.com>
To: git@vger.kernel.org
Cc: Elijah Newren <newren@gmail.com>,
	Felipe Contreras <felipe.contreras@gmail.com>
Subject: [PATCH 1/2] pull: add proper error with --ff-only
Date: Sat,  5 Dec 2020 14:19:32 -0600	[thread overview]
Message-ID: <20201205201933.1560133-1-felipe.contreras@gmail.com> (raw)
In-Reply-To: <CAMP44s3xqjoJm5AL6dLcS6R-RFGGOdQ39W+ZY3_PWL+WMeCxjw@mail.gmail.com>

The current error is not user-friendly:

  fatal: not possible to fast-forward, aborting.

We want something that actually explains what is going on:

  The pull was not fast-forward, please either merge or rebase.

The user can get rid of the warning by doing either --merge or
--rebase.

Except: doing "git pull --merge" is not actually enough; we would return
to the previous behavior: "fatal: not possible to fast-forward,
aborting". In order to do the right thing we will have to change the
semantics of --ff-only.

Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
 builtin/pull.c  | 33 ++++++++++++++++++--------------
 t/t5520-pull.sh | 50 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 69 insertions(+), 14 deletions(-)

diff --git a/builtin/pull.c b/builtin/pull.c
index e0157d013f..44ec6e7216 100644
--- a/builtin/pull.c
+++ b/builtin/pull.c
@@ -1008,20 +1008,25 @@ int cmd_pull(int argc, const char **argv, const char *prefix)
 
 	can_ff = get_can_ff(&orig_head, &merge_heads.oid[0]);
 
-	if (!opt_rebase && !can_ff && opt_verbosity >= 0 && (!opt_ff || !strcmp(opt_ff, "--ff"))) {
-		advise(_("Pulling without specifying how to reconcile divergent branches is discouraged;\n"
-			"you need to specify if you want a merge, a rebase, or a fast-forward.\n"
-			"You can squelch this message by running one of the following commands:\n"
-			"\n"
-			"  git config pull.rebase false  # merge (the default strategy)\n"
-			"  git config pull.rebase true   # rebase\n"
-			"  git config pull.ff only       # fast-forward only\n"
-			"\n"
-			"You can replace \"git config\" with \"git config --global\" to set a default\n"
-			"preference for all repositories.\n"
-			"If unsure, run \"git pull --merge\".\n"
-			"Read \"git pull --help\" for more information."
-			));
+	if (!can_ff && !opt_rebase) {
+		if (opt_ff && !strcmp(opt_ff, "--ff-only"))
+			die(_("The pull was not fast-forward, please either merge or rebase."));
+
+		if (opt_verbosity >= 0 && (!opt_ff || !strcmp(opt_ff, "--ff"))) {
+			advise(_("Pulling without specifying how to reconcile divergent branches is discouraged;\n"
+				"you need to specify if you want a merge, a rebase, or a fast-forward.\n"
+				"You can squelch this message by running one of the following commands:\n"
+				"\n"
+				"  git config pull.rebase false  # merge (the default strategy)\n"
+				"  git config pull.rebase true   # rebase\n"
+				"  git config pull.ff only       # fast-forward only\n"
+				"\n"
+				"You can replace \"git config\" with \"git config --global\" to set a default\n"
+				"preference for all repositories.\n"
+				"If unsure, run \"git pull --merge\".\n"
+				"Read \"git pull --help\" for more information."
+				));
+		}
 	}
 
 	if (opt_rebase >= REBASE_TRUE) {
diff --git a/t/t5520-pull.sh b/t/t5520-pull.sh
index 9fae07cdfa..067780e658 100755
--- a/t/t5520-pull.sh
+++ b/t/t5520-pull.sh
@@ -819,4 +819,54 @@ test_expect_success 'git pull --rebase against local branch' '
 	test_cmp expect file2
 '
 
+setup_other () {
+	test_when_finished "git checkout master && git branch -D other test" &&
+	git checkout -b other $1 &&
+	>new &&
+	git add new &&
+	git commit -m new &&
+	git checkout -b test -t other &&
+	git reset --hard master
+}
+
+setup_ff () {
+	setup_other master
+}
+
+setup_non_ff () {
+	setup_other master^
+}
+
+test_expect_success 'fast-forward (ff-only)' '
+	test_config pull.ff only &&
+	setup_ff &&
+	git pull
+'
+
+test_expect_success 'non-fast-forward (ff-only)' '
+	test_config pull.ff only &&
+	setup_non_ff &&
+	test_must_fail git pull
+'
+
+test_expect_failure 'non-fast-forward with merge (ff-only)' '
+	test_config pull.ff only &&
+	setup_non_ff &&
+	git pull --merge
+'
+
+test_expect_success 'non-fast-forward with rebase (ff-only)' '
+	test_config pull.ff only &&
+	setup_non_ff &&
+	git pull --rebase
+'
+
+test_expect_success 'non-fast-forward error message (ff-only)' '
+	test_config pull.ff only &&
+	setup_non_ff &&
+	test_must_fail git pull 2> error &&
+	cat error &&
+	grep -q "The pull was not fast-forward" error
+'
+
 test_done
-- 
2.29.2


  reply	other threads:[~2020-12-05 20:20 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-12-05 19:52 [PATCH v3 00/16] pull: default warning improvements Felipe Contreras
2020-12-05 19:52 ` [PATCH v3 01/16] doc: pull: explain what is a fast-forward Felipe Contreras
2020-12-07 20:45   ` Junio C Hamano
2020-12-07 22:22     ` Felipe Contreras
2020-12-07 22:40       ` Elijah Newren
2020-12-07 23:08         ` Junio C Hamano
2020-12-08  0:20           ` Felipe Contreras
2020-12-08  0:17         ` Felipe Contreras
2020-12-08  1:23           ` Elijah Newren
2020-12-08 14:37             ` Felipe Contreras
2020-12-08 18:55               ` Felipe Contreras
2020-12-05 19:52 ` [PATCH v3 02/16] pull: improve default warning Felipe Contreras
2020-12-07 20:55   ` Junio C Hamano
2020-12-07 22:29     ` Felipe Contreras
2020-12-05 19:53 ` [PATCH v3 03/16] pull: refactor fast-forward check Felipe Contreras
2020-12-05 19:53 ` [PATCH v3 04/16] pull: cleanup autostash check Felipe Contreras
2020-12-05 19:53 ` [PATCH v3 05/16] pull: trivial cleanup Felipe Contreras
2020-12-05 19:53 ` [PATCH v3 06/16] pull: move default warning Felipe Contreras
2020-12-05 19:53 ` [PATCH v3 07/16] pull: display default warning only when non-ff Felipe Contreras
2020-12-05 19:53 ` [PATCH v3 08/16] pull: trivial whitespace style fix Felipe Contreras
2020-12-05 19:53 ` [PATCH v3 09/16] pull: introduce --merge option Felipe Contreras
2020-12-05 19:53 ` [PATCH v3 10/16] pull: show warning with --ff Felipe Contreras
2020-12-05 19:53 ` [PATCH v3 11/16] rebase: add REBASE_DEFAULT Felipe Contreras
2020-12-05 19:53 ` [PATCH v3 12/16] pull: move configurations fetches Felipe Contreras
2020-12-05 19:53 ` [PATCH v3 13/16] pull: add proper error with --ff-only Felipe Contreras
2020-12-05 20:15   ` Felipe Contreras
2020-12-05 20:19     ` Felipe Contreras [this message]
2020-12-05 20:19       ` [PATCH 2/2] tentative: pull: change the semantics of --ff-only Felipe Contreras
2020-12-05 19:53 ` [PATCH v3 14/16] test: merge-pull-config: trivial cleanup Felipe Contreras
2020-12-05 19:53 ` [PATCH v3 15/16] test: pull-options: revert unnecessary changes Felipe Contreras
2020-12-05 19:53 ` [PATCH v3 16/16] pull: trivial memory fix Felipe Contreras
2020-12-07 20:55 ` [PATCH v3 00/16] pull: default warning improvements Junio C Hamano
2020-12-07 22:33   ` Felipe Contreras

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20201205201933.1560133-1-felipe.contreras@gmail.com \
    --to=felipe.contreras@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=newren@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.