[PATCH] dispatch: provide an HG_ARGS environment variable to shell aliases

Matt Mackall mpm at selenic.com
Fri Jul 30 18:09:38 CDT 2010


On Thu, 2010-07-29 at 11:51 +0200, Mads Kiilerich wrote:
> On 07/29/2010 05:52 AM, Steve Losh wrote:
> > # HG changeset patch
> > # User Steve Losh<steve at stevelosh.com>
> > # Date 1280375531 14400
> > # Node ID eb11d2fb96d16d5b8e55621260ea0e1d49d45aae
> > # Parent  84fb29f5e0d29bc95006947a62133032499e3fa3
> > dispatch: provide an HG_ARGS environment variable to shell aliases
> >
> > This patch changes the functionality of shell aliases to pass the extra command
> > line arguments as an HG_ARGS environment variable, instead of simply appending
> > them to the command.
> >
> > This allows for more flexible shell aliases:
> >
> >      [alias]
> >      echo = !echo $HG_ARGS
> >      count = !hg log -r "$HG_ARGS" --template='.' | wc -c | sed -e 's/ //g'
> 
> The official way to extend Mercurial is to use extensions. 

...and hooks. 

> With this we 
> take small steps towards introducing another (de facto platform 
> specific) way to extend Mercurial. I assume the next steps will be 
> positional and optional arguments - and proper handling of 
> quoting/escaping. Do we want to go in that direction in core Mercurial?

This is what we currently do for pre- and post- command hooks:

    ret = hook.hook(lui, repo, "pre-%s" % cmd, False, args="
".join(fullargs),
                    pats=cmdpats, opts=cmdoptions)

The args bit has been there for ages, the pats and opts bits are more
recent.

Which means you can already do most of what this patch allows since 1.3:

[hooks]
pre-echo: echo args $HG_ARGS opts $HG_OPTS pats $HG_PATS

[aliases]
echo = diff -r -1:-1 # almost a no-op

This trick doesn't let us pass an non-diff options to diff, but does
give us args.

It's a little unfortunate that such hooks won't be as portable as Python
code, but as I've pointed out before: people don't use Python as their
shell because general purpose programming languages make lousy shells.
Letting people write trivial 'extensions' as one-liner aliases is good.

> Perhaps we could make it simpler to write simple extensions in python 
> instead? Perhaps few-liner extensions could be written directly in the 
> config files?

I'm open to that. But I think the gulf between what you can and want to
do in a one-liner alias and what you can and want to do in a short
Python snippet is pretty big. Writing any sort of useful Python
extension in less than a dozen lines is a pretty good trick.

-- 
Mathematics is the supreme nostalgia of our time.




More information about the Mercurial-devel mailing list