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

Steve Losh steve at stevelosh.com
Wed Aug 4 13:18:36 CDT 2010


On Jul 31, 2010, at 4:39 PM, Matt Mackall wrote:

> On Sat, 2010-07-31 at 15:47 -0400, Steve Losh wrote:
>> On Jul 30, 2010, at 7:09 PM, Matt Mackall wrote:
>> 
>>> 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.
>> 
>> One issue: the HG_ARGS variable includes the *full* command line,
>> including the name of the command itself.
>> 
>> I can't think of an instance for a shell alias where this is more
>> useful than *just* the arguments, without the alias name in front.
>> The patch I sent doesn't put the alias name in front.
>> 
>> Is there a case I'm missing?
> 
> It's a classic anti-pattern to not pass the actual event name/number to
> a registered callback in some form. Consider wiring up a helper tool of
> some sort that handles three different commands. Without the command
> name, you'll need to do:
> 
> foo=!helper foo
> bar=!helper bar
> baz=!helper baz
> 
> With, you can simply do:
> 
> foo=!helper
> ...

Are you saying this applies to shell aliases as well, or just explaining why hooks behave the way they do?

> 
>> Is it confusing to have HG_ARGS include the command name for hooks but not for aliases?
> 
> Yes, a bit.

I agree.  I thought about giving it a new name, but couldn't think of one that fit nearly as well as HG_ARGS.  Any ideas?

> 
> -- 
> Mathematics is the supreme nostalgia of our time.
> 
> 



More information about the Mercurial-devel mailing list