mirror of
https://github.com/facebook/sapling.git
synced 2024-10-06 23:07:18 +03:00
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:
parent
03b3f18ede
commit
e86fcc2294
@ -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:
|
||||
|
@ -516,6 +516,8 @@ template output:
|
||||
}
|
||||
]
|
||||
|
||||
$ hg branches --closed -T '{if(closed, "{branch}\n")}'
|
||||
c
|
||||
|
||||
Tests of revision branch name caching
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user