[PATCH 7 of 7] templater: handle exception when applying map operator to non-iterable object
Yuya Nishihara
yuya at tcha.org
Fri Mar 4 10:48:49 EST 2016
# HG changeset patch
# User Yuya Nishihara <yuya at tcha.org>
# Date 1455425926 -32400
# Sun Feb 14 13:58:46 2016 +0900
# Node ID 8e6ed4f20dbb321b06c974560bfd2f88eb369e26
# Parent c5d854264cf4c299b3b85250809b788459a1faed
templater: handle exception when applying map operator to non-iterable object
Before this, "{noniterable % template}" raised an exception. This tries to
provide a better indication for the common case, where a left-hand-side
expression is a keyword.
diff --git a/mercurial/templater.py b/mercurial/templater.py
--- a/mercurial/templater.py
+++ b/mercurial/templater.py
@@ -305,9 +305,17 @@ def runmap(context, mapping, data):
func, data, ctmpl = data
d = func(context, mapping, data)
if util.safehasattr(d, 'itermaps'):
- d = d.itermaps()
+ diter = d.itermaps()
+ else:
+ try:
+ diter = iter(d)
+ except TypeError:
+ if func is runsymbol:
+ raise error.ParseError(_("keyword '%s' is not iterable") % data)
+ else:
+ raise error.ParseError(_("%r is not iterable") % d)
- for i in d:
+ for i in diter:
lm = mapping.copy()
if isinstance(i, dict):
lm.update(i)
diff --git a/tests/test-command-template.t b/tests/test-command-template.t
--- a/tests/test-command-template.t
+++ b/tests/test-command-template.t
@@ -2790,6 +2790,14 @@ Test new-style inline templating:
$ hg log -R latesttag -r tip --template 'modified files: {file_mods % " {file}\n"}\n'
modified files: .hgtags
+
+ $ hg log -R latesttag -r tip -T '{rev % "a"}\n'
+ hg: parse error: keyword 'rev' is not iterable
+ [255]
+ $ hg log -R latesttag -r tip -T '{get(extras, "unknown") % "a"}\n'
+ hg: parse error: None is not iterable
+ [255]
+
Test the sub function of templating for expansion:
$ hg log -R latesttag -r 10 --template '{sub("[0-9]", "x", "{rev}")}\n'
More information about the Mercurial-devel
mailing list