From f892cc798c0d709359ec1a6c274da804b2e02b03 Mon Sep 17 00:00:00 2001 From: Marc Pujol Date: Fri, 30 May 2014 08:54:48 +0200 Subject: [PATCH] Merge and intersect lists without using sets. Using sets for these operations is dangerous because sets cannot contain certain object types (such as lists) and their iteration order is undefined. Fixes #7596 --- lib/ansible/utils/__init__.py | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/lib/ansible/utils/__init__.py b/lib/ansible/utils/__init__.py index 1800a35534f..042f0fac5ee 100644 --- a/lib/ansible/utils/__init__.py +++ b/lib/ansible/utils/__init__.py @@ -1003,21 +1003,19 @@ def is_list_of_strings(items): return False return True -def _listify(a): - if not isinstance(a, (list, tuple)): - return [a,] - else: - return a - def list_union(a, b): - set_a = set(_listify(a)) - set_b = set(_listify(b)) - return list(set_a.union(set_b)) + result = list(a) + for i in b: + if i not in result: + result.append(i) + return result def list_intersection(a, b): - set_a = set(_listify(a)) - set_b = set(_listify(b)) - return list(set_a.intersection(set_b)) + result = [] + for i in a: + if i in b: + result.append(i) + return result def safe_eval(expr, locals={}, include_exceptions=False): '''