summaryrefslogtreecommitdiff
path: root/buildstream/element.py
diff options
context:
space:
mode:
authorTristan Maat <tristan.maat@codethink.co.uk>2017-11-08 15:18:02 +0000
committerTristan Van Berkom <tristan.van.berkom@gmail.com>2017-11-10 09:44:20 +0000
commit58ca697cc250c1862977a6c4c9bbf82e62317d02 (patch)
tree0d8f2668fa3c7dae8f9a07708e781dba6fb4c382 /buildstream/element.py
parent25f6bec66a742cf96e45ed4f2e16bbcde972174b (diff)
downloadbuildstream-58ca697cc250c1862977a6c4c9bbf82e62317d02.tar.gz
Remove DummyElement hack
Diffstat (limited to 'buildstream/element.py')
-rw-r--r--buildstream/element.py42
1 files changed, 25 insertions, 17 deletions
diff --git a/buildstream/element.py b/buildstream/element.py
index 22a2ebdbb..b76ef688f 100644
--- a/buildstream/element.py
+++ b/buildstream/element.py
@@ -179,7 +179,7 @@ class Element(Plugin):
for source in self.__sources:
yield source
- def dependencies(self, scope, recurse=True, visited=None):
+ def dependencies(self, scope, recurse=True, visited=None, recursed=False):
"""dependencies(scope, recurse=True)
A generator function which yields the dependencies of the given element.
@@ -197,36 +197,44 @@ class Element(Plugin):
Yields:
(:class:`.Element`): The dependencies in `scope`, in deterministic staging order
"""
- did_recurse = False
if visited is None:
- visited = []
- else:
- did_recurse = True
+ visited = {}
+
+ scope_set = set((Scope.BUILD, Scope.RUN)) if scope == Scope.ALL else set((scope,))
- if self.name in visited:
+ if self.name in visited and scope_set.issubset(visited[self.name]):
return
- visited.append(self.name)
- if recurse or not did_recurse:
+ should_yield = False
+ if self.name not in visited:
+ visited[self.name] = scope_set
+ should_yield = True
+ else:
+ visited[self.name] |= scope_set
+
+ if recurse or not recursed:
if scope == Scope.ALL:
for dep in self.__build_dependencies:
- for elt in dep.dependencies(Scope.ALL, recurse=recurse, visited=visited):
- yield elt
+ yield from dep.dependencies(Scope.ALL, recurse=recurse,
+ visited=visited, recursed=True)
+
for dep in self.__runtime_dependencies:
if dep not in self.__build_dependencies:
- for elt in dep.dependencies(Scope.ALL, recurse=recurse, visited=visited):
- yield elt
+ yield from dep.dependencies(Scope.ALL, recurse=recurse,
+ visited=visited, recursed=True)
+
elif scope == Scope.BUILD:
for dep in self.__build_dependencies:
- for elt in dep.dependencies(Scope.RUN, recurse=recurse, visited=visited):
- yield elt
+ yield from dep.dependencies(Scope.RUN, recurse=recurse,
+ visited=visited, recursed=True)
+
elif scope == Scope.RUN:
for dep in self.__runtime_dependencies:
- for elt in dep.dependencies(Scope.RUN, recurse=recurse, visited=visited):
- yield elt
+ yield from dep.dependencies(Scope.RUN, recurse=recurse,
+ visited=visited, recursed=True)
# Yeild self only at the end, after anything needed has been traversed
- if (recurse or did_recurse) and (scope == Scope.ALL or scope == Scope.RUN):
+ if should_yield and (recurse or recursed) and (scope == Scope.ALL or scope == Scope.RUN):
yield self
def search(self, scope, name):