diff options
author | Tristan Maat <tristan.maat@codethink.co.uk> | 2017-11-08 15:18:02 +0000 |
---|---|---|
committer | Tristan Van Berkom <tristan.van.berkom@gmail.com> | 2017-11-10 09:44:20 +0000 |
commit | 58ca697cc250c1862977a6c4c9bbf82e62317d02 (patch) | |
tree | 0d8f2668fa3c7dae8f9a07708e781dba6fb4c382 /buildstream/element.py | |
parent | 25f6bec66a742cf96e45ed4f2e16bbcde972174b (diff) | |
download | buildstream-58ca697cc250c1862977a6c4c9bbf82e62317d02.tar.gz |
Remove DummyElement hack
Diffstat (limited to 'buildstream/element.py')
-rw-r--r-- | buildstream/element.py | 42 |
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): |