Merge branch 'mj/pull-rebase-autostash'
"git pull --rebase" learned "--[no-]autostash" option, so that the rebase.autostash configuration variable set to true can be overridden from the command line. * mj/pull-rebase-autostash: t5520: test --[no-]autostash with pull.rebase=true t5520: reduce commom lines of code t5520: factor out common "failing autostash" code t5520: factor out common "successful autostash" code t5520: use better test to check stderr output t5520: ensure consistent test conditions t5520: use consistent capitalization in test titles pull --rebase: add --[no-]autostash flag git-pull.c: introduce git_pull_config()
This commit is contained in:
commit
7c137bb531
@ -128,6 +128,15 @@ unless you have read linkgit:git-rebase[1] carefully.
|
||||
--no-rebase::
|
||||
Override earlier --rebase.
|
||||
|
||||
--autostash::
|
||||
--no-autostash::
|
||||
Before starting rebase, stash local modifications away (see
|
||||
linkgit:git-stash[1]) if needed, and apply the stash when
|
||||
done. `--no-autostash` is useful to override the `rebase.autoStash`
|
||||
configuration variable (see linkgit:git-config[1]).
|
||||
+
|
||||
This option is only valid when "--rebase" is used.
|
||||
|
||||
Options related to fetching
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|
@ -86,6 +86,8 @@ static char *opt_commit;
|
||||
static char *opt_edit;
|
||||
static char *opt_ff;
|
||||
static char *opt_verify_signatures;
|
||||
static int opt_autostash = -1;
|
||||
static int config_autostash;
|
||||
static struct argv_array opt_strategies = ARGV_ARRAY_INIT;
|
||||
static struct argv_array opt_strategy_opts = ARGV_ARRAY_INIT;
|
||||
static char *opt_gpg_sign;
|
||||
@ -149,6 +151,8 @@ static struct option pull_options[] = {
|
||||
OPT_PASSTHRU(0, "verify-signatures", &opt_verify_signatures, NULL,
|
||||
N_("verify that the named commit has a valid GPG signature"),
|
||||
PARSE_OPT_NOARG),
|
||||
OPT_BOOL(0, "autostash", &opt_autostash,
|
||||
N_("automatically stash/stash pop before and after rebase")),
|
||||
OPT_PASSTHRU_ARGV('s', "strategy", &opt_strategies, N_("strategy"),
|
||||
N_("merge strategy to use"),
|
||||
0),
|
||||
@ -305,6 +309,18 @@ static enum rebase_type config_get_rebase(void)
|
||||
return REBASE_FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Read config variables.
|
||||
*/
|
||||
static int git_pull_config(const char *var, const char *value, void *cb)
|
||||
{
|
||||
if (!strcmp(var, "rebase.autostash")) {
|
||||
config_autostash = git_config_bool(var, value);
|
||||
return 0;
|
||||
}
|
||||
return git_default_config(var, value, cb);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns 1 if there are unstaged changes, 0 otherwise.
|
||||
*/
|
||||
@ -789,6 +805,10 @@ static int run_rebase(const unsigned char *curr_head,
|
||||
argv_array_pushv(&args, opt_strategy_opts.argv);
|
||||
if (opt_gpg_sign)
|
||||
argv_array_push(&args, opt_gpg_sign);
|
||||
if (opt_autostash == 0)
|
||||
argv_array_push(&args, "--no-autostash");
|
||||
else if (opt_autostash == 1)
|
||||
argv_array_push(&args, "--autostash");
|
||||
|
||||
argv_array_push(&args, "--onto");
|
||||
argv_array_push(&args, sha1_to_hex(merge_head));
|
||||
@ -823,7 +843,7 @@ int cmd_pull(int argc, const char **argv, const char *prefix)
|
||||
if (opt_rebase < 0)
|
||||
opt_rebase = config_get_rebase();
|
||||
|
||||
git_config(git_default_config, NULL);
|
||||
git_config(git_pull_config, NULL);
|
||||
|
||||
if (read_cache_unmerged())
|
||||
die_resolve_conflict("Pull");
|
||||
@ -834,13 +854,17 @@ int cmd_pull(int argc, const char **argv, const char *prefix)
|
||||
if (get_sha1("HEAD", orig_head))
|
||||
hashclr(orig_head);
|
||||
|
||||
if (!opt_rebase && opt_autostash != -1)
|
||||
die(_("--[no-]autostash option is only valid with --rebase."));
|
||||
|
||||
if (opt_rebase) {
|
||||
int autostash = 0;
|
||||
int autostash = config_autostash;
|
||||
if (opt_autostash != -1)
|
||||
autostash = opt_autostash;
|
||||
|
||||
if (is_null_sha1(orig_head) && !is_cache_unborn())
|
||||
die(_("Updating an unborn branch with changes added to the index."));
|
||||
|
||||
git_config_get_bool("rebase.autostash", &autostash);
|
||||
if (!autostash)
|
||||
die_on_unclean_work_tree(prefix);
|
||||
|
||||
|
@ -9,6 +9,24 @@ modify () {
|
||||
mv "$2.x" "$2"
|
||||
}
|
||||
|
||||
test_pull_autostash () {
|
||||
git reset --hard before-rebase &&
|
||||
echo dirty >new_file &&
|
||||
git add new_file &&
|
||||
git pull "$@" . copy &&
|
||||
test_cmp_rev HEAD^ copy &&
|
||||
test "$(cat new_file)" = dirty &&
|
||||
test "$(cat file)" = "modified again"
|
||||
}
|
||||
|
||||
test_pull_autostash_fail () {
|
||||
git reset --hard before-rebase &&
|
||||
echo dirty >new_file &&
|
||||
git add new_file &&
|
||||
test_must_fail git pull "$@" . copy 2>err &&
|
||||
test_i18ngrep "uncommitted changes." err
|
||||
}
|
||||
|
||||
test_expect_success setup '
|
||||
echo file >file &&
|
||||
git add file &&
|
||||
@ -247,15 +265,47 @@ test_expect_success '--rebase fails with multiple branches' '
|
||||
|
||||
test_expect_success 'pull --rebase succeeds with dirty working directory and rebase.autostash set' '
|
||||
test_config rebase.autostash true &&
|
||||
git reset --hard before-rebase &&
|
||||
echo dirty >new_file &&
|
||||
git add new_file &&
|
||||
git pull --rebase . copy &&
|
||||
test_cmp_rev HEAD^ copy &&
|
||||
test "$(cat new_file)" = dirty &&
|
||||
test "$(cat file)" = "modified again"
|
||||
test_pull_autostash --rebase
|
||||
'
|
||||
|
||||
test_expect_success 'pull --rebase --autostash & rebase.autostash=true' '
|
||||
test_config rebase.autostash true &&
|
||||
test_pull_autostash --rebase --autostash
|
||||
'
|
||||
|
||||
test_expect_success 'pull --rebase --autostash & rebase.autostash=false' '
|
||||
test_config rebase.autostash false &&
|
||||
test_pull_autostash --rebase --autostash
|
||||
'
|
||||
|
||||
test_expect_success 'pull --rebase --autostash & rebase.autostash unset' '
|
||||
test_unconfig rebase.autostash &&
|
||||
test_pull_autostash --rebase --autostash
|
||||
'
|
||||
|
||||
test_expect_success 'pull --rebase --no-autostash & rebase.autostash=true' '
|
||||
test_config rebase.autostash true &&
|
||||
test_pull_autostash_fail --rebase --no-autostash
|
||||
'
|
||||
|
||||
test_expect_success 'pull --rebase --no-autostash & rebase.autostash=false' '
|
||||
test_config rebase.autostash false &&
|
||||
test_pull_autostash_fail --rebase --no-autostash
|
||||
'
|
||||
|
||||
test_expect_success 'pull --rebase --no-autostash & rebase.autostash unset' '
|
||||
test_unconfig rebase.autostash &&
|
||||
test_pull_autostash_fail --rebase --no-autostash
|
||||
'
|
||||
|
||||
for i in --autostash --no-autostash
|
||||
do
|
||||
test_expect_success "pull $i (without --rebase) is illegal" '
|
||||
test_must_fail git pull $i . copy 2>err &&
|
||||
test_i18ngrep "only valid with --rebase" err
|
||||
'
|
||||
done
|
||||
|
||||
test_expect_success 'pull.rebase' '
|
||||
git reset --hard before-rebase &&
|
||||
test_config pull.rebase true &&
|
||||
@ -264,6 +314,16 @@ test_expect_success 'pull.rebase' '
|
||||
test new = "$(git show HEAD:file2)"
|
||||
'
|
||||
|
||||
test_expect_success 'pull --autostash & pull.rebase=true' '
|
||||
test_config pull.rebase true &&
|
||||
test_pull_autostash --autostash
|
||||
'
|
||||
|
||||
test_expect_success 'pull --no-autostash & pull.rebase=true' '
|
||||
test_config pull.rebase true &&
|
||||
test_pull_autostash_fail --no-autostash
|
||||
'
|
||||
|
||||
test_expect_success 'branch.to-rebase.rebase' '
|
||||
git reset --hard before-rebase &&
|
||||
test_config branch.to-rebase.rebase true &&
|
||||
|
Loading…
Reference in New Issue
Block a user