diff -r 44757e6dad93 -r 2891079fb0c0 mercurial/templateutil.py --- a/mercurial/templateutil.py Thu Mar 15 20:43:39 2018 +0900 +++ b/mercurial/templateutil.py Thu Mar 15 21:22:52 2018 +0900 @@ -202,8 +202,8 @@ startname = 'start_' + plural if context.preload(startname): yield context.process(startname, mapping) - vmapping = mapping.copy() def one(v, tag=name): + vmapping = {} try: vmapping.update(v) # Python 2 raises ValueError if the type of v is wrong. Python @@ -216,6 +216,7 @@ vmapping[a] = b except (TypeError, ValueError): vmapping[name] = v + vmapping = context.overlaymap(mapping, vmapping) return context.process(tag, vmapping) lastname = 'last_' + name if context.preload(lastname): @@ -399,10 +400,9 @@ raise error.ParseError(_("%r is not iterable") % d) for i, v in enumerate(diter): - lm = mapping.copy() - lm['index'] = i if isinstance(v, dict): - lm.update(v) + lm = context.overlaymap(mapping, v) + lm['index'] = i lm['originalnode'] = mapping.get('node') yield evalrawexp(context, lm, targ) else: @@ -415,8 +415,7 @@ darg, memb = data d = evalrawexp(context, mapping, darg) if util.safehasattr(d, 'tomap'): - lm = mapping.copy() - lm.update(d.tomap()) + lm = context.overlaymap(mapping, d.tomap()) return runsymbol(context, lm, memb) if util.safehasattr(d, 'get'): return getdictitem(d, memb)