templater: abort when a template filter raises an exception (
issue2987)
--- a/mercurial/templater.py Sat Aug 11 12:45:53 2012 -0500
+++ b/mercurial/templater.py Fri Aug 17 15:12:01 2012 -0700
@@ -146,7 +146,15 @@
def runfilter(context, mapping, data):
func, data, filt = data
- return filt(func(context, mapping, data))
+ try:
+ return filt(func(context, mapping, data))
+ except (ValueError, AttributeError, TypeError):
+ if isinstance(data, tuple):
+ dt = data[1]
+ else:
+ dt = data
+ raise util.Abort(_("template filter '%s' is not compatible with "
+ "keyword '%s'") % (filt.func_name, dt))
def buildmap(exp, context):
func, data = compileexp(exp[1], context)
--- a/tests/test-command-template.t Sat Aug 11 12:45:53 2012 -0500
+++ b/tests/test-command-template.t Fri Aug 17 15:12:01 2012 -0700
@@ -1255,6 +1255,30 @@
abort: t:3: unmatched quotes
[255]
+Behind the scenes, this will throw TypeError
+
+ $ hg log -l 3 --template '{date|obfuscate}\n'
+ abort: Template filter 'obfuscate' is not compatible with keyword 'date'
+ [255]
+
+Behind the scenes, this will throw a ValueError
+
+ $ hg log -l 3 --template 'line: {desc|shortdate}\n'
+ abort: Template filter 'shortdate' is not compatible with keyword 'desc'
+ [255]
+
+Behind the scenes, this will throw AttributeError
+
+ $ hg log -l 3 --template 'line: {date|escape}\n'
+ abort: Template filter 'escape' is not compatible with keyword 'date'
+ [255]
+
+Behind the scenes, this will throw ValueError
+
+ $ hg tip --template '{author|email|date}\n'
+ abort: Template filter 'datefilter' is not compatible with keyword 'author'
+ [255]
+
$ cd ..