From patchwork Sun Mar 25 05:15:54 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [7,of,7] templater: factor out unwrapastype() from evalastype() From: Yuya Nishihara X-Patchwork-Id: 29844 Message-Id: To: mercurial-devel@mercurial-scm.org Date: Sun, 25 Mar 2018 14:15:54 +0900 # HG changeset patch # User Yuya Nishihara # Date 1521805435 -32400 # Fri Mar 23 20:43:55 2018 +0900 # Node ID bcfa34ae805b92d3c9d32c8bed19c6432ba44120 # Parent b5bdcfbf663e1fa1d7c2004a0ef6b3172cc8eff9 templater: factor out unwrapastype() from evalastype() So ParseError of unwrapastype() can be caught reliably. diff --git a/mercurial/templatefuncs.py b/mercurial/templatefuncs.py --- a/mercurial/templatefuncs.py +++ b/mercurial/templatefuncs.py @@ -34,7 +34,6 @@ evalboolean = templateutil.evalboolean evalinteger = templateutil.evalinteger evalstring = templateutil.evalstring evalstringliteral = templateutil.evalstringliteral -evalastype = templateutil.evalastype # dict of template built-in functions funcs = {} @@ -261,9 +260,10 @@ def ifcontains(context, mapping, args): raise error.ParseError(_("ifcontains expects three or four arguments")) haystack = evalfuncarg(context, mapping, args[1]) + keytype = getattr(haystack, 'keytype', None) try: - needle = evalastype(context, mapping, args[0], - getattr(haystack, 'keytype', None) or bytes) + needle = evalrawexp(context, mapping, args[0]) + needle = templateutil.unwrapastype(needle, keytype or bytes) found = (needle in haystack) except error.ParseError: found = False diff --git a/mercurial/templateutil.py b/mercurial/templateutil.py --- a/mercurial/templateutil.py +++ b/mercurial/templateutil.py @@ -77,7 +77,8 @@ class mappable(object): - "{manifest.rev}" Unlike a hybrid, this does not simulate the behavior of the underling - value. Use unwrapvalue() or unwraphybrid() to obtain the inner object. + value. Use unwrapvalue(), unwrapastype(), or unwraphybrid() to obtain + the inner object. """ def __init__(self, gen, key, value, makemap): @@ -340,18 +341,18 @@ def evalstringliteral(context, mapping, thing = func(context, mapping, data) return stringify(thing) -_evalfuncbytype = { - bytes: evalstring, - int: evalinteger, +_unwrapfuncbytype = { + bytes: stringify, + int: unwrapinteger, } -def evalastype(context, mapping, arg, typ): - """Evaluate given argument and coerce its type""" +def unwrapastype(thing, typ): + """Move the inner value object out of the wrapper and coerce its type""" try: - f = _evalfuncbytype[typ] + f = _unwrapfuncbytype[typ] except KeyError: raise error.ProgrammingError('invalid type specified: %r' % typ) - return f(context, mapping, arg) + return f(thing) def runinteger(context, mapping, data): return int(data)