templater: fix escaping in nested string literals (
issue4102)
Before the templater got extended for nested expressions, it made
sense to decode string escapes across the whole string. Now we do it
on a piece by piece basis.
--- a/mercurial/cmdutil.py Thu Nov 07 20:36:26 2013 -0800
+++ b/mercurial/cmdutil.py Mon Nov 18 14:02:26 2013 -0500
@@ -940,9 +940,7 @@
tmpl = opts.get('template')
style = None
- if tmpl:
- tmpl = templater.parsestring(tmpl, quoted=False)
- else:
+ if not tmpl:
style = opts.get('style')
# ui settings
--- a/mercurial/templater.py Thu Nov 07 20:36:26 2013 -0800
+++ b/mercurial/templater.py Mon Nov 18 14:02:26 2013 -0500
@@ -52,7 +52,7 @@
if not decode:
yield ('string', program[s:pos].replace('\\', r'\\'), s)
break
- yield ('string', program[s:pos].decode('string-escape'), s)
+ yield ('string', program[s:pos], s)
break
pos += 1
else:
@@ -80,19 +80,19 @@
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:]))
+ parsed.append(("string", tmpl[pos:].decode("string-escape")))
break
if n > 0 and tmpl[n - 1] == '\\':
# escaped
- parsed.append(("string", tmpl[pos:n - 1] + "{"))
+ parsed.append(("string",
+ (tmpl[pos:n - 1] + "{").decode("string-escape")))
pos = n + 1
continue
if n > pos:
- parsed.append(("string", tmpl[pos:n]))
+ parsed.append(("string", tmpl[pos:n].decode("string-escape")))
pd = [tmpl, n + 1, stop]
parseres, pos = p.parse(pd)
--- a/mercurial/templates/paper/shortlog.tmpl Thu Nov 07 20:36:26 2013 -0800
+++ b/mercurial/templates/paper/shortlog.tmpl Mon Nov 18 14:02:26 2013 -0500
@@ -80,8 +80,8 @@
return m ? m[1] : null;
},
'.bigtable > tbody:nth-of-type(2)',
- '<tr class="%class%">\
- <td colspan="3" style="text-align: center;">%text%</td>\
+ '<tr class="%class%">\\
+ <td colspan="3" style="text-align: center;">%text%</td>\\
</tr>'
);
</script>
--- a/tests/test-command-template.t Thu Nov 07 20:36:26 2013 -0800
+++ b/tests/test-command-template.t Mon Nov 18 14:02:26 2013 -0500
@@ -1586,3 +1586,11 @@
h1c
b
a
+
+Test string escaping:
+
+ $ hg log -R latesttag -r 0 --template '>\n<>\\n<{if(rev, "[>\n<>\\n<]")}>\n<>\\n<\n'
+ >
+ <>\n<[>
+ <>\n<]>
+ <>\n<