[PATCH 1/2] completion: suppress zsh's special 'words' variable

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

 



From: Felipe Contreras <felipe.contreras@xxxxxxxxx>

After git's tab completion script gained zsh support in
v1.7.4-rc0~169^2 (completion: make compatible with zsh, 2010-09-06)
it was broken moments later.  More precisely, the completion does not
notice when it has seen a subcommand name, so all words complete as
options to the git wrapper or subcommand names.  For example, typing
"git log origi<TAB>" gives no completions because there are no "git
origi..." commands.

The cause: it turns out 'words' is one of the special parameters used
by the zsh completion system, used to hold the words from the command
it is completing.  As a result (in the words of zshcompwid(1)):

	[...] the parameters are reset on each function exit
	(including nested function calls from within the completion
	widget) to the values they had when the function was entered.

Each function in git's completion script using the 'words' array

 - declares "local words", causing the array to be cleared (but not
   resetting the special attribute);

 - calls "_get_comp_words_by_ref -n := words" to fill it with a
   modified version of COMP_WORDS with ':' and '=' no longer treated
   as word separators (see v1.7.4-rc0~11^2~2, 2010-12-02).  Within
   _get_comp_words_by_ref all is well, and when the function returns,
   words is reset to its former value;

 - examines $words and finds it empty.

Fix it by suppressing the special 'words' variable with typeset -h
so it can be used as an ordinary array.  The only risk is that the
completion script might call a function that wants to inspect the
'words' variable, expecting the zsh-specific meaning; luckily the next
version of zsh's bashcompinit (e880604f, 29140: hide the "words"
special variable so that it may be used as an ordinary variable by
bash completions, 2011-05-04) will also use 'typeset -h words' when
calling completion functions so

 - soon this fix will be redundant :)
 - anyone else using the bashcompinit library is risking the same
   problem, so presumably other functions from that library are
   carefully written to only look at $COMP_WORDS and not $words.

This fixes a regression introduced by v1.7.4-rc0~11^2~2 (2010-12-02).

Reported-by: Stefan Haller <lists@xxxxxxxxxxxxxxxx>
Improved-by: SZEDER GÃbor <szeder@xxxxxxxxxx>
Signed-off-by: Felipe Contreras <felipe.contreras@xxxxxxxxx>
Signed-off-by: Jonathan Nieder <jrnieder@xxxxxxxxx>
---
 contrib/completion/git-completion.bash |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index b81f444..da586e5 100755
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -2608,6 +2608,7 @@ _git ()
 	if [[ -n ${ZSH_VERSION-} ]]; then
 		emulate -L bash
 		setopt KSH_TYPESET
+		typeset -h words
 	fi
 
 	local cur words cword prev
@@ -2659,6 +2660,7 @@ _gitk ()
 	if [[ -n ${ZSH_VERSION-} ]]; then
 		emulate -L bash
 		setopt KSH_TYPESET
+		typeset -h words
 	fi
 
 	local cur words cword prev
-- 
1.7.5.1

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[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]