On Wed, Mar 9, 2016 at 12:18 PM, Mehul Jain <[email protected]> wrote:
> If rebase.autoStash configuration variable is set, there is no way to
> override it for "git pull --rebase" from the command line.
>
> Teach "git pull --rebase" the --[no-]autostash command line flag which
> overrides the current value of rebase.autoStash, if set. As "git rebase"
> understands the --[no-]autostash option, it's just a matter of passing
> the option to underlying "git rebase" when "git pull --rebase" is called.
>
> Helped-by: Matthieu Moy <[email protected]>
> Helped-by: Junio C Hamano <[email protected]>
> Helped-by: Paul Tan <[email protected]>
> Helped-by: Eric Sunshine <[email protected]>
> Signed-off-by: Mehul Jain <[email protected]>
> ---
> Previous patches: $gname287709
>
> Changes:
> - Slight change is documentation.
>
> Documentation/git-pull.txt | 9 +++++++++
> builtin/pull.c | 16 ++++++++++++++--
> t/t5520-pull.sh | 39 +++++++++++++++++++++++++++++++++++++++
> 3 files changed, 62 insertions(+), 2 deletions(-)
>
> diff --git a/Documentation/git-pull.txt b/Documentation/git-pull.txt
> index a62a2a6..da89be6 100644
> --- a/Documentation/git-pull.txt
> +++ b/Documentation/git-pull.txt
> @@ -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.txt[1]) if needed, and apply the stash when
> + done (this option is only valid when "--rebase" is used).
> ++
> +`--no-autostash` is useful to override the `rebase.autoStash`
> +configuration variable (see linkgit:git-config[1]).
> +
> Options related to fetching
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~
>
> diff --git a/builtin/pull.c b/builtin/pull.c
> index 8a318e9..a01058a 100644
> --- a/builtin/pull.c
> +++ b/builtin/pull.c
> @@ -86,6 +86,7 @@ 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 = -1;
Hmm, why can't config_autostash just default to 0?
> static struct argv_array opt_strategies = ARGV_ARRAY_INIT;
> static struct argv_array opt_strategy_opts = ARGV_ARRAY_INIT;
> @@ -150,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),
> @@ -801,6 +804,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 == 1)
> + argv_array_push(&args, "--autostash");
> + else if (opt_autostash == 0)
> + argv_array_push(&args, "--no-autostash");
The precise testing for specific values of -1, 0 and 1 throughout the
code makes me uncomfortable. Ordinarily, I would expect a simple
argv_array_push(&args, opt_autostash ? "--autostash" : "--no-autostash");
Stepping back a bit, the only reason why we introduced opt_autostash =
-1 as a possible value is because we need to detect if
--[no-]autostash is being used with git-merge. I consider that a
kludge, because if git-merge supports --autostash as well (possibly in
the future), then we will not need this -1 value.
So, from that point of view, a -1 value is okay as a workaround, but
kludges, and hence the -1 value, should be gotten rid off as soon as
possible.
>
> argv_array_push(&args, "--onto");
> argv_array_push(&args, sha1_to_hex(merge_head));
> @@ -851,12 +858,17 @@ int cmd_pull(int argc, const char **argv, const char
> *prefix)
> if (is_null_sha1(orig_head) && !is_cache_unborn())
> die(_("Updating an unborn branch with changes added
> to the index."));
>
> - if (config_autostash != 1)
> + if (opt_autostash == -1)
> + opt_autostash = config_autostash;
So, if config_autostash defaults to zero, we can be certain that
opt_autostash will be either true or false.
> +
> + if (opt_autostash != 1)
And then we can do if (!opt_autostash) here, instead of making readers
wonder why we are testing for the value "1" specifically.
> die_on_unclean_work_tree(prefix);
>
> if (get_rebase_fork_point(rebase_fork_point, repo, *refspecs))
> hashclr(rebase_fork_point);
> - }
> + } else
> + if (opt_autostash != -1)
> + die(_("--[no-]autostash option is only valid with
> --rebase."));
>
> if (run_fetch(repo, refspecs))
> return 1;
Thanks,
Paul
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html