[PATCH] hooks: allow Unix style environment variables on external Windows hooks

Matt Harbison mharbison72 at gmail.com
Mon Jul 3 22:07:16 EDT 2017


On Mon, 03 Jul 2017 09:32:32 -0400, Yuya Nishihara <yuya at tcha.org> wrote:

> On Sun, 02 Jul 2017 01:45:00 -0400, Matt Harbison wrote:
>> # HG changeset patch
>> # User Matt Harbison <matt_harbison at yahoo.com>
>> # Date 1498969929 14400
>> #      Sun Jul 02 00:32:09 2017 -0400
>> # Node ID 5684913c02965f4a6bb43320e8aa189333962dd1
>> # Parent  61ed2cc98fd17c50c7adf634d777d946781a9fc1
>> hooks: allow Unix style environment variables on external Windows hooks
>>
>> This will help making common hooks between Windows and non-Windows  
>> platforms.
>> The hook is launched via cmd.exe, which doesn't understand $var, nor  
>> single
>> quotes.  Therefore, all that is handled is converting $var to %var%, and
>> allowing a literal '$' if escaped with '\'.  Like Unix variables,  
>> Windows will
>> substitute in the middle of a word (e.g. foo%bar%), so I don't think  
>> there are
>> any other special cases to handle.
>
> (+CC foozy, another Windows expert)
>
> Perhaps we'll need to update the help. '$' could be included in a valid
> filename, which now escape is required.

Yep.  I just wanted to make sure that the idea was acceptable first.

>> --- a/mercurial/hook.py
>> +++ b/mercurial/hook.py
>> @@ -8,6 +8,7 @@
>>  from __future__ import absolute_import
>>
>>  import os
>> +import re
>>  import sys
>>
>>  from .i18n import _
>> @@ -116,6 +117,17 @@
>>      return r, False
>>
>>  def _exthook(ui, repo, htype, name, cmd, args, throw):
>> +    if pycompat.osname == 'nt':
>> +        # Replace Unix style environment variables with Windows style  
>> variables,
>> +        # for replacement by cmd.exe.  Treat '\$' as a literal $.
>> +        def replacer(m):
>> +            prefix = m.group(1)
>> +            if prefix == '\\':
>> +                return '$' + m.group(2)
>> +            return prefix + '%' + m.group(2) + '%'
>> +
>> +        cmd = re.sub(br'(.?)\$(.+?)\b', replacer, cmd)
>
> Can you move this to windows.py, which hosts several shell-related  
> functions.
> I think the function can have some doctests.

Good idea.  Any name suggestions?


More information about the Mercurial-devel mailing list