From patchwork Mon May 4 23:55:11 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [1, of, 2, STABLE] templater: do not process \-escapes at parsestring() (issue4290) From: Yuya Nishihara X-Patchwork-Id: 8883 Message-Id: <888d7a553f2b0ace8563.1430783711@mimosa> To: mercurial-devel@selenic.com Date: Tue, 05 May 2015 08:55:11 +0900 # HG changeset patch # User Yuya Nishihara # Date 1430700841 -32400 # Mon May 04 09:54:01 2015 +0900 # Branch stable # Node ID 888d7a553f2b0ace8563ea9e3ef3ab1b8a50923e # Parent a4ee6f774f14b68e8dc887745699ba6a2ae28355 templater: do not process \-escapes at parsestring() (issue4290) This patch brings back pre-2.8.1 behavior. The result of parsestring() is stored in templater's cache, t.cache, and then it is parsed as a template string by compiletemplate(). So t.cache should keep an unparsed string no matter if it is sourced from config value. Otherwise backslashes would be processed twice. The test vector is borrowed from 64b4f0cd7336. diff --git a/mercurial/templater.py b/mercurial/templater.py --- a/mercurial/templater.py +++ b/mercurial/templater.py @@ -618,14 +618,13 @@ def _flatten(thing): yield j def parsestring(s, quoted=True): - '''parse a string using simple c-like syntax. - string must be in quotes if quoted is True.''' + '''unwrap quotes if quoted is True''' if quoted: if len(s) < 2 or s[0] != s[-1]: raise SyntaxError(_('unmatched quotes')) - return s[1:-1].decode('string_escape') + return s[1:-1] - return s.decode('string_escape') + return s class engine(object): '''template expansion engine. diff --git a/tests/test-command-template.t b/tests/test-command-template.t --- a/tests/test-command-template.t +++ b/tests/test-command-template.t @@ -2250,6 +2250,29 @@ Test string escaping: <>\n<]> <>\n< + $ hg log -R latesttag -r 0 \ + > --config ui.logtemplate='>\n<>\\n<{if(rev, "[>\n<>\\n<]")}>\n<>\\n<\n' + > + <>\n<[> + <>\n<]> + <>\n< + + $ hg log -R latesttag -r 0 -T esc \ + > --config templates.esc='>\n<>\\n<{if(rev, "[>\n<>\\n<]")}>\n<>\\n<\n' + > + <>\n<[> + <>\n<]> + <>\n< + + $ cat <<'EOF' > esctmpl + > changeset = '>\n<>\\n<{if(rev, "[>\n<>\\n<]")}>\n<>\\n<\n' + > EOF + $ hg log -R latesttag -r 0 --style ./esctmpl + > + <>\n<[> + <>\n<]> + <>\n< + "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'