# Copyright 1999-2009 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

from _emerge.DepPriority import DepPriority
from _emerge.Package import Package

def _find_deep_system_runtime_deps(graph):
	deep_system_deps = set()
	node_stack = []
	for node in graph:
		if not isinstance(node, Package) or \
			node.operation == 'uninstall':
			continue
		if node.root_config.sets['system'].findAtomForPackage(node):
			node_stack.append(node)

	def ignore_priority(priority):
		"""
		Ignore non-runtime priorities.
		"""
		if isinstance(priority, DepPriority) and \
			(priority.runtime or priority.runtime_post):
			return False
		return True

	while node_stack:
		node = node_stack.pop()
		if node in deep_system_deps:
			continue
		deep_system_deps.add(node)
		for child in graph.child_nodes(node, ignore_priority=ignore_priority):
			if not isinstance(child, Package) or \
				child.operation == 'uninstall':
				continue
			node_stack.append(child)

	return deep_system_deps

