diff -r 870d60294b04 -r 0084fcd5d7e2 mercurial/templater.py --- a/mercurial/templater.py Mon Mar 10 15:00:41 2014 -0500 +++ b/mercurial/templater.py Tue Mar 11 16:19:08 2014 -0500 @@ -21,6 +21,7 @@ ")": (0, None, None), "symbol": (0, ("symbol",), None), "string": (0, ("string",), None), + "rawstring": (0, ("rawstring",), None), "end": (0, None, None), } @@ -50,7 +51,7 @@ continue if d == c: if not decode: - yield ('string', program[s:pos].replace('\\', r'\\'), s) + yield ('rawstring', program[s:pos], s) break yield ('string', program[s:pos], s) break @@ -76,23 +77,22 @@ pos += 1 yield ('end', None, pos) -def compiletemplate(tmpl, context): +def compiletemplate(tmpl, context, strtoken="string"): parsed = [] pos, stop = 0, len(tmpl) p = parser.parser(tokenizer, elements) while pos < stop: n = tmpl.find('{', pos) if n < 0: - parsed.append(("string", tmpl[pos:].decode("string-escape"))) + parsed.append((strtoken, tmpl[pos:])) break if n > 0 and tmpl[n - 1] == '\\': # escaped - parsed.append(("string", - (tmpl[pos:n - 1] + "{").decode("string-escape"))) + parsed.append((strtoken, (tmpl[pos:n - 1] + "{"))) pos = n + 1 continue if n > pos: - parsed.append(("string", tmpl[pos:n].decode("string-escape"))) + parsed.append((strtoken, tmpl[pos:n])) pd = [tmpl, n + 1, stop] parseres, pos = p.parse(pd) @@ -127,13 +127,16 @@ return context._filters[f] def gettemplate(exp, context): - if exp[0] == 'string': - return compiletemplate(exp[1], context) + if exp[0] == 'string' or exp[0] == 'rawstring': + return compiletemplate(exp[1], context, strtoken=exp[0]) if exp[0] == 'symbol': return context._load(exp[1]) raise error.ParseError(_("expected template specifier")) def runstring(context, mapping, data): + return data.decode("string-escape") + +def runrawstring(context, mapping, data): return data def runsymbol(context, mapping, key): @@ -234,12 +237,8 @@ except ValueError: raise error.ParseError(_("fill expects an integer width")) try: - initindent = stringify(args[2][0](context, mapping, args[2][1])) - initindent = stringify(runtemplate(context, mapping, - compiletemplate(initindent, context))) - hangindent = stringify(args[3][0](context, mapping, args[3][1])) - hangindent = stringify(runtemplate(context, mapping, - compiletemplate(hangindent, context))) + initindent = stringify(_evalifliteral(args[2], context, mapping)) + hangindent = stringify(_evalifliteral(args[3], context, mapping)) except IndexError: pass @@ -285,8 +284,9 @@ def _evalifliteral(arg, context, mapping): t = stringify(arg[0](context, mapping, arg[1])) - if arg[0] == runstring: - yield runtemplate(context, mapping, compiletemplate(t, context)) + if arg[0] == runstring or arg[0] == runrawstring: + yield runtemplate(context, mapping, + compiletemplate(t, context, strtoken='rawstring')) else: yield t @@ -338,7 +338,7 @@ joiner = " " if len(args) > 1: - joiner = args[1][0](context, mapping, args[1][1]) + joiner = stringify(args[1][0](context, mapping, args[1][1])) first = True for x in joinset: @@ -447,9 +447,9 @@ if not (1 <= len(args) <= 2): raise error.ParseError(_("strip expects one or two arguments")) - text = args[0][0](context, mapping, args[0][1]) + text = stringify(args[0][0](context, mapping, args[0][1])) if len(args) == 2: - chars = args[1][0](context, mapping, args[1][1]) + chars = stringify(args[1][0](context, mapping, args[1][1])) return text.strip(chars) return text.strip() @@ -460,13 +460,12 @@ pat = stringify(args[0][0](context, mapping, args[0][1])) rpl = stringify(args[1][0](context, mapping, args[1][1])) - src = stringify(args[2][0](context, mapping, args[2][1])) - src = stringify(runtemplate(context, mapping, - compiletemplate(src, context))) + src = stringify(_evalifliteral(args[2], context, mapping)) yield re.sub(pat, rpl, src) methods = { "string": lambda e, c: (runstring, e[1]), + "rawstring": lambda e, c: (runrawstring, e[1]), "symbol": lambda e, c: (runsymbol, e[1]), "group": lambda e, c: compileexp(e[1], c), # ".": buildmember,