completion: improve handling of --orphan option of switch/checkout

The --orphan option is used to create a local branch which is detached
from the current history. In git switch, it always resets to the empty
tree, and thus the only completion we can provide is a branch name.
Follow the same rules for -c/-C (and -b/-B) when completing the argument
to --orphan.

In the case of git switch, after we complete the argument, there is
nothing more we can complete for git switch, so do not even try. Nothing
else would be valid.

In the case of git checkout, --orphan takes a start point which it uses
to determine the checked out tree, even though it created orphaned
history.

Update the previously added test cases as they are now passing.

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:48 -07:00
committed by Junio C Hamano
parent acb658fe7d
commit 91439928ec
2 changed files with 17 additions and 13 deletions

View File

@ -1508,7 +1508,7 @@ _git_checkout ()
local prevword prevword="${words[cword-1]}" local prevword prevword="${words[cword-1]}"
case "$prevword" in case "$prevword" in
-b|-B) -b|-B|--orphan)
# Complete local branches (and DWIM branch # Complete local branches (and DWIM branch
# remote branch names) for an option argument # remote branch names) for an option argument
# specifying a new branch name. This is for # specifying a new branch name. This is for
@ -1522,14 +1522,14 @@ _git_checkout ()
esac esac
# At this point, we've already handled special completion for # At this point, we've already handled special completion for
# the arguments to -b/-B. There are 3 main things left we can # the arguments to -b/-B, and --orphan. There are 3 main
# possibly complete: # things left we can possibly complete:
# 1) a start-point for -b/-B or -d/--detach # 1) a start-point for -b/-B, -d/--detach, or --orphan
# 2) a remote head, for --track # 2) a remote head, for --track
# 3) an arbitrary reference, possibly including DWIM names # 3) an arbitrary reference, possibly including DWIM names
# #
if [ -n "$(__git_find_on_cmdline "-b -B -d --detach")" ]; then if [ -n "$(__git_find_on_cmdline "-b -B -d --detach --orphan")" ]; then
__git_complete_refs --mode="refs" __git_complete_refs --mode="refs"
elif [ -n "$(__git_find_on_cmdline "--track")" ]; then elif [ -n "$(__git_find_on_cmdline "--track")" ]; then
__git_complete_refs --mode="remote-heads" __git_complete_refs --mode="remote-heads"
@ -2387,7 +2387,7 @@ _git_switch ()
local prevword prevword="${words[cword-1]}" local prevword prevword="${words[cword-1]}"
case "$prevword" in case "$prevword" in
-c|-C) -c|-C|--orphan)
# Complete local branches (and DWIM branch # Complete local branches (and DWIM branch
# remote branch names) for an option argument # remote branch names) for an option argument
# specifying a new branch name. This is for # specifying a new branch name. This is for
@ -2400,8 +2400,15 @@ _git_switch ()
;; ;;
esac esac
# Unlike in git checkout, git switch --orphan does not take
# a start point. Thus we really have nothing to complete after
# the branch name.
if [ -n "$(__git_find_on_cmdline "--orphan")" ]; then
return
fi
# At this point, we've already handled special completion for # At this point, we've already handled special completion for
# -c/-C. There are 3 main things left to # -c/-C, and --orphan. There are 3 main things left to
# complete: # complete:
# 1) a start-point for -c/-C or -d/--detach # 1) a start-point for -c/-C or -d/--detach
# 2) a remote head, for --track # 2) a remote head, for --track

View File

@ -1669,15 +1669,13 @@ test_expect_success 'git switch - with --orphan completes local branch names and
EOF EOF
' '
#TODO: switch --orphan does not take a start-point and thus has nothing to complete test_expect_success 'git switch - --orphan with branch already provided completes nothing else' '
test_expect_failure 'git switch - --orphan with branch already provided completes nothing else' '
test_completion "git switch --orphan master " <<-\EOF test_completion "git switch --orphan master " <<-\EOF
EOF EOF
' '
#TODO: --orphan argument completion should not include all references test_expect_success 'git checkout - with --orphan completes local branch names and unique remote branch names' '
test_expect_failure 'git checkout - with --orphan completes local branch names and unique remote branch names' '
test_completion "git checkout --orphan " <<-\EOF test_completion "git checkout --orphan " <<-\EOF
branch-in-other Z branch-in-other Z
master Z master Z
@ -1686,8 +1684,7 @@ test_expect_failure 'git checkout - with --orphan completes local branch names a
EOF EOF
' '
#TODO: checkout --orphan start-point completion should not included DWIM remote unique branch names test_expect_success 'git checkout - --orphan with branch already provided completes local refs for a start-point' '
test_expect_failure 'git checkout - --orphan with branch already provided completes local refs for a start-point' '
test_completion "git checkout --orphan master " <<-\EOF test_completion "git checkout --orphan master " <<-\EOF
HEAD Z HEAD Z
master Z master Z