From: Jacob Keller <jacob.keller@xxxxxxxxx> If git switch is called with --track, it will attempts to DWIM into creating a local tracking branch that tracks the provided remote branch. It seems reasonable that, to support this behavior, we should only complete remote branches in the form "<remote>/<branch>". Indeed, current completion is not just sub-par, but could almost be described as entirely useless. $git switch --track <TAB> will only report *local* branch names. Indeed a new test case highlights this quite well: --- expected 2020-04-25 00:25:34.424965326 +0000 +++ out_sorted 2020-04-25 00:25:34.441965370 +0000 @@ -1,2 +1,2 @@ -other/branch-in-other -other/master-in-other +master +matching-branch not ok 100 - git switch - with --track, complete only remote branches # TODO known breakage Understanding exactly what causes this is not that simple. First we enable DWIM output by default. Then, if "--track", "--no-track", or "--no-guess" is enabled on the command line, we disable DWIM. This makes sense, because --track should not include the default "DWIM" remote branch names. Following this, there is a check for "--detach". If "--detach" is *not* present, then we set only_local_ref=y. this is done because we would like to avoid printing remote references. This immediately seems wrong because --track should allow completing remote references. Finally, if only_local_ref is 'y', and the track_opt for DWIM logic is disabled, we complete only local branches. This occurs because --track disabled track_opt, and not providing --detach sets only_local_ref to 'y'. Fixing this correctly is not trivial, so it is left to a follow up change. Signed-off-by: Jacob Keller <jacob.keller@xxxxxxxxx> --- t/t9902-completion.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh index af4661cbcc73..002223160058 100755 --- a/t/t9902-completion.sh +++ b/t/t9902-completion.sh @@ -1271,6 +1271,16 @@ test_expect_success 'git switch - with --detach, complete all references' ' EOF ' +# TODO: Since --track on its own will perform a DWIM to extract the local +# branch name, we should complete only the remote branches with their remote +# name. +test_expect_failure 'git switch - with --track, complete only remote branches' ' + test_completion "git switch --track " <<-\EOF + other/branch-in-other Z + other/master-in-other Z + EOF +' + test_expect_success 'git switch - with --no-track, complete only local branch names' ' test_completion "git switch --no-track " <<-\EOF master Z -- 2.25.2