[PATCH] completion: do not cache if --git-completion-helper fails
- From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
- Date
- Jun 7, 2019, 09:30 UTC
- Message-ID
- <20190607093034.816-1-pclouds@gmail.com>
- In-Reply-To
- <20190607022443.5706-1-felipe.contreras@gmail.com>
"git <cmd> --git-completion-helper" could fail if the command checks for a repo before parse_options(). If the result is cached, later on when the user moves to a worktree with repo, tab completion will still fail.
Avoid this by detecting errors and not cache the completion output. We can try again and hopefully succeed next time (e.g. when a repo is found).
Of course if --git-completion-helper fails permanently because of other reasons (*), this will slow down completion. But I don't see any better option to handle that case.
(*) one of those cases is if __gitcomp_builtin is called on a command that does not support --git-completion-helper. And we do have a generic call
__git_complete_common "$command"
but this case is protected with __git_support_parseopt_helper so we're good.
Reported-by: Felipe Contreras <felipe.contreras@gmail.com> Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> --- contrib/completion/git-completion.bash | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash index 9f71bcde96..a515de8501 100644 --- a/contrib/completion/git-completion.bash +++ b/contrib/completion/git-completion.bash @@ -398,13 +398,15 @@ __gitcomp_builtin () eval "options=\$$var" if [ -z "$options" ]; then + local nocache= # leading and trailing spaces are significant to make # option removal work correctly. - options=" $incl $(__git ${cmd/_/ } --git-completion-helper) " + options=" $incl $(__git ${cmd/_/ } --git-completion-helper) " || nocache=t + for i in $excl; do options="${options/ $i / }" done - eval "$var=\"$options\"" + test -n "$nocache" || eval "$var=\"$options\"" fi __gitcomp "$options"
-- 2.22.0.rc0.322.g2b0371e29a