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