summaryrefslogtreecommitdiff
path: root/contrib/completion
diff options
context:
space:
mode:
authorSZEDER Gábor <szeder@ira.uka.de>2011-04-28 16:01:53 (GMT)
committerJunio C Hamano <gitster@pobox.com>2011-04-28 16:40:21 (GMT)
commit3bee6a4733a1ff03b9cc659ea026c6dc17567d4d (patch)
tree218d4028cb677b5914bc280d62c6d9b8e11371e7 /contrib/completion
parentda4902a73017ad82b9926d03101ec69a2802d1e7 (diff)
downloadgit-3bee6a4733a1ff03b9cc659ea026c6dc17567d4d.zip
git-3bee6a4733a1ff03b9cc659ea026c6dc17567d4d.tar.gz
git-3bee6a4733a1ff03b9cc659ea026c6dc17567d4d.tar.bz2
completion: don't declare 'local words' to make zsh happy
The "_get_comp_words_by_ref -n := words" command from the bash_completion library reassembles a modified version of COMP_WORDS with ':' and '=' no longer treated as word separators and stores it in the ${words[@]} array. Git's programmable tab completion script uses this to abstract away the difference between bash v3's and bash v4's definitions of COMP_WORDS (bash v3 used shell words, while bash v4 breaks at separator characters); see v1.7.4-rc0~11^2~2 (bash: get --pretty=m<tab> completion to work with bash v4, 2010-12-02). zsh has (or rather its completion functions have) another idea about what ${words[@]} should contain: the array is prepopulated with the words from the command it is completing. For reasons that are not well understood, when git-completion.bash reserves its own "words" variable with "local words", the variable becomes empty and cannot be changed from then on. So the completion script neglects the arguments it has seen, and words complete like git subcommand names. For example, typing "git log origi<TAB>" gives no completions because there are no "git origi..." commands. However, when this words variable is not declared as local but is just populated by _get_comp_words_by_ref() and then read in various completion functions, then zsh seems to be happy about it and our completion script works as expected. So, to get our completion script working again under zsh and to prevent the words variable from leaking into the shell environment under bash, we will only declare words as local when using bash. Reported-by: Stefan Haller <lists@haller-berlin.de> Suggested-by: Felipe Contreras <felipe.contreras@gmail.com> Explained-by: Jonathan Nieder <jrnieder@gmail.com> Signed-off-by: SZEDER Gábor <szeder@ira.uka.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'contrib/completion')
-rwxr-xr-xcontrib/completion/git-completion.bash8
1 files changed, 6 insertions, 2 deletions
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 00691fc..10c1b83 100755
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -2608,9 +2608,11 @@ _git ()
if [[ -n ${ZSH_VERSION-} ]]; then
emulate -L bash
setopt KSH_TYPESET
+ else
+ local words
fi
- local cur words cword prev
+ local cur cword prev
_get_comp_words_by_ref -n =: cur words cword prev
while [ $c -lt $cword ]; do
i="${words[c]}"
@@ -2659,9 +2661,11 @@ _gitk ()
if [[ -n ${ZSH_VERSION-} ]]; then
emulate -L bash
setopt KSH_TYPESET
+ else
+ local words
fi
- local cur words cword prev
+ local cur cword prev
_get_comp_words_by_ref -n =: cur words cword prev
__git_has_doubledash && return