summaryrefslogtreecommitdiff
path: root/src/buildstream/_loader
diff options
context:
space:
mode:
Diffstat (limited to 'src/buildstream/_loader')
-rw-r--r--src/buildstream/_loader/loader.py23
1 files changed, 13 insertions, 10 deletions
diff --git a/src/buildstream/_loader/loader.py b/src/buildstream/_loader/loader.py
index 5a1819e32..13b2d1213 100644
--- a/src/buildstream/_loader/loader.py
+++ b/src/buildstream/_loader/loader.py
@@ -391,15 +391,11 @@ class Loader():
# Args:
# element (LoadElement): The element to sort
#
- def _sort_dependencies(self, element, visited=None):
- if visited is None:
- visited = set()
-
- if element in visited:
- return
+ @staticmethod
+ def _sort_dependencies(element):
- for dep in element.dependencies:
- dep.element._loader._sort_dependencies(dep.element, visited=visited)
+ working_elements = [element]
+ visited = set(working_elements)
def dependency_cmp(dep_a, dep_b):
element_a = dep_a.element
@@ -443,9 +439,16 @@ class Loader():
# Now dependency sort, we ensure that if any direct dependency
# directly or indirectly depends on another direct dependency,
# it is found later in the list.
- element.dependencies.sort(key=cmp_to_key(dependency_cmp))
+ while working_elements:
+ element = working_elements.pop()
+ for dep in element.dependencies:
+ dep_element = dep.element
+ if dep_element not in visited:
+ visited.add(dep_element)
+ working_elements.append(dep_element)
+
+ element.dependencies.sort(key=cmp_to_key(dependency_cmp))
- visited.add(element)
# _collect_element()
#