pull: display default warning only when non-ff

There's no need to display the annoying warning on every pull... only
the ones that are not fast-forward.

The current warning tests still pass, but not because of the arguments
or the configuration, but because they are all fast-forward.

We need to test non-fast-forward situations now.

Suggestions-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Felipe Contreras 2020-12-12 10:52:08 -06:00 committed by Junio C Hamano
parent 7539fdc629
commit c525de335e
2 changed files with 66 additions and 7 deletions

View file

@ -949,6 +949,7 @@ int cmd_pull(int argc, const char **argv, const char *prefix)
struct object_id rebase_fork_point; struct object_id rebase_fork_point;
int autostash; int autostash;
int rebase_unspecified = 0; int rebase_unspecified = 0;
int can_ff;
if (!getenv("GIT_REFLOG_ACTION")) if (!getenv("GIT_REFLOG_ACTION"))
set_reflog_message(argc, argv); set_reflog_message(argc, argv);
@ -1044,7 +1045,9 @@ int cmd_pull(int argc, const char **argv, const char *prefix)
if (opt_rebase && merge_heads.nr > 1) if (opt_rebase && merge_heads.nr > 1)
die(_("Cannot rebase onto multiple branches.")); die(_("Cannot rebase onto multiple branches."));
if (rebase_unspecified && !opt_ff) { can_ff = get_can_ff(&orig_head, &merge_heads.oid[0]);
if (rebase_unspecified && !opt_ff && !can_ff) {
if (opt_verbosity >= 0) if (opt_verbosity >= 0)
show_advice_pull_non_ff(); show_advice_pull_non_ff();
} }
@ -1063,7 +1066,7 @@ int cmd_pull(int argc, const char **argv, const char *prefix)
submodule_touches_in_range(the_repository, &upstream, &curr_head)) submodule_touches_in_range(the_repository, &upstream, &curr_head))
die(_("cannot rebase with locally recorded submodule modifications")); die(_("cannot rebase with locally recorded submodule modifications"));
if (!autostash) { if (!autostash) {
if (get_can_ff(&orig_head, &merge_heads.oid[0])) { if (can_ff) {
/* we can fast-forward this without invoking rebase */ /* we can fast-forward this without invoking rebase */
opt_ff = "--ff-only"; opt_ff = "--ff-only";
ran_ff = 1; ran_ff = 1;

View file

@ -29,11 +29,8 @@ test_expect_success 'setup' '
test_expect_success 'pull.rebase not set' ' test_expect_success 'pull.rebase not set' '
git reset --hard c0 && git reset --hard c0 &&
git -c color.advice=always pull . c1 2>err && git pull . c1 2>err &&
test_decode_color <err >decoded && test_i18ngrep ! "Pulling without specifying how to reconcile" err
test_i18ngrep "<YELLOW>hint: " decoded &&
test_i18ngrep "Pulling without specifying how to reconcile" decoded
' '
test_expect_success 'pull.rebase not set and pull.ff=true' ' test_expect_success 'pull.rebase not set and pull.ff=true' '
@ -87,6 +84,65 @@ test_expect_success 'pull.rebase not set and --ff-only given' '
test_i18ngrep ! "Pulling without specifying how to reconcile" err test_i18ngrep ! "Pulling without specifying how to reconcile" err
' '
test_expect_success 'pull.rebase not set (not-fast-forward)' '
git reset --hard c2 &&
git -c color.advice=always pull . c1 2>err &&
test_decode_color <err >decoded &&
test_i18ngrep "<YELLOW>hint: " decoded &&
test_i18ngrep "Pulling without specifying how to reconcile" decoded
'
test_expect_success 'pull.rebase not set and pull.ff=true (not-fast-forward)' '
git reset --hard c2 &&
test_config pull.ff true &&
git pull . c1 2>err &&
test_i18ngrep ! "Pulling without specifying how to reconcile" err
'
test_expect_success 'pull.rebase not set and pull.ff=false (not-fast-forward)' '
git reset --hard c2 &&
test_config pull.ff false &&
git pull . c1 2>err &&
test_i18ngrep ! "Pulling without specifying how to reconcile" err
'
test_expect_success 'pull.rebase not set and pull.ff=only (not-fast-forward)' '
git reset --hard c2 &&
test_config pull.ff only &&
test_must_fail git pull . c1 2>err &&
test_i18ngrep ! "Pulling without specifying how to reconcile" err
'
test_expect_success 'pull.rebase not set and --rebase given (not-fast-forward)' '
git reset --hard c2 &&
git pull --rebase . c1 2>err &&
test_i18ngrep ! "Pulling without specifying how to reconcile" err
'
test_expect_success 'pull.rebase not set and --no-rebase given (not-fast-forward)' '
git reset --hard c2 &&
git pull --no-rebase . c1 2>err &&
test_i18ngrep ! "Pulling without specifying how to reconcile" err
'
test_expect_success 'pull.rebase not set and --ff given (not-fast-forward)' '
git reset --hard c2 &&
git pull --ff . c1 2>err &&
test_i18ngrep ! "Pulling without specifying how to reconcile" err
'
test_expect_success 'pull.rebase not set and --no-ff given (not-fast-forward)' '
git reset --hard c2 &&
git pull --no-ff . c1 2>err &&
test_i18ngrep ! "Pulling without specifying how to reconcile" err
'
test_expect_success 'pull.rebase not set and --ff-only given (not-fast-forward)' '
git reset --hard c2 &&
test_must_fail git pull --ff-only . c1 2>err &&
test_i18ngrep ! "Pulling without specifying how to reconcile" err
'
test_expect_success 'merge c1 with c2' ' test_expect_success 'merge c1 with c2' '
git reset --hard c1 && git reset --hard c1 &&
test -f c0.c && test -f c0.c &&