]> git.ipfire.org Git - thirdparty/git.git/commitdiff
pull: abort if --ff-only is given and fast-forwarding is impossible
authorAlex Henrie <alexhenrie24@gmail.com>
Wed, 21 Jul 2021 01:42:19 +0000 (01:42 +0000)
committerJunio C Hamano <gitster@pobox.com>
Wed, 21 Jul 2021 04:43:12 +0000 (21:43 -0700)
The warning about pulling without specifying how to reconcile divergent
branches says that after setting pull.rebase to true, --ff-only can
still be passed on the command line to require a fast-forward. Make that
actually work.

Signed-off-by: Alex Henrie <alexhenrie24@gmail.com>
[en: updated tests; note 3 fixes and 1 new failure]
Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
advice.c
advice.h
builtin/merge.c
builtin/pull.c
t/t7601-merge-pull-config.sh

index 0b9c89c48ab996da0e7938ac0667a3ecad925efc..337e8f342bcd30a44f577ae217e7aafb35a781e7 100644 (file)
--- a/advice.c
+++ b/advice.c
@@ -286,6 +286,11 @@ void NORETURN die_conclude_merge(void)
        die(_("Exiting because of unfinished merge."));
 }
 
+void NORETURN die_ff_impossible(void)
+{
+       die(_("Not possible to fast-forward, aborting."));
+}
+
 void advise_on_updating_sparse_paths(struct string_list *pathspec_list)
 {
        struct string_list_item *item;
index bd26c385d00dd3af9e9bbd60812697607107b8dd..1624043838785db3f4496dc6f70468dc22cc387c 100644 (file)
--- a/advice.h
+++ b/advice.h
@@ -95,6 +95,7 @@ void advise_if_enabled(enum advice_type type, const char *advice, ...);
 int error_resolve_conflict(const char *me);
 void NORETURN die_resolve_conflict(const char *me);
 void NORETURN die_conclude_merge(void);
+void NORETURN die_ff_impossible(void);
 void advise_on_updating_sparse_paths(struct string_list *pathspec_list);
 void detach_advice(const char *new_name);
 
index a8a843b1f541134b59f465cb7d6d9acd1faf9525..aa920ac524f091485e3a1302b04490de33759607 100644 (file)
@@ -1620,7 +1620,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
        }
 
        if (fast_forward == FF_ONLY)
-               die(_("Not possible to fast-forward, aborting."));
+               die_ff_impossible();
 
        if (autostash)
                create_autostash(the_repository,
index 3e13f8108432fe03b6cb5e10b4b3fe737e9db0f4..d97966048259b492ba75f2c9c66042772532c680 100644 (file)
@@ -1046,9 +1046,14 @@ int cmd_pull(int argc, const char **argv, const char *prefix)
 
        can_ff = get_can_ff(&orig_head, &merge_heads.oid[0]);
 
-       if (rebase_unspecified && !opt_ff && !can_ff) {
-               if (opt_verbosity >= 0)
-                       show_advice_pull_non_ff();
+       if (!can_ff) {
+               if (opt_ff) {
+                       if (!strcmp(opt_ff, "--ff-only"))
+                               die_ff_impossible();
+               } else {
+                       if (rebase_unspecified && opt_verbosity >= 0)
+                               show_advice_pull_non_ff();
+               }
        }
 
        if (opt_rebase) {
index 21db1e9e14b6d3a098d0be02c8689f329a2dda4f..d1f621725ad27bd5e45dff81961bd522d737d5ad 100755 (executable)
@@ -209,11 +209,11 @@ test_attempts_fast_forward () {
 # Group 1: Interaction of --ff-only with --[no-]rebase
 # (And related interaction of pull.ff=only with pull.rebase)
 #
-test_expect_failure '--ff-only overrides --rebase' '
+test_expect_success '--ff-only overrides --rebase' '
        test_attempts_fast_forward pull --rebase --ff-only
 '
 
-test_expect_failure '--ff-only overrides --rebase even if first' '
+test_expect_success '--ff-only overrides --rebase even if first' '
        test_attempts_fast_forward pull --ff-only --rebase
 '
 
@@ -221,7 +221,7 @@ test_expect_success '--ff-only overrides --no-rebase' '
        test_attempts_fast_forward pull --ff-only --no-rebase
 '
 
-test_expect_failure 'pull.ff=only overrides pull.rebase=true' '
+test_expect_success 'pull.ff=only overrides pull.rebase=true' '
        test_attempts_fast_forward -c pull.ff=only -c pull.rebase=true pull
 '
 
@@ -252,7 +252,7 @@ test_expect_success 'pull.rebase=true overrides pull.ff=true' '
 '
 
 # Group 3: command line flags take precedence over config
-test_expect_failure '--ff-only takes precedence over pull.rebase=true' '
+test_expect_success '--ff-only takes precedence over pull.rebase=true' '
        test_attempts_fast_forward -c pull.rebase=true pull --ff-only
 '
 
@@ -264,7 +264,7 @@ test_expect_failure '--no-rebase takes precedence over pull.ff=only' '
        test_falls_back_to_full_merge -c pull.ff=only pull --no-rebase
 '
 
-test_expect_success '--rebase takes precedence over pull.ff=only' '
+test_expect_failure '--rebase takes precedence over pull.ff=only' '
        test_does_rebase -c pull.ff=only pull --rebase
 '