# Copyright 2010-2012 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

__all__ = (
	'ordered_by_atom_specificity', 'prune_incremental',
)

from _emerge.Package import Package
from portage.dep import best_match_to_list, _repo_separator

def ordered_by_atom_specificity(cpdict, pkg, repo=None):
	"""
	Return a list of matched values from the given cpdict,
	in ascending order by atom specificity. The rationale
	for this order is that package.* config files are
	typically written in ChangeLog like fashion, so it's
	most friendly if the order that the atoms are written
	does not matter. Therefore, settings from more specific
	atoms override those of less specific atoms. Without
	this behavior, settings from relatively unspecific atoms
	would (somewhat confusingly) override the settings of
	more specific atoms, requiring people to make adjustments
	to the order that atoms are listed in the config file in
	order to achieve desired results (and thus corrupting
	the ChangeLog like ordering of the file).
	"""
	if not hasattr(pkg, 'repo') and repo and repo != Package.UNKNOWN_REPO:
		pkg = pkg + _repo_separator + repo

	results = []
	keys = list(cpdict)

	while keys:
		bestmatch = best_match_to_list(pkg, keys)
		if bestmatch:
			keys.remove(bestmatch)
			results.append(cpdict[bestmatch])
		else:
			break

	if results:
		# reverse, so the most specific atoms come last
		results.reverse()

	return results

def prune_incremental(split):
	"""
	Prune off any parts of an incremental variable that are
	made irrelevant by the latest occuring * or -*. This
	could be more aggressive but that might be confusing
	and the point is just to reduce noise a bit.
	"""
	for i, x in enumerate(reversed(split)):
		if x == '*':
			split = split[-i-1:]
			break
		elif x == '-*':
			if i == 0:
				split = []
			else:
				split = split[-i:]
			break
	return split
