in src/buildstream/element.py [0:0]
def _dependencies(self, scope, *, recurse=True, visited=None):
# The format of visited is (BitMap(), BitMap()), with the first BitMap
# containing element that have been visited for the `_Scope.BUILD` case
# and the second one relating to the `_Scope.RUN` case.
if not recurse:
result: Set["Element"] = set()
if scope in (_Scope.BUILD, _Scope.ALL):
for dep in self.__build_dependencies:
if dep not in result:
result.add(dep)
yield dep
if scope in (_Scope.RUN, _Scope.ALL):
for dep in self.__runtime_dependencies:
if dep not in result:
result.add(dep)
yield dep
else:
def visit(element, scope, visited):
if scope == _Scope.ALL:
visited[0].add(element._unique_id)
visited[1].add(element._unique_id)
for dep in chain(element.__build_dependencies, element.__runtime_dependencies):
if dep._unique_id not in visited[0] and dep._unique_id not in visited[1]:
yield from visit(dep, _Scope.ALL, visited)
yield element
elif scope == _Scope.BUILD:
visited[0].add(element._unique_id)
for dep in element.__build_dependencies:
if dep._unique_id not in visited[1]:
yield from visit(dep, _Scope.RUN, visited)
elif scope == _Scope.RUN:
visited[1].add(element._unique_id)
for dep in element.__runtime_dependencies:
if dep._unique_id not in visited[1]:
yield from visit(dep, _Scope.RUN, visited)
yield element
else:
yield element
if visited is None:
# Visited is of the form (Visited for _Scope.BUILD, Visited for _Scope.RUN)
visited = (BitMap(), BitMap())
else:
# We have already a visited set passed. we might be able to short-circuit
if scope in (_Scope.BUILD, _Scope.ALL) and self._unique_id in visited[0]:
return
if scope in (_Scope.RUN, _Scope.ALL) and self._unique_id in visited[1]:
return
yield from visit(self, scope, visited)