Mercurial > hg-stable
changeset 13392:777cef34a890
dispatch: support for $ escaping in shell-alias definition
Sigils in shell-alias can be escaped by doubling them.
author | Roman Sokolov <sokolov.r.v@gmail.com> |
---|---|
date | Fri, 11 Feb 2011 03:32:40 +0300 |
parents | d00bbff8600e |
children | d38d500deb08 |
files | mercurial/dispatch.py mercurial/util.py |
diffstat | 2 files changed, 18 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/dispatch.py Fri Jan 28 13:38:34 2011 +0100 +++ b/mercurial/dispatch.py Fri Feb 11 03:32:40 2011 +0300 @@ -221,15 +221,17 @@ def fn(ui, *args): env = {'HG_ARGS': ' '.join((self.name,) + args)} def _checkvar(m): - if int(m.groups()[0]) <= len(args): + if m.groups()[0] == '$': + return m.group() + elif int(m.groups()[0]) <= len(args): return m.group() else: return '' - cmd = re.sub(r'\$(\d+)', _checkvar, self.definition[1:]) + cmd = re.sub(r'\$(\d+|\$)', _checkvar, self.definition[1:]) replace = dict((str(i + 1), arg) for i, arg in enumerate(args)) replace['0'] = self.name replace['@'] = ' '.join(args) - cmd = util.interpolate(r'\$', replace, cmd) + cmd = util.interpolate(r'\$', replace, cmd, escape_prefix=True) return util.system(cmd, environ=env) self.fn = fn return
--- a/mercurial/util.py Fri Jan 28 13:38:34 2011 +0100 +++ b/mercurial/util.py Fri Feb 11 03:32:40 2011 +0300 @@ -1502,7 +1502,7 @@ return False return True -def interpolate(prefix, mapping, s, fn=None): +def interpolate(prefix, mapping, s, fn=None, escape_prefix=False): """Return the result of interpolating items in the mapping into string s. prefix is a single character string, or a two character string with @@ -1511,9 +1511,20 @@ fn is an optional function that will be applied to the replacement text just before replacement. + + escape_prefix is an optional flag that allows using doubled prefix for + its escaping. """ fn = fn or (lambda s: s) - r = re.compile(r'%s(%s)' % (prefix, '|'.join(mapping.keys()))) + patterns = '|'.join(mapping.keys()) + if escape_prefix: + patterns += '|' + prefix + if len(prefix) > 1: + prefix_char = prefix[1:] + else: + prefix_char = prefix + mapping[prefix_char] = prefix_char + r = re.compile(r'%s(%s)' % (prefix, patterns)) return r.sub(lambda x: fn(mapping[x.group()[1:]]), s) def getport(port):