From: Junio C Hamano Date: Fri, 26 Jan 2024 17:57:25 GMT Subject: Re: [PATCH 3/4] completion: reflog with implicit "show" Message-ID: In-Reply-To: <5991b58c-770c-4aaa-bce5-f396d9f7f16f@gmail.com> Rubén Justo writes: > When no subcommand is specified to "reflog", we assume "show" [1]: > > $ git reflog -h > usage: git reflog [show] [] [] > ... > > We are not completing correctly this implicit uses of "show": > > With ... > > $ git checkout -b default > > ... we are not completing "default": > > $ git reflog def > > And we are incorrectly returning the "subcommands" when: > > $ git reflog default > delete expire show > > Let's use __gitcomp_subcommand to correctly handle implicit > subcommands. As with a good bug report, if you are showing an "incorrect" behaviour, you should also illustrate what you think is the "correct" behaviour (see below). > 1. cf39f54efc (git reflog show, 2007-02-08) > > Signed-off-by: Rubén Justo > --- > contrib/completion/git-completion.bash | 9 ++++----- > t/t9902-completion.sh | 8 ++++++++ > 2 files changed, 12 insertions(+), 5 deletions(-) > > diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash > index 5f2e904b56..c41f25aa80 100644 > --- a/contrib/completion/git-completion.bash > +++ b/contrib/completion/git-completion.bash > @@ -2448,13 +2448,12 @@ _git_rebase () > _git_reflog () > { > local subcommands="show delete expire" > - local subcommand="$(__git_find_on_cmdline "$subcommands")" > > - if [ -z "$subcommand" ]; then > - __gitcomp "$subcommands" > - else > - __git_complete_refs > + if __gitcomp_subcommand "$subcommands"; then > + return > fi > + > + __git_complete_refs > } So, when we see something that could be a subcommand we complete it as a subcommand and return. In your example, how should $ git reflog def work? We try to see if there is a subcommand that begins with "def", we see nothing matching, and then run __git_complete_refs? What if the branch you created earlier were not named "default" but, say, "delmonte", and you did "git reflog del"? Shouldn't the user be offered "delete" and "delmonte" as potential completions? > __git_send_email_confirm_options="always never auto cc compose" > diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh > index aa9a614de3..231e17f378 100755 > --- a/t/t9902-completion.sh > +++ b/t/t9902-completion.sh > @@ -2618,6 +2618,14 @@ test_expect_success 'git clone --config= - value' ' > EOF > ' > > +test_expect_success 'git reflog show' ' > + test_when_finished "git checkout -" && > + git checkout -b shown && > + test_completion "git reflog sho" "show " && IOW, shouldn't this offer both show and shown? > + test_completion "git reflog show sho" "shown " && > + test_completion "git reflog shown sho" "shown " > +' > + > test_expect_success 'options with value' ' > test_completion "git merge -X diff-algorithm=" <<-\EOF