git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v3 (for maint)] git-completion: fix zsh support

From
Felipe Contreras <felipe.contreras@gmail.com>
Date
May 9, 2011, 22:08 UTC
Message-ID
<BANLkTikkhryMa69DSx4EAYjw+aar4icKcQ@mail.gmail.com>
In-Reply-To
<20110509211316.GB22908@elie>
On Tue, May 10, 2011 at 12:13 AM, Jonathan Nieder <jrnieder@gmail.com> wrote:
Show 7 quoted lines
> Felipe Contreras wrote:
>
>> It turns out 'words' is a special variable used by zsh completion, sort
>> of like 'COMP_WORDS' in bash.
>
> I was not aware that COMP_WORDS was special (rather than just
> prepopulated).  Is it?

I didn't mean to suggest it was special, only what 'words' was used for. I'll remove that section as it doesn't really matter.

Show 6 quoted lines
>> This was not isolated correctly in zsh's
>> bash completion, so by trying to set it as 'local' in git's completion,
>> unexpected results occur; assignations are not propagated to upper
>> levels in the call stack.
>
> Does the call stack grow up or down?  I suspect this means:
I'll change that to "outer levels".
Show 5 quoted lines
>        zsh's bash completion emulation layer does not sufficiently
>        insulate us from that reality.  In particular, the variable
>        keeps the "special" attribute (even after a declaration "local
>        words"), so assignments within a function are undone whenever
>        the function returns.
That explains less.
Show 7 quoted lines
>        In particular, until 3bee6a473 (completion: don't declare
>        'local words' to make zsh happy, 2011-04-28), the "words" array
>        would be cleared in _git by declaring "local words" and its new
>        value would never be propagated from _get_comp_words_by_ref so
>        it remained empty and the completion script could not tell that
>        there were existing subcommand names on the command line (so
>        "git log m<TAB>" would complete subcommand names).

I don't see the point in explaining in excruciating detail all the series of steps in which an unset variable causes problems; the variable doesn't get set, thus one can assume there are problems. And the problem is already explained to be that completion is completely broken.

Show 9 quoted lines
>        And even after 3bee6a473 we do not have the ability to modify
>        words.  (... explanation of impact of the change goes here ...)
>
> I am not a great writer so that is probably more verbose than needed.
> So it might be better for me to describe the goals of a commit message:
>
>  1) the text should be specific about what the commit fixes, so
>    someone reading it later (e.g., after bisecting) does not come
>    around and accidentally break it
See the title: fix zsh support
>  2) in particular, the text should be specific about the observable
>    symptoms, so it can be easier to check if a later change has
>    broken it.

From the title: zsh completion doesn't work at all. Which is repeated again: --- Right now zsh is completely broken... ---

If zsh completion is completely broken, chance are it has to do with this. And I did explain the most obvious test; check if the value of 'words' doesn't get propagated to the upper layers in the call stack.

Show 12 quoted lines
>> This is now fixed in the latest master branch of zsh[1] by simply
>> defining 'words' as hidden (typeset -h), which removes the special
>> meaning inside the emulated bash function. It probably won't be released
>> until version 4.3.12.
>>
>> In the meantime, we can workaround the issue by doing the same; defining
>> words as hidden (typeset -h) as soon as possible.
>
> It might make sense to reverse the order of these: first explain the
> fix in the context of the problem being solved, and then add a note
> mentioning that the fix will not be needed for long and that the
> method is the same as what zsh is planning to use.

That's what I did initially, but everyone doubted my solution. Now I want to start making sure people see it's a good solution.

> Meanwhile this doesn't address the risk that functions called by the
> completion script will use $words.
It does.
> Outside the context of the commit
> message I think you've said something about that (e.g., that the zsh
> developers prefer this fix --- a reference would be nice so we could
> steal their rationale).
I did. If you don't like their commit message, talk to them.
> Maybe the best thing to say would be "that is
> a risk, but let's wait and see", to give future readers more
> confidence that that was considered but it is ok to fix it if it comes
> up?
I don't see any risk.
Show 18 quoted lines
>> --- a/contrib/completion/git-completion.bash
>> +++ b/contrib/completion/git-completion.bash
>> @@ -2710,6 +2710,10 @@ _git ()
>>       if [[ -n ${ZSH_VERSION-} ]]; then
>>               emulate -L bash
>>               setopt KSH_TYPESET
>> +
>> +             # workaround zsh's bashinit's bug that leaves 'words' as a
>> +             # special variable in versions < 4.3.12
>> +             typeset -h words
>
> I don't think the comment clarifies much.  What is the intended
> message to the reader?  For example if it is "don't remove this line
> unless you use zsh 4.3.12 or greater", I'd say something like
>
>                # bashcompinit versions after 4.3.12 already hide the
>                # special "words" variable already.  We do it
>                # again ourselves to support older zsh versions.

I think it's perfectly clear. Specially if you compare it against the two lines above that have no explanation at all. Double standards much?

-- 
Felipe Contreras
Previous: Jonathan NiederNext: Felipe Contreras
Message 3 of 19 in “git-completion: fix zsh support”
  1. git-completion: fix zsh supportFelipe Contreras, May 9, 2011
  2. Jonathan NiederMay 9, 2011
  3. Felipe ContrerasMay 9, 2011
  4. git-completion: fix zsh supportFelipe Contreras, May 9, 2011
  5. Jonathan NiederMay 9, 2011
  6. Felipe ContrerasMay 9, 2011
  7. Jonathan NiederMay 9, 2011
  8. Felipe ContrerasMay 9, 2011
  9. Junio C HamanoMay 9, 2011
  10. Jonathan NiederMay 9, 2011
  11. 0/2 git-completion: fix zsh supportJonathan Nieder, May 10, 2011
  12. 1/2 completion: suppress zsh's special 'words' variableJonathan Nieder, May 10, 2011
  13. Jonathan NiederMay 10, 2011
  14. Felipe ContrerasMay 10, 2011
  15. Felipe ContrerasMay 10, 2011
  16. 2/2 completion: move private shopt shim for zsh to __git_ namespaceJonathan Nieder, May 10, 2011
  17. Felipe ContrerasMay 10, 2011
  18. Jonathan NiederMay 10, 2011
  19. Felipe ContrerasMay 10, 2011

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.