Hi Joel,
On Wed, 4 Apr 2018, Joel Teichroeb wrote:
> diff --git a/builtin/stash--helper.c b/builtin/stash--helper.c
> index 486796bb6a..7c8950bc90 100644
> --- a/builtin/stash--helper.c
> +++ b/builtin/stash--helper.c
> @@ -13,6 +13,7 @@
>
> static const char * const git_stash_helper_usage[] = {
> N_("git stash--helper drop [-q|--quiet] [<stash>]"),
> + N_("git stash--helper pop [--index] [-q|--quiet] [<stash>]"),
> N_("git stash--helper apply [--index] [-q|--quiet] [<stash>]"),
In the shell version, it says `( pop | apply )`. I think we should do that
here, too.
> @@ -508,6 +514,39 @@ static int drop_stash(int argc, const char **argv, const
> char *prefix)
> return ret;
> }
>
> +static int pop_stash(int argc, const char **argv, const char *prefix)
> +{
> + int index = 0, ret;
> + struct stash_info info;
> + struct option options[] = {
> + OPT__QUIET(&quiet, N_("be quiet, only report errors")),
> + OPT_BOOL(0, "index", &index,
> + N_("attempt to recreate the index")),
> + OPT_END()
> + };
> +
> + argc = parse_options(argc, argv, prefix, options,
> + git_stash_helper_pop_usage, 0);
I think we should test argc after this, too.
> +
> + if (get_stash_info(&info, argc, argv))
> + return -1;
> +
> + if (assert_stash_ref(&info)) {
> + free_stash_info(&info);
> + return -1;
> + }
> +
> + if (do_apply_stash(prefix, &info, index)) {
> + printf_ln(_("The stash entry is kept in case you need it
> again."));
> + free_stash_info(&info);
> + return -1;
> + }
The same `if (!ret)` trick to convert &&-chains as I mentioned earlier
could be used here, too.
> +
> + ret = do_drop_stash(prefix, &info);
> + free_stash_info(&info);
> + return ret;
> +}
> +
> static int branch_stash(int argc, const char **argv, const char *prefix)
> {
> const char *branch = NULL;
> @@ -577,6 +616,8 @@ int cmd_stash__helper(int argc, const char **argv, const
> char *prefix)
> result = clear_stash(argc, argv, prefix);
> else if (!strcmp(argv[0], "drop"))
> result = drop_stash(argc, argv, prefix);
> + else if (!strcmp(argv[0], "pop"))
> + result = pop_stash(argc, argv, prefix);
> else if (!strcmp(argv[0], "branch"))
> result = branch_stash(argc, argv, prefix);
> else {
> diff --git a/git-stash.sh b/git-stash.sh
> index c5fd4c6c44..8f2640fe90 100755
> --- a/git-stash.sh
> +++ b/git-stash.sh
> @@ -554,50 +554,6 @@ assert_stash_like() {
> }
> }
>
> -is_stash_ref() {
> - is_stash_like "$@" && test -n "$IS_STASH_REF"
> -}
> -
> -assert_stash_ref() {
> - is_stash_ref "$@" || {
> - args="$*"
> - die "$(eval_gettext "'\$args' is not a stash reference")"
> - }
> -}
> -
> -apply_stash () {
> - cd "$START_DIR"
> - git stash--helper apply "$@"
> - res=$?
> - cd_to_toplevel
> - return $res
> -}
> -
> -pop_stash() {
> - assert_stash_ref "$@"
> -
> - if apply_stash "$@"
> - then
> - drop_stash "$@"
> - else
> - status=$?
> - say "$(gettext "The stash entry is kept in case you need it
> again.")"
> - exit $status
> - fi
> -}
> -
> -drop_stash () {
> - assert_stash_ref "$@"
> -
> - git reflog delete --updateref --rewrite "${REV}" &&
> - say "$(eval_gettext "Dropped \${REV} (\$s)")" ||
> - die "$(eval_gettext "\${REV}: Could not drop stash entry")"
> -
> - # clear_stash if we just dropped the last stash entry
> - git rev-parse --verify --quiet "$ref_stash@{0}" >/dev/null ||
> - clear_stash
> -}
> -
> test "$1" = "-p" && set "push" "$@"
>
> PARSE_CACHE='--not-parsed'
> @@ -634,7 +590,8 @@ push)
> ;;
> apply)
> shift
> - apply_stash "$@"
> + cd "$START_DIR"
> + git stash--helper apply "$@"
> ;;
> clear)
> shift
> @@ -654,7 +611,8 @@ drop)
> ;;
> pop)
> shift
> - pop_stash "$@"
> + cd "$START_DIR"
> + git stash--helper pop "$@"
> ;;
> branch)
> shift
Nice!
Ciao,
Dscho