Message ID | 680f3a3146355e6b09aa2e0f59471c7695954a1b.1616574955.git.liu.denton@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | git-completion.bash: improvements to _git_stash() | expand |
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@gmail.com> > --- > 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 >
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 + if [ -z "$subcommand" ]; then - case "$cur" in - --*) - __gitcomp "$save_opts" + case "$((cword - __git_subcommand_idx)),$cur" in + *,--*) + __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" ;; 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 ;; 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
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@gmail.com> --- contrib/completion/git-completion.bash | 42 ++++++++++++-------------- 1 file changed, 20 insertions(+), 22 deletions(-)