completion: improve completion for git switch with no options

Add a new --mode option to __git_complete_refs, which allows changing
the behavior to call __git_heads instead of __git_refs.

By passing --mode=heads, __git_complete_refs will only output local
branches. This enables using "--mode=heads --dwim" to enable listing
local branches and the remote unique branch names for DWIM.

Refactor completion support to use the new mode option, rather than
calling __git_heads directly. This has the advantage that we can now
correctly allow local branches along with suitable DWIM refs, rather
than only allowing DWIM when we complete all references.

Choose what mode it uses when calling __git_complete_refs. If -d or
--detach have been provided, then simply complete all refs, but
*without* the DWIM option as these DWIM names won't work properly in
--detach mode.

Otherwise, call __git_complete_refs with the default dwim_opt value and
use the new "heads" mode.

In this way, the basic support for completing just "git switch <TAB>"
will result in only local branches and remote unique names for DWIM.

The basic no-options tests for git switch, as well as several of the
-c/-C tests now pass, so remove the known breakage tags.

Signed-off-by: Jacob Keller <jacob.keller@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jacob Keller 2020-05-28 11:10:44 -07:00 committed by Junio C Hamano
parent 4e79adf4e5
commit 68d97c7fdd
2 changed files with 26 additions and 25 deletions

View File

@ -782,9 +782,12 @@ __git_refs ()
# word to be completed.
# --sfx=<suffix>: A suffix to be appended to each ref instead of the default
# space.
# --mode=<mode>: What set of refs to complete, one of 'refs' (the default) to
# complete all refs, 'heads' to complete only branches. Note
# that --remote is only compatible with --mode=refs.
__git_complete_refs ()
{
local remote dwim pfx cur_="$cur" sfx=" "
local remote dwim pfx cur_="$cur" sfx=" " mode="refs"
while test $# != 0; do
case "$1" in
@ -795,13 +798,23 @@ __git_complete_refs ()
--pfx=*) pfx="${1##--pfx=}" ;;
--cur=*) cur_="${1##--cur=}" ;;
--sfx=*) sfx="${1##--sfx=}" ;;
--mode=*) mode="${1##--mode=}" ;;
*) return 1 ;;
esac
shift
done
__gitcomp_direct "$(__git_refs "$remote" "" "$pfx" "$cur_" "$sfx")"
# complete references based on the specified mode
case "$mode" in
refs)
__gitcomp_direct "$(__git_refs "$remote" "" "$pfx" "$cur_" "$sfx")" ;;
heads)
__gitcomp_direct "$(__git_heads "$pfx" "$cur_" "$sfx")" ;;
*)
return 1 ;;
esac
# Append DWIM remote branch names if requested
if [ "$dwim" = "yes" ]; then
__gitcomp_direct_append "$(__git_dwim_remote_heads "$pfx" "$cur_" "$sfx")"
fi
@ -2324,18 +2337,12 @@ _git_switch ()
__gitcomp_builtin switch
;;
*)
local dwim_opt="$(__git_checkout_default_dwim_mode)" only_local_ref=n
if [ -z "$(__git_find_on_cmdline "-d --detach")" ]; then
only_local_ref=y
local dwim_opt="$(__git_checkout_default_dwim_mode)"
if [ -n "$(__git_find_on_cmdline "-d --detach")" ]; then
__git_complete_refs --mode="refs"
else
# --guess --detach is invalid combination, no
# dwim will be done when --detach is specified
dwim_opt=
fi
if [ $only_local_ref = y -a -z "$dwim_opt" ]; then
__gitcomp_direct "$(__git_heads "" "$cur" " ")"
else
__git_complete_refs $dwim_opt
__git_complete_refs $dwim_opt --mode="heads"
fi
;;
esac

View File

@ -1240,8 +1240,7 @@ test_expect_success '__git_complete_fetch_refspecs - fully qualified & prefix' '
test_cmp expected out
'
#TODO: git switch completion includes unexpected references
test_expect_failure 'git switch - with no options, complete local branches and unique remote branch names for DWIM logic' '
test_expect_success 'git switch - with no options, complete local branches and unique remote branch names for DWIM logic' '
test_completion "git switch " <<-\EOF
branch-in-other Z
master Z
@ -1277,8 +1276,7 @@ test_expect_success 'git switch - with GIT_COMPLETION_CHECKOUT_NO_GUESS=1, compl
EOF
'
#TODO: git switch completion includes unexpected references
test_expect_failure 'git switch - --guess overrides GIT_COMPLETION_CHECKOUT_NO_GUESS=1, complete local branches and unique remote names for DWIM logic' '
test_expect_success 'git switch - --guess overrides GIT_COMPLETION_CHECKOUT_NO_GUESS=1, complete local branches and unique remote names for DWIM logic' '
GIT_COMPLETION_CHECKOUT_NO_GUESS=1 test_completion "git switch --guess " <<-\EOF
branch-in-other Z
master Z
@ -1287,8 +1285,7 @@ test_expect_failure 'git switch - --guess overrides GIT_COMPLETION_CHECKOUT_NO_G
EOF
'
#TODO: git switch completion includes unexpected references
test_expect_failure 'git switch - a later --guess overrides previous --no-guess, complete local and remote unique branches for DWIM' '
test_expect_success 'git switch - a later --guess overrides previous --no-guess, complete local and remote unique branches for DWIM' '
test_completion "git switch --no-guess --guess " <<-\EOF
branch-in-other Z
master Z
@ -1585,8 +1582,7 @@ test_expect_success 'git checkout - with -B and --no-track, complete all referen
EOF
'
#TODO: -c/-C argument completion should not include all references
test_expect_failure 'git switch - for -c, complete local branches and unique remote branches' '
test_expect_success 'git switch - for -c, complete local branches and unique remote branches' '
test_completion "git switch -c " <<-\EOF
branch-in-other Z
master Z
@ -1595,8 +1591,7 @@ test_expect_failure 'git switch - for -c, complete local branches and unique rem
EOF
'
#TODO: -c/-C argument completion should not include all references
test_expect_failure 'git switch - for -C, complete local branches and unique remote branches' '
test_expect_success 'git switch - for -C, complete local branches and unique remote branches' '
test_completion "git switch -C " <<-\EOF
branch-in-other Z
master Z
@ -1685,8 +1680,7 @@ test_expect_failure 'git checkout - for -B with --no-track, complete local branc
EOF
'
#TODO: --orphan argument completion should not include all references
test_expect_failure 'git switch - with --orphan completes local branch names and unique remote branch names' '
test_expect_success 'git switch - with --orphan completes local branch names and unique remote branch names' '
test_completion "git switch --orphan " <<-\EOF
branch-in-other Z
master Z