Re: git git<tab> completes non-existent command `git gitk`

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi, Anthony

On Sat, May 23, 2020 at 7:25 PM Anthony Sottile <asottile@xxxxxxxxx> wrote:
>
> easiest to reproduce is with docker
>
> ```dockerfile
> FROM ubuntu:focal
> RUN : \
>     && apt-get update \
>     && DEBIAN_FRONTEND=noninteractive apt-get install -y
> --no-install-recommends \
>         bash-completion \
>         git \
>     && apt-get clean \
>     && rm -rf /var/lib/apt/lists/*
> ```
>
> ```console
> $ docker run --rm -ti test bash
> root@23e691ecc7ba:/# [ -f /etc/bash_completion ] && . /etc/bash_completion
> root@23e691ecc7ba:/# git gitk
> ```
>
> (I typed git git<tab>)
>
> ```console
> $ git gitk
> git: 'gitk' is not a git command. See 'git --help'.
> ```
> this is a bit annoying because I have some aliases/commands for git-github-*
>
> the git version I have is 2.25.1:

Thanks for the report. This is also reproducible in Git 2.27.0-rc1. To complete
subcommands, git-completion.bash uses[1] the output of:

	git --list-cmds=list-mainporcelain,others,nohelpers,alias,list-complete,config

And the list returned by the line above contains "gitk", because this
command is in the "mainporcelain" category (in command-list.txt).

One possible solution to the invalid completion you mentioned, without having
to re-categorize "gitk", is to explicitly exclude it in git-completion.bash:

diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index b1d6e5ebed..f07394584f 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -3214,7 +3214,10 @@ __git_main ()
 			then
 				__gitcomp "$GIT_TESTING_PORCELAIN_COMMAND_LIST"
 			else
-				__gitcomp "$(__git --list-cmds=list-mainporcelain,others,nohelpers,alias,list-complete,config)"
+				local cmds="$(__git --list-cmds=list-mainporcelain,others,nohelpers,list-complete,config | \
+						sed -e '/^gitk$/d')"
+				local aliases="$(__git --list-cmds=alias,config)"
+				__gitcomp "$cmds $aliases"
 			fi
 			;;
 		esac

(I had to split the list into "cmds" and "aliases" so that we could still give
completion for a valid "git gitk" alias, if present.)

This should solve the problem, althought it's admittedly not very elegant...
Nevertheless, I'd be happy to send a complete patch if folks are happy with the
workaround.

In the meantime, you could use:

	git config completion.commands -gitk

To locally remove the completion for "gitk".

Thanks,
Matheus

[1]: See contrib/completion/git-completion.bash +3218
     (https://github.com/git/git/blob/master/contrib/completion/git-completion.bash#L3218)



[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux