From c357ca66340ca7ec81f6cac584b006e543847ed7 Mon Sep 17 00:00:00 2001 From: Jon-Paul Sullivan Date: Mon, 7 Apr 2014 17:59:33 +0100 Subject: [PATCH] Iterate over provided elements first To ensure that we have the list of provided elements from the command line before looking up dependencies, use a deque and popleft() to take the elements on a first-in/first-out basis. Change-Id: I0a2c21fa081763fd3cc8358be25dafeee1ed4718 Closes-Bug: #1303911 --- diskimage_builder/element_dependencies.py | 7 +++++-- diskimage_builder/tests/test_elementdeps.py | 19 +++++++++++++++++-- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/diskimage_builder/element_dependencies.py b/diskimage_builder/element_dependencies.py index 76c63a86e..e404a92f2 100644 --- a/diskimage_builder/element_dependencies.py +++ b/diskimage_builder/element_dependencies.py @@ -14,6 +14,7 @@ # under the License. import argparse +import collections import os import sys @@ -84,11 +85,13 @@ def expand_dependencies(user_elements, elements_dir=None): including any transitive dependencies. """ final_elements = set(user_elements) - check_queue = list(user_elements) + check_queue = collections.deque(user_elements) provided = set() while check_queue: - element = check_queue.pop() + # bug #1303911 - run through the provided elements first to avoid + # adding unwanted dependencies and looking for virtual elements + element = check_queue.popleft() if element in provided: continue deps = dependencies(element, elements_dir) diff --git a/diskimage_builder/tests/test_elementdeps.py b/diskimage_builder/tests/test_elementdeps.py index 0c945d291..4700474e3 100644 --- a/diskimage_builder/tests/test_elementdeps.py +++ b/diskimage_builder/tests/test_elementdeps.py @@ -51,9 +51,17 @@ class TestElementDeps(testtools.TestCase): [], ['virtual']) _populate_element(self.element_dir, 'requires_virtual', ['virtual']) - _populate_element(self.element_dir, 'virtual', []) + _populate_element(self.element_dir, 'virtual', ['extra_dependency']) + _populate_element(self.element_dir, 'extra_dependency', []) _populate_element(self.element_dir, 'circular1', ['circular2']) _populate_element(self.element_dir, 'circular2', ['circular1']) + _populate_element(self.element_dir, + 'provides_new_virtual', + [], + ['new_virtual']) + _populate_element(self.element_dir, + 'requires_new_virtual', + ['new_virtual']) def test_non_transitive_deps(self): result = element_dependencies.expand_dependencies( @@ -90,7 +98,7 @@ class TestElementDeps(testtools.TestCase): def test_provide(self): result = element_dependencies.expand_dependencies( - ['requires_virtual', 'provides_virtual'], + ['provides_virtual', 'requires_virtual'], elements_dir=self.element_dir) self.assertEqual(set(['requires_virtual', 'provides_virtual']), result) @@ -100,6 +108,13 @@ class TestElementDeps(testtools.TestCase): ['virtual', 'provides_virtual'], self.element_dir) + def test_provide_virtual_ordering(self): + result = element_dependencies.expand_dependencies( + ['requires_new_virtual', 'provides_new_virtual'], + elements_dir=self.element_dir) + self.assertEqual(set(['requires_new_virtual', 'provides_new_virtual']), + result) + class TestElements(testtools.TestCase): def test_depends_on_env(self):