--- a/mercurial/templater.py Sat Apr 04 01:03:52 2015 -0700
+++ b/mercurial/templater.py Tue Jun 09 13:21:20 2015 -0500
@@ -364,12 +364,13 @@
yield dictarg.get(key)
def _evalifliteral(arg, context, mapping):
- t = stringify(arg[0](context, mapping, arg[1]))
- if arg[0] == runstring or arg[0] == runrawstring:
+ # get back to token tag to reinterpret string as template
+ strtoken = {runstring: 'string', runrawstring: 'rawstring'}.get(arg[0])
+ if strtoken:
yield runtemplate(context, mapping,
- compiletemplate(t, context, strtoken='rawstring'))
+ compiletemplate(arg[1], context, strtoken))
else:
- yield t
+ yield stringify(arg[0](context, mapping, arg[1]))
def if_(context, mapping, args):
""":if(expr, then[, else]): Conditionally execute based on the result of
--- a/tests/test-command-template.t Sat Apr 04 01:03:52 2015 -0700
+++ b/tests/test-command-template.t Tue Jun 09 13:21:20 2015 -0500
@@ -2857,6 +2857,17 @@
\{rev} \{file} \\\head1
$ cd ..
+Test leading backslashes in "if" expression (issue4714):
+
+ $ cd latesttag
+ $ hg log -r 2 -T '{if("1", "\{rev}")} {if("1", r"\{rev}")}\n'
+ {rev} \2
+ $ hg log -r 2 -T '{if("1", "\\{rev}")} {if("1", r"\\{rev}")}\n'
+ \2 \\2
+ $ hg log -r 2 -T '{if("1", "\\\{rev}")} {if("1", r"\\\{rev}")}\n'
+ \{rev} \\\2
+ $ cd ..
+
"string-escape"-ed "\x5c\x786e" becomes r"\x6e" (once) or r"n" (twice)
$ hg log -R a -r 0 --template '{if("1", "\x5c\x786e", "NG")}\n'