changeset 28331:2874db5462d3

templater: fix get() to evaluate arguments eagerly If a key is constructed from a template expression, it may be a generator. In that case, a key have to be stringified. A dictarg should never be a generator, but this patch also changes it to call evalfuncarg() for consistency.
author Yuya Nishihara <yuya@tcha.org>
date Sun, 14 Feb 2016 00:05:58 +0900
parents f3fb24e36d61
children e91371633127
files mercurial/templater.py tests/test-command-template.t
diffstat 2 files changed, 4 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/templater.py	Wed Mar 02 15:38:54 2016 +0000
+++ b/mercurial/templater.py	Sun Feb 14 00:05:58 2016 +0900
@@ -437,12 +437,12 @@
         # i18n: "get" is a keyword
         raise error.ParseError(_("get() expects two arguments"))
 
-    dictarg = args[0][0](context, mapping, args[0][1])
+    dictarg = evalfuncarg(context, mapping, args[0])
     if not util.safehasattr(dictarg, 'get'):
         # i18n: "get" is a keyword
         raise error.ParseError(_("get() expects a dict as first argument"))
 
-    key = args[1][0](context, mapping, args[1][1])
+    key = evalfuncarg(context, mapping, args[1])
     return dictarg.get(key)
 
 def if_(context, mapping, args):
--- a/tests/test-command-template.t	Wed Mar 02 15:38:54 2016 +0000
+++ b/tests/test-command-template.t	Sun Feb 14 00:05:58 2016 +0900
@@ -3176,6 +3176,8 @@
 
   $ hg log -r 0 --template '{get(extras, "branch")}\n'
   default
+  $ hg log -r 0 --template '{get(extras, "br{"anch"}")}\n'
+  default
   $ hg log -r 0 --template '{get(files, "should_fail")}\n'
   hg: parse error: get() expects a dict as first argument
   [255]