templater: strictly parse leading backslashes of '{' (
issue4569) (BC)
Because double backslashes are processed as a string escape sequence, '\\{'
should start the template syntax. On the other hand, r'' disables any sort
of \-escapes, so r'\{' can go either way, never start the template syntax
or always start it. I simply chose the latter, which means r'\{' is the same
as '\\{'.
--- a/mercurial/templater.py Mon May 04 09:54:01 2015 +0900
+++ b/mercurial/templater.py Mon May 04 10:17:34 2015 +0900
@@ -87,8 +87,9 @@
if n < 0:
parsed.append((strtoken, tmpl[pos:]))
break
- if n > 0 and tmpl[n - 1] == '\\':
- # escaped
+ bs = (n - pos) - len(tmpl[pos:n].rstrip('\\'))
+ if strtoken == 'string' and bs % 2 == 1:
+ # escaped (e.g. '\{', '\\\{', but not '\\{' nor r'\{')
parsed.append((strtoken, (tmpl[pos:n - 1] + "{")))
pos = n + 1
continue
--- a/tests/test-command-template.t Mon May 04 09:54:01 2015 +0900
+++ b/tests/test-command-template.t Mon May 04 10:17:34 2015 +0900
@@ -2273,6 +2273,17 @@
<>\n<]>
<>\n<
+Test leading backslashes:
+
+ $ cd latesttag
+ $ hg log -r 2 -T '\{rev} {files % "\{file}"} {files % r"\{file}"}\n'
+ {rev} {file} \head1
+ $ hg log -r 2 -T '\\{rev} {files % "\\{file}"} {files % r"\\{file}"}\n'
+ \2 \head1 \\head1
+ $ hg log -r 2 -T '\\\{rev} {files % "\\\{file}"} {files % r"\\\{file}"}\n'
+ \{rev} \{file} \\\head1
+ $ 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'