On Wed, Mar 24, 2021 at 01:36:29AM -0700, Denton Liu wrote: > The completion for 'git stash' has not changed in a major way since it > was converted from shell script to builtin. Now that it's a builtin, we > can take advantage of the groundwork laid out by parse-options and use > the generated options. > > Rewrite _git_stash() to take use __gitcomp_builtin() to generate > completions for subcommands. > > The main `git stash` command does not take any arguments directly. If no > subcommand is given, it automatically defaults to `git stash push`. This > means that we can simplify the logic for when no subcommands have been > given yet. We only have to offer subcommand completions when we're > completing a non-option after "stash". > > One area that this patch could improve upon is that the `git stash list` > command accepts log-options. It would be nice if the completion for this > were unified with that of _git_log() and _git_show() which would allow > completions to be provided for options such as `--pretty` but that is > outside the scope of this patch. > > Signed-off-by: Denton Liu <liu.denton@xxxxxxxxx> > --- > contrib/completion/git-completion.bash | 42 ++++++++++++-------------- > 1 file changed, 20 insertions(+), 22 deletions(-) > > diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash > index 8d4d8cc0fe..c926ca26c6 100644 > --- a/contrib/completion/git-completion.bash > +++ b/contrib/completion/git-completion.bash > @@ -3013,26 +3013,19 @@ _git_sparse_checkout () > > _git_stash () > { > - local save_opts='--all --keep-index --no-keep-index --quiet --patch --include-untracked' > local subcommands='push list show apply clear drop pop create branch' > local subcommand="$(__git_find_on_cmdline "$subcommands save")" > - if [ -z "$subcommand" -a -n "$(__git_find_on_cmdline "-p")" ]; then > - subcommand="push" > - fi I think it would be better to keep this condition ... > + > if [ -z "$subcommand" ]; then > - case "$cur" in > - --*) > - __gitcomp "$save_opts" > + case "$((cword - __git_subcommand_idx)),$cur" in ... and not bring in such magic with the indices here and ... > + *,--*) > + __gitcomp_builtin stash_push > ;; > - sa*) > - if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then > - __gitcomp "save" > - fi > + 1,sa*) > + __gitcomp "save" > ;; > - *) > - if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then > - __gitcomp "$subcommands" > - fi > + 1,*) > + __gitcomp "$subcommands" ... here in these two case arms, but instead handle the cases both with and without a subcommand in a unified case statement as I suggested in reply to the previous patch. > ;; > esac > return > @@ -3040,24 +3033,29 @@ _git_stash () > > case "$subcommand,$cur" in > push,--*) > - __gitcomp "$save_opts --message" > + __gitcomp_builtin stash_push > ;; > save,--*) > - __gitcomp "$save_opts" > + __gitcomp_builtin stash_save > ;; > - apply,--*|pop,--*) > - __gitcomp "--index --quiet" > + pop,--*) > + __gitcomp_builtin stash_pop > + ;; > + apply,--*) > + __gitcomp_builtin stash_apply > ;; > drop,--*) > - __gitcomp "--quiet" > + __gitcomp_builtin stash_drop > ;; These case arms are still quite repetitive, and could be handled by a single arm like this: *,--*) __gitcomp_builtin stash_$subcommand ;; Of course the more specific 'list,--*' and 'show,--*' cases should be handled before. The end result would look something like this (taken from a WIP patch series of mine, which has been in a WIP state for about a year and a half now...): https://github.com/szeder/git/commit/83a0e138767040280750062c5c0d43886796fcb1 > list,--*) > - __gitcomp "--name-status --oneline --patch-with-stat" > + # NEEDSWORK: can we somehow unify this with the options in _git_log() and _git_show() > + __gitcomp_builtin stash_list "$__git_log_common_options $__git_diff_common_options" > ;; > show,--*) > - __gitcomp "$__git_diff_common_options" > + __gitcomp_builtin stash_show "$__git_diff_common_options" > ;; > branch,--*) > + __gitcomp_builtin stash_branch > ;; > branch,*) > if [ $cword -eq $((__git_subcommand_idx+2)) ]; then > -- > 2.31.0.rc2.261.g7f71774620 >