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

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

