changeset 25785:f976b7dc5e7b

templater: unify "string" and "rawstring" "rawstring" was introduced by 5ab28a2e9962, but it's no longer necessary because c1975809a6b5 and fd5bc660c9f0 changed the way of processing string literals. This patch moves string decoding to the parsing phase as it was before: ('rawstring', s) -> ('string', s) ('string', s) -> ('string', s.decode('string-escape'))
author Yuya Nishihara <yuya@tcha.org>
date Sat, 20 Jun 2015 18:24:11 +0900
parents 33e613687dab
children 35fa7c77c754
files mercurial/templater.py
diffstat 1 files changed, 8 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/templater.py	Sun Jun 21 13:28:21 2015 +0900
+++ b/mercurial/templater.py	Sat Jun 20 18:24:11 2015 +0900
@@ -22,7 +22,7 @@
     ")": (0, None, None),
     "integer": (0, ("integer",), None),
     "symbol": (0, ("symbol",), None),
-    "rawstring": (0, ("rawstring",), None),
+    "string": (0, ("string",), None),
     "template": (0, ("template",), None),
     "end": (0, None, None),
 }
@@ -50,7 +50,7 @@
                     pos += 2
                     continue
                 if d == c:
-                    yield ('rawstring', program[s:pos], s)
+                    yield ('string', program[s:pos], s)
                     break
                 pos += 1
             else:
@@ -83,7 +83,7 @@
             #             escaped quoted string
             if c == 'r':
                 pos += 1
-                token = 'rawstring'
+                token = 'string'
             else:
                 token = 'template'
             quote = program[pos:pos + 2]
@@ -136,7 +136,7 @@
     >>> _parsetemplate(r'foo\"bar"baz', 0, 12, quote='"')
     ([('string', 'foo"'), ('string', 'bar')], 9)
     >>> _parsetemplate(r'foo\\"bar', 0, 10, quote='"')
-    ([('string', 'foo\\\\')], 6)
+    ([('string', 'foo\\')], 6)
     """
     parsed = []
     sepchars = '{' + quote
@@ -146,18 +146,19 @@
         n = min((tmpl.find(c, pos, stop) for c in sepchars),
                 key=lambda n: (n < 0, n))
         if n < 0:
-            parsed.append(('string', tmpl[pos:stop]))
+            parsed.append(('string', tmpl[pos:stop].decode('string-escape')))
             pos = stop
             break
         c = tmpl[n]
         bs = (n - pos) - len(tmpl[pos:n].rstrip('\\'))
         if bs % 2 == 1:
             # escaped (e.g. '\{', '\\\{', but not '\\{')
-            parsed.append(('string', (tmpl[pos:n - 1] + c)))
+            parsed.append(('string',
+                           tmpl[pos:n - 1].decode('string-escape') + c))
             pos = n + 1
             continue
         if n > pos:
-            parsed.append(('string', tmpl[pos:n]))
+            parsed.append(('string', tmpl[pos:n].decode('string-escape')))
         if c == quote:
             return parsed, n + 1
 
@@ -212,9 +213,6 @@
     return int(data)
 
 def runstring(context, mapping, data):
-    return data.decode("string-escape")
-
-def runrawstring(context, mapping, data):
     return data
 
 def runsymbol(context, mapping, key):
@@ -659,7 +657,6 @@
 exprmethods = {
     "integer": lambda e, c: (runinteger, e[1]),
     "string": lambda e, c: (runstring, e[1]),
-    "rawstring": lambda e, c: (runrawstring, e[1]),
     "symbol": lambda e, c: (runsymbol, e[1]),
     "template": buildtemplate,
     "group": lambda e, c: compileexp(e[1], c, exprmethods),