]> git.ipfire.org Git - thirdparty/git.git/commitdiff
completion: reflog with implicit "show"
authorRubén Justo <rjusto@gmail.com>
Sat, 2 Mar 2024 14:37:34 +0000 (15:37 +0100)
committerJunio C Hamano <gitster@pobox.com>
Sun, 3 Mar 2024 22:21:38 +0000 (14:21 -0800)
When no subcommand is specified to "reflog", we assume "show" [1]:

    $ git reflog -h
    usage: git reflog [show] [<log-options>] [<ref>]
    ...

This implicit "show" is not being completed correctly:

    $ git checkout -b default
    $ git reflog def<TAB><TAB>
    ... no completion options ...

The expected result is:

    $ git reflog default

This happens because we're completing references after seeing a valid
subcommand in the command line.  This prevents the implicit "show" from
working properly, but also introduces a new problem: it keeps offering
subcommand options when the subcommand is implicit:

    $ git checkout -b explore
    $ git reflog default ex<TAB>
    ...
    $ git reflog default expire

The expected result is:

    $ git reflog default explore

To fix this, complete references even if no subcommand is present, or in
other words when the subcommand is implicit "show".

Also, only include completion options for subcommands when completing
the right position in the command line.

  1. cf39f54efc (git reflog show, 2007-02-08)

Signed-off-by: Rubén Justo <rjusto@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
contrib/completion/git-completion.bash
t/t9902-completion.sh

index 8c40ade49411bb883799d79983ad33a696651aa8..ff216f1c6501c7d51d8d8fc2b444db63d21918e8 100644 (file)
@@ -2407,12 +2407,11 @@ _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
+       __git_complete_refs
+
+       if [ $((cword - __git_cmd_idx)) -eq 1 ]; then
+               __gitcompappend "$subcommands" "" "$cur" " "
        fi
 }
 
index aa9a614de33a17f886b7517daeabad5f48bdc42c..dbd57e6a2834618afee1cc2b92c7e66539762884 100755 (executable)
@@ -2618,6 +2618,17 @@ test_expect_success 'git clone --config= - value' '
        EOF
 '
 
+test_expect_success 'git reflog show' '
+       test_when_finished "git checkout - && git branch -d shown" &&
+       git checkout -b shown &&
+       test_completion "git reflog sho" <<-\EOF &&
+       show Z
+       shown Z
+       EOF
+       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