[PATCH v2] builtin/pull.c: teach run_merge() to honor rebase.autostash config
From: John Cai <hidden>
Date: 2022-01-06 14:59:06
Subsystem:
the rest · Maintainer:
Linus Torvalds
On a git pull --rebase, if fast forward is possible we run merge.
However, merge will not honor rebase.autostash if it is configured. This
has the unfortunate result of
$ git config rebase.autostash true
$ git pull --rebase
to ignore the rebase.autostash value.
Allow run_merge() to honor rebase.autostash by passing in
config_autostash if --autostash or --no-autostash flags are not
explicitly set.
Reported-by: "Tilman Vogel" <redacted>
Co-authored-by: "Junio C Hamano" [off-list ref]
Signed-off-by: "John Cai" <redacted>
---
Notes:
Fix a bug that prevents git pull --rebase from honoring the rebase.autostash
config value.
Changes since V1:
- used simpler fix as proposed by Junio
- removed redundant test cases
builtin/pull.c | 9 ++++++++-
t/t5521-pull-options.sh | 12 ++++++++++++
2 files changed, 20 insertions(+), 1 deletion(-)
diff --git a/builtin/pull.c b/builtin/pull.c
index 100cbf9fb8..8423e420ee 100644
--- a/builtin/pull.c
+++ b/builtin/pull.c@@ -1133,7 +1133,14 @@ int cmd_pull(int argc, const char **argv, const char *prefix) die(_("cannot rebase with locally recorded submodule modifications")); if (can_ff) { - /* we can fast-forward this without invoking rebase */ + /* + * We can fast-forward without invoking + * rebase, by calling run_merge(). But we + * have to allow rebase.autostash=true to kick + * in. + */ + if (opt_autostash < 0) + opt_autostash = config_autostash; opt_ff = "--ff-only"; ret = run_merge(); } else {
diff --git a/t/t5521-pull-options.sh b/t/t5521-pull-options.sh
index 66cfcb09c5..66fac99d2b 100755
--- a/t/t5521-pull-options.sh
+++ b/t/t5521-pull-options.sh@@ -252,4 +252,16 @@ test_expect_success 'git pull --no-verify --verify passed to merge' ' test_must_fail git -C dst pull --no-ff --no-verify --verify ' +test_expect_success 'git pull --rebase --autostash succeeds on ff' ' + test_when_finished "rm -fr src dst actual" && + git init src && + test_commit -C src "initial" file "content" && + git clone src dst && + test_commit -C src --printf "more_content" file "more content\ncontent\n" && + echo "dirty" >>dst/file && + git -C dst pull --rebase --autostash >actual 2>&1 && + grep -q "Fast-forward" actual && + grep -q "Applied autostash." actual +' + test_done
--
2.34.1