completion: reflog with implicit "show"

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>

Rubén Justo committed Mar 2, 2024 at 15:37 UTC 85452a1d4b582701772b02b5a70b8bf5a82258bc
2 files changed +15 -5
contrib/completion/git-completion.bash
+4 -5
@@ -2407,12 +2407,11 @@ _git_rebase ()
2407 _git_reflog ()
2408 {
2409 local subcommands="show delete expire"
2410 - local subcommand="$(__git_find_on_cmdline "$subcommands")"
2410
2412 - if [ -z "$subcommand" ]; then
2413 - __gitcomp "$subcommands"
2414 - else
2415 - __git_complete_refs
2411 + __git_complete_refs
2412 +
2413 + if [ $((cword - __git_cmd_idx)) -eq 1 ]; then
2414 + __gitcompappend "$subcommands" "" "$cur" " "
2415 fi
2416 }
2417
t/t9902-completion.sh
+11
@@ -2618,6 +2618,17 @@ test_expect_success 'git clone --config= - value' '
2618 EOF
2619 '
2620
2621 +test_expect_success 'git reflog show' '
2622 + test_when_finished "git checkout - && git branch -d shown" &&
2623 + git checkout -b shown &&
2624 + test_completion "git reflog sho" <<-\EOF &&
2625 + show Z
2626 + shown Z
2627 + EOF
2628 + test_completion "git reflog show sho" "shown " &&
2629 + test_completion "git reflog shown sho" "shown "
2630 +'
2631 +
2632 test_expect_success 'options with value' '
2633 test_completion "git merge -X diff-algorithm=" <<-\EOF
2634