templatefuncs: do not stringify result of if*() expression
Returning a generator means that the result is a byte string. I can't find
any reason to make the "if" condition lazy since it is evaluated anyway
when {if()} has to be evaluated. So let's simply make if*() return an input
expression unmodified.
--- a/mercurial/templatefuncs.py Mon Mar 19 21:55:02 2018 +0900
+++ b/mercurial/templatefuncs.py Mon Mar 19 22:10:40 2018 +0900
@@ -248,9 +248,9 @@
test = evalboolean(context, mapping, args[0])
if test:
- yield evalrawexp(context, mapping, args[1])
+ return evalrawexp(context, mapping, args[1])
elif len(args) == 3:
- yield evalrawexp(context, mapping, args[2])
+ return evalrawexp(context, mapping, args[2])
@templatefunc('ifcontains(needle, haystack, then[, else])')
def ifcontains(context, mapping, args):
@@ -269,9 +269,9 @@
found = False
if found:
- yield evalrawexp(context, mapping, args[2])
+ return evalrawexp(context, mapping, args[2])
elif len(args) == 4:
- yield evalrawexp(context, mapping, args[3])
+ return evalrawexp(context, mapping, args[3])
@templatefunc('ifeq(expr1, expr2, then[, else])')
def ifeq(context, mapping, args):
@@ -284,9 +284,9 @@
test = evalstring(context, mapping, args[0])
match = evalstring(context, mapping, args[1])
if test == match:
- yield evalrawexp(context, mapping, args[2])
+ return evalrawexp(context, mapping, args[2])
elif len(args) == 4:
- yield evalrawexp(context, mapping, args[3])
+ return evalrawexp(context, mapping, args[3])
@templatefunc('join(list, sep)')
def join(context, mapping, args):
--- a/tests/test-command-template.t Mon Mar 19 21:55:02 2018 +0900
+++ b/tests/test-command-template.t Mon Mar 19 22:10:40 2018 +0900
@@ -3242,6 +3242,35 @@
$ hg log -R latesttag -l1 -T '{max(revset("9:10"))}\n'
10
+Test min/max of if() result
+
+ $ cd latesttag
+ $ hg log -l1 -T '{min(if(true, revset("9:10"), ""))}\n'
+ 9
+ $ hg log -l1 -T '{max(if(false, "", revset("9:10")))}\n'
+ 10
+ $ hg log -l1 -T '{min(ifcontains("a", "aa", revset("9:10"), ""))}\n'
+ 9
+ $ hg log -l1 -T '{max(ifcontains("a", "bb", "", revset("9:10")))}\n'
+ 10
+ $ hg log -l1 -T '{min(ifeq(0, 0, revset("9:10"), ""))}\n'
+ 9
+ $ hg log -l1 -T '{max(ifeq(0, 1, "", revset("9:10")))}\n'
+ 10
+ $ cd ..
+
+Test laziness of if() then/else clause
+
+ $ hg debugtemplate '{count(0)}'
+ abort: incompatible use of template filter 'count'
+ [255]
+ $ hg debugtemplate '{if(true, "", count(0))}'
+ $ hg debugtemplate '{if(false, count(0), "")}'
+ $ hg debugtemplate '{ifcontains("a", "aa", "", count(0))}'
+ $ hg debugtemplate '{ifcontains("a", "bb", count(0), "")}'
+ $ hg debugtemplate '{ifeq(0, 0, "", count(0))}'
+ $ hg debugtemplate '{ifeq(0, 1, count(0), "")}'
+
Test dot operator precedence:
$ hg debugtemplate -R latesttag -r0 -v '{manifest.node|short}\n'