Merge branch 'ly/pull-autostash'
"git pull" learned to pay attention to pull.autostash configuration variable, which overrides rebase/merge.autostash. * ly/pull-autostash: pull: add pull.autoStash config option
This commit is contained in:
@@ -29,5 +29,21 @@ pull.octopus::
|
|||||||
The default merge strategy to use when pulling multiple branches
|
The default merge strategy to use when pulling multiple branches
|
||||||
at once.
|
at once.
|
||||||
|
|
||||||
|
pull.autoStash::
|
||||||
|
When set to true, automatically create a temporary stash entry
|
||||||
|
to record the local changes before the operation begins, and
|
||||||
|
restore them after the operation completes. When your "git
|
||||||
|
pull" rebases (instead of merges), this may be convenient, since
|
||||||
|
unlike merging pull that tolerates local changes that do not
|
||||||
|
interfere with the merge, rebasing pull refuses to work with any
|
||||||
|
local changes.
|
||||||
|
+
|
||||||
|
If `pull.autostash` is set (either to true or false),
|
||||||
|
`merge.autostash` and `rebase.autostash` are ignored. If
|
||||||
|
`pull.autostash` is not set at all, depending on the value of
|
||||||
|
`pull.rebase`, `merge.autostash` or `rebase.autostash` is used
|
||||||
|
instead. Can be overridden by the `--[no-]autostash` command line
|
||||||
|
option.
|
||||||
|
|
||||||
pull.twohead::
|
pull.twohead::
|
||||||
The default merge strategy to use when pulling a single branch.
|
The default merge strategy to use when pulling a single branch.
|
||||||
|
|||||||
@@ -90,7 +90,8 @@ static char *opt_ff;
|
|||||||
static const char *opt_verify_signatures;
|
static const char *opt_verify_signatures;
|
||||||
static const char *opt_verify;
|
static const char *opt_verify;
|
||||||
static int opt_autostash = -1;
|
static int opt_autostash = -1;
|
||||||
static int config_autostash;
|
static int config_rebase_autostash;
|
||||||
|
static int config_pull_autostash = -1;
|
||||||
static int check_trust_level = 1;
|
static int check_trust_level = 1;
|
||||||
static struct strvec opt_strategies = STRVEC_INIT;
|
static struct strvec opt_strategies = STRVEC_INIT;
|
||||||
static struct strvec opt_strategy_opts = STRVEC_INIT;
|
static struct strvec opt_strategy_opts = STRVEC_INIT;
|
||||||
@@ -367,7 +368,18 @@ static int git_pull_config(const char *var, const char *value,
|
|||||||
const struct config_context *ctx, void *cb)
|
const struct config_context *ctx, void *cb)
|
||||||
{
|
{
|
||||||
if (!strcmp(var, "rebase.autostash")) {
|
if (!strcmp(var, "rebase.autostash")) {
|
||||||
config_autostash = git_config_bool(var, value);
|
/*
|
||||||
|
* run_rebase() also reads this option. The reason we handle it here is
|
||||||
|
* that when pull.rebase is true, a fast-forward may occur without
|
||||||
|
* invoking run_rebase(). We need to ensure that autostash is set even
|
||||||
|
* in the fast-forward case.
|
||||||
|
*
|
||||||
|
* run_merge() handles merge.autostash, so we don't handle it here.
|
||||||
|
*/
|
||||||
|
config_rebase_autostash = git_config_bool(var, value);
|
||||||
|
return 0;
|
||||||
|
} else if (!strcmp(var, "pull.autostash")) {
|
||||||
|
config_pull_autostash = git_config_bool(var, value);
|
||||||
return 0;
|
return 0;
|
||||||
} else if (!strcmp(var, "submodule.recurse")) {
|
} else if (!strcmp(var, "submodule.recurse")) {
|
||||||
recurse_submodules = git_config_bool(var, value) ?
|
recurse_submodules = git_config_bool(var, value) ?
|
||||||
@@ -1006,6 +1018,8 @@ int cmd_pull(int argc,
|
|||||||
}
|
}
|
||||||
|
|
||||||
argc = parse_options(argc, argv, prefix, pull_options, pull_usage, 0);
|
argc = parse_options(argc, argv, prefix, pull_options, pull_usage, 0);
|
||||||
|
if (opt_autostash == -1)
|
||||||
|
opt_autostash = config_pull_autostash;
|
||||||
|
|
||||||
if (recurse_submodules_cli != RECURSE_SUBMODULES_DEFAULT)
|
if (recurse_submodules_cli != RECURSE_SUBMODULES_DEFAULT)
|
||||||
recurse_submodules = recurse_submodules_cli;
|
recurse_submodules = recurse_submodules_cli;
|
||||||
@@ -1052,7 +1066,7 @@ int cmd_pull(int argc,
|
|||||||
|
|
||||||
if (opt_rebase) {
|
if (opt_rebase) {
|
||||||
if (opt_autostash == -1)
|
if (opt_autostash == -1)
|
||||||
opt_autostash = config_autostash;
|
opt_autostash = config_rebase_autostash;
|
||||||
|
|
||||||
if (is_null_oid(&orig_head) && !is_index_unborn(the_repository->index))
|
if (is_null_oid(&orig_head) && !is_index_unborn(the_repository->index))
|
||||||
die(_("Updating an unborn branch with changes added to the index."));
|
die(_("Updating an unborn branch with changes added to the index."));
|
||||||
|
|||||||
@@ -472,6 +472,66 @@ test_expect_success 'pull --no-autostash & merge.autostash unset' '
|
|||||||
test_pull_autostash_fail --no-autostash --no-rebase
|
test_pull_autostash_fail --no-autostash --no-rebase
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'pull succeeds with dirty working directory and pull.autostash=true' '
|
||||||
|
test_config pull.autostash true &&
|
||||||
|
test_pull_autostash 1 --rebase &&
|
||||||
|
test_pull_autostash 2 --no-rebase &&
|
||||||
|
test_pull_autostash 1 --autostash --rebase &&
|
||||||
|
test_pull_autostash 2 --autostash --no-rebase
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'pull fails with dirty working directory and pull.autostash=false' '
|
||||||
|
test_config pull.autostash false &&
|
||||||
|
test_pull_autostash_fail --rebase &&
|
||||||
|
test_pull_autostash_fail --no-rebase &&
|
||||||
|
test_pull_autostash_fail --no-autostash --rebase &&
|
||||||
|
test_pull_autostash_fail --no-autostash --no-rebase
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'pull --autostash overrides pull.autostash=false' '
|
||||||
|
test_config pull.autostash false &&
|
||||||
|
test_pull_autostash 1 --autostash --rebase &&
|
||||||
|
test_pull_autostash 2 --autostash --no-rebase
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'pull --no-autostash overrides pull.autostash=true' '
|
||||||
|
test_config pull.autostash true &&
|
||||||
|
test_pull_autostash_fail --no-autostash --rebase &&
|
||||||
|
test_pull_autostash_fail --no-autostash --no-rebase
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'pull.autostash=true overrides rebase.autostash' '
|
||||||
|
test_config pull.autostash true &&
|
||||||
|
test_config rebase.autostash true &&
|
||||||
|
test_pull_autostash 1 --rebase &&
|
||||||
|
test_config rebase.autostash false &&
|
||||||
|
test_pull_autostash 1 --rebase
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'pull.autostash=false overrides rebase.autostash' '
|
||||||
|
test_config pull.autostash false &&
|
||||||
|
test_config rebase.autostash true &&
|
||||||
|
test_pull_autostash_fail --rebase &&
|
||||||
|
test_config rebase.autostash false &&
|
||||||
|
test_pull_autostash_fail --rebase
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'pull.autostash=true overrides merge.autostash' '
|
||||||
|
test_config pull.autostash true &&
|
||||||
|
test_config merge.autostash true &&
|
||||||
|
test_pull_autostash 2 --no-rebase &&
|
||||||
|
test_config merge.autostash false &&
|
||||||
|
test_pull_autostash 2 --no-rebase
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'pull.autostash=false overrides merge.autostash' '
|
||||||
|
test_config pull.autostash false &&
|
||||||
|
test_config merge.autostash true &&
|
||||||
|
test_pull_autostash_fail --no-rebase &&
|
||||||
|
test_config merge.autostash false &&
|
||||||
|
test_pull_autostash_fail --no-rebase
|
||||||
|
'
|
||||||
|
|
||||||
test_expect_success 'pull.rebase' '
|
test_expect_success 'pull.rebase' '
|
||||||
git reset --hard before-rebase &&
|
git reset --hard before-rebase &&
|
||||||
test_config pull.rebase true &&
|
test_config pull.rebase true &&
|
||||||
|
|||||||
Reference in New Issue
Block a user