Fix only_if statements referencing non-string types

This fixes e.g. only_if: ${task.changed} which would always
evaluate to true due to it having been replaced by a string for its
boolean value. Also adds a test case to ensure it doesn't get
missed again.
pull/1109/head
Daniel Hokka Zakrisson 12 years ago
parent 151085c745
commit b55ef665ba

@ -269,7 +269,8 @@ def varReplace(raw, vars, do_repr=False, depth=0):
# original) # original)
try: try:
replacement = unicode(_varLookup(m.group(2), vars, depth)) replacement = _varLookup(m.group(2), vars, depth)
if isinstance(replacement, (str, unicode)):
replacement = varReplace(replacement, vars, depth=depth + 1) replacement = varReplace(replacement, vars, depth=depth + 1)
except VarNotFoundException: except VarNotFoundException:
replacement = m.group() replacement = m.group()
@ -283,7 +284,7 @@ def varReplace(raw, vars, do_repr=False, depth=0):
start -= 1 start -= 1
end += 1 end += 1
done.append(raw[:start]) # Keep stuff leading up to token done.append(raw[:start]) # Keep stuff leading up to token
done.append(replacement) # Append replacement value done.append(unicode(replacement)) # Append replacement value
raw = raw[end:] # Continue with remainder of string raw = raw[end:] # Continue with remainder of string
return ''.join(done) return ''.join(done)

@ -251,6 +251,16 @@ class TestUtils(unittest.TestCase):
res = ansible.utils.varReplace(template, vars, do_repr=True) res = ansible.utils.varReplace(template, vars, do_repr=True)
assert eval(res) assert eval(res)
def test_varReplace_repr_nonstr(self):
vars = {
'foo': True,
'bar': 1L,
}
template = '${foo} == $bar'
res = ansible.utils.varReplace(template, vars, do_repr=True)
assert res == 'True == 1L'
def test_template_varReplace_iterated(self): def test_template_varReplace_iterated(self):
template = 'hello $who' template = 'hello $who'
vars = { vars = {

Loading…
Cancel
Save