# HG changeset patch # User Roman Sokolov # Date 2011-02-11 00:32:40 # Node ID 777cef34a890e7203d53463598adeee94a80209d # Parent d00bbff8600e5dc6bc1ab6c51896eb1f6711c7ad dispatch: support for $ escaping in shell-alias definition Sigils in shell-alias can be escaped by doubling them. diff --git a/mercurial/dispatch.py b/mercurial/dispatch.py --- a/mercurial/dispatch.py +++ b/mercurial/dispatch.py @@ -221,15 +221,17 @@ class cmdalias(object): 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 diff --git a/mercurial/util.py b/mercurial/util.py --- a/mercurial/util.py +++ b/mercurial/util.py @@ -1502,7 +1502,7 @@ except NameError: 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 @@ def interpolate(prefix, mapping, s, fn=N 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):