templater: show slightly better hint on map operation error
It was super hard to find where the templater went wrong if a keyword was
evaluated to '' or None.
--- a/mercurial/templateutil.py Wed Mar 21 12:28:12 2018 +0900
+++ b/mercurial/templateutil.py Fri Jun 08 20:57:54 2018 +0900
@@ -753,14 +753,22 @@
lm['index'] = i
yield lm
-def _applymap(context, mapping, d, targ):
- for lm in _iteroverlaymaps(context, mapping, d.itermaps(context)):
+def _applymap(context, mapping, d, darg, targ):
+ try:
+ diter = d.itermaps(context)
+ except error.ParseError as err:
+ sym = findsymbolicname(darg)
+ if not sym:
+ raise
+ hint = _("keyword '%s' does not support map operation") % sym
+ raise error.ParseError(bytes(err), hint=hint)
+ for lm in _iteroverlaymaps(context, mapping, diter):
yield evalrawexp(context, lm, targ)
def runmap(context, mapping, data):
darg, targ = data
d = evalwrapped(context, mapping, darg)
- return mappedgenerator(_applymap, args=(mapping, d, targ))
+ return mappedgenerator(_applymap, args=(mapping, d, darg, targ))
def runmember(context, mapping, data):
darg, memb = data
--- a/tests/test-command-template.t Wed Mar 21 12:28:12 2018 +0900
+++ b/tests/test-command-template.t Fri Jun 08 20:57:54 2018 +0900
@@ -3213,6 +3213,7 @@
$ hg log -R latesttag -r tip -T '{rev % "a"}\n'
hg: parse error: 11 is not iterable of mappings
+ (keyword 'rev' does not support map operation)
[255]
$ hg log -R latesttag -r tip -T '{get(extras, "unknown") % "a"}\n'
hg: parse error: None is not iterable of mappings