templater: fix if() to not evaluate False as bool('False')

Before, False was True. This patch fixes the issue by processing True/False
transparently. The other values (including integer 0) are tested as strings
for backward compatibility, which means "if(latesttagdistance)" never be False.

Should we change the behavior of "if(0)" as well?
This commit is contained in:
Yuya Nishihara 2016-08-18 16:29:22 +09:00
parent 03b3f18ede
commit e86fcc2294
2 changed files with 12 additions and 1 deletions

View File

@ -289,6 +289,15 @@ def evalfuncarg(context, mapping, arg):
thing = stringify(thing)
return thing
def evalboolean(context, mapping, arg):
func, data = arg
thing = func(context, mapping, data)
if isinstance(thing, bool):
return thing
# other objects are evaluated as strings, which means 0 is True, but
# empty dict/list should be False as they are expected to be ''
return bool(stringify(thing))
def evalinteger(context, mapping, arg, err):
v = evalfuncarg(context, mapping, arg)
try:
@ -560,7 +569,7 @@ def if_(context, mapping, args):
# i18n: "if" is a keyword
raise error.ParseError(_("if expects two or three arguments"))
test = evalstring(context, mapping, args[0])
test = evalboolean(context, mapping, args[0])
if test:
yield args[1][0](context, mapping, args[1][1])
elif len(args) == 3:

View File

@ -516,6 +516,8 @@ template output:
}
]
$ hg branches --closed -T '{if(closed, "{branch}\n")}'
c
Tests of revision branch name caching