diff -r ad06a4264daf -r 12b6ee9e88f3 mercurial/templateutil.py --- a/mercurial/templateutil.py Sat Apr 21 17:43:16 2018 +0900 +++ b/mercurial/templateutil.py Wed Mar 21 01:39:44 2018 +0900 @@ -128,6 +128,17 @@ self._joinfmt = joinfmt self.keytype = keytype # hint for 'x in y' where type(x) is unresolved + def getmember(self, context, mapping, key): + # TODO: maybe split hybrid list/dict types? + if not util.safehasattr(self._values, 'get'): + raise error.ParseError(_('not a dictionary')) + return self._wrapvalue(key, self._values.get(key)) + + def _wrapvalue(self, key, val): + if val is None: + return + return wraphybridvalue(self, key, val) + def itermaps(self, context): makemap = self._makemap for x in self._values: @@ -667,8 +678,8 @@ lm = context.overlaymap(mapping, d.tomap()) return runsymbol(context, lm, memb) try: - if util.safehasattr(d, 'get'): - return getdictitem(d, memb) + if util.safehasattr(d, 'getmember'): + return d.getmember(context, mapping, memb) raise error.ParseError except error.ParseError: sym = findsymbolicname(darg) @@ -693,12 +704,6 @@ except ZeroDivisionError: raise error.Abort(_('division by zero is not defined')) -def getdictitem(dictarg, key): - val = dictarg.get(key) - if val is None: - return - return wraphybridvalue(dictarg, key, val) - def joinitems(itemiter, sep): """Join items with the separator; Returns generator of bytes""" first = True