Patchwork zsh_completion: install as _hg not hg

login
register
mail settings
Submitter via Mercurial-devel
Date May 26, 2017, 8:53 p.m.
Message ID <77fa50376abeb18871ed.1495831999@dragonair.svl.corp.google.com>
Download mbox | patch
Permalink /patch/20938/
State Accepted
Headers show

Comments

via Mercurial-devel - May 26, 2017, 8:53 p.m.
# HG changeset patch
# User Kyle Lippincott <spectral@google.com>
# Date 1495830247 25200
#      Fri May 26 13:24:07 2017 -0700
# Branch stable
# Node ID 77fa50376abeb18871edcf69b9a4282067afda0f
# Parent  f928d53b687cb5738528d2eae97f58da10ca8bae
zsh_completion: install as _hg not hg

The contrib/zsh_completion file itself says to name it _hg.

With a name like `hg`, if the user has a line like `autoload ${^fpath}/*(N-.:t)`
in their zshrc, it will create a shell function named `hg` that will hide the
actual hg command and make hg unusable.

Separately from that though, the underscore prefix makes it actually work. The
zsh man page states:

    The convention for autoloaded functions used in completion is that they
    start with an underscore

This does not seem to just be a "convention", though. With the ill-advised line
removed from my zshrc and the file named
`/usr/local/share/zsh/site-functions/hg` (without the underscore), these
completions did not seem to get loaded and the ones from the zsh installation
were loaded instead.  If I renamed them to be
`/usr/local/share/zsh/site-functions/_hg`, however, they were loaded.

I manually tested the above statement by starting a new zsh instance with the
file in `/usr/local/share/zsh/site-functions` with the following names:
- As `hg`, `which _hg_labels` did not show anything
- As `_hg`, `which _hg_labels` showed the expected function.
Kyle Lippincott - May 26, 2017, 9:03 p.m.
Apparently I missed a test (I made this change on linux, not on mac), so v2
incoming soonish.

On Fri, May 26, 2017 at 1:53 PM, Kyle Lippincott via Mercurial-devel <
mercurial-devel@mercurial-scm.org> wrote:

> # HG changeset patch
> # User Kyle Lippincott <spectral@google.com>
> # Date 1495830247 25200
> #      Fri May 26 13:24:07 2017 -0700
> # Branch stable
> # Node ID 77fa50376abeb18871edcf69b9a4282067afda0f
> # Parent  f928d53b687cb5738528d2eae97f58da10ca8bae
> zsh_completion: install as _hg not hg
>
> The contrib/zsh_completion file itself says to name it _hg.
>
> With a name like `hg`, if the user has a line like `autoload
> ${^fpath}/*(N-.:t)`
> in their zshrc, it will create a shell function named `hg` that will hide
> the
> actual hg command and make hg unusable.
>
> Separately from that though, the underscore prefix makes it actually work.
> The
> zsh man page states:
>
>     The convention for autoloaded functions used in completion is that they
>     start with an underscore
>
> This does not seem to just be a "convention", though. With the ill-advised
> line
> removed from my zshrc and the file named
> `/usr/local/share/zsh/site-functions/hg` (without the underscore), these
> completions did not seem to get loaded and the ones from the zsh
> installation
> were loaded instead.  If I renamed them to be
> `/usr/local/share/zsh/site-functions/_hg`, however, they were loaded.
>
> I manually tested the above statement by starting a new zsh instance with
> the
> file in `/usr/local/share/zsh/site-functions` with the following names:
> - As `hg`, `which _hg_labels` did not show anything
> - As `_hg`, `which _hg_labels` showed the expected function.
>
> diff --git a/Makefile b/Makefile
> --- a/Makefile
> +++ b/Makefile
> @@ -167,7 +167,7 @@
>          # install zsh completions - this location appears to be
>          # searched by default as of macOS Sierra.
>         install -d build/mercurial/usr/local/share/zsh/site-functions/
> -       install -m 0644 contrib/zsh_completion build/mercurial/usr/local/
> share/zsh/site-functions/hg
> +       install -m 0644 contrib/zsh_completion build/mercurial/usr/local/
> share/zsh/site-functions/_hg
>          # install bash completions - there doesn't appear to be a
>          # place that's searched by default for bash, so we'll follow
>          # the lead of Apple's git install and just put it in a
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel@mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
>

Patch

diff --git a/Makefile b/Makefile
--- a/Makefile
+++ b/Makefile
@@ -167,7 +167,7 @@ 
         # install zsh completions - this location appears to be
         # searched by default as of macOS Sierra.
 	install -d build/mercurial/usr/local/share/zsh/site-functions/
-	install -m 0644 contrib/zsh_completion build/mercurial/usr/local/share/zsh/site-functions/hg
+	install -m 0644 contrib/zsh_completion build/mercurial/usr/local/share/zsh/site-functions/_hg
         # install bash completions - there doesn't appear to be a
         # place that's searched by default for bash, so we'll follow
         # the lead of Apple's git install and just put it in a