summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pym/_emerge/Package.py66
-rw-r--r--pym/_emerge/depgraph.py21
2 files changed, 73 insertions, 14 deletions
diff --git a/pym/_emerge/Package.py b/pym/_emerge/Package.py
index 640f8bca1..557dda5c5 100644
--- a/pym/_emerge/Package.py
+++ b/pym/_emerge/Package.py
@@ -1,14 +1,15 @@
# Copyright 1999-2010 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
-import re
import sys
from itertools import chain
import portage
from portage.cache.mappings import slot_dict_class
-from portage.dep import isvalidatom, use_reduce, \
+from portage.dep import Atom, isvalidatom, use_reduce, \
paren_enclose, _slot_re
-from portage.eapi import eapi_has_iuse_defaults, eapi_has_required_use
+from portage.eapi import eapi_has_src_uri_arrows, eapi_has_slot_deps, \
+ eapi_has_use_deps, eapi_has_strong_blocks, eapi_has_iuse_defaults, \
+ eapi_has_required_use, eapi_has_use_dep_defaults
from _emerge.Task import Task
if sys.hexversion >= 0x3000000:
@@ -33,6 +34,8 @@ class Package(Task):
"repository", "PROPERTIES", "RESTRICT", "SLOT", "USE",
"_mtime_", "DEFINED_PHASES", "REQUIRED_USE"]
+ _dep_keys = ('DEPEND', 'PDEPEND', 'RDEPEND',)
+
def __init__(self, **kwargs):
Task.__init__(self, **kwargs)
self.root = self.root_config.root
@@ -60,9 +63,66 @@ class Package(Task):
self.category, self.pf = portage.catsplit(self.cpv)
self.cpv_split = portage.catpkgsplit(self.cpv)
self.pv_split = self.cpv_split[1:]
+ self._validate_deps()
self.masks = self._masks()
self.visible = self._visible(self.masks)
+ def _validate_deps(self):
+ """
+ Validate deps. This does not trigger USE calculation since that
+ is expensive for ebuilds and therefore we want to avoid doing
+ in unnecessarily (like for masked packages).
+ """
+ eapi = self.metadata['EAPI']
+ for k in self._dep_keys:
+ v = self.metadata.get(k)
+ if not v:
+ continue
+ try:
+ atoms = portage.dep.use_reduce(v, matchall=True, flat=True,
+ is_valid_flag=self.iuse.is_valid_flag, token_class=Atom)
+ except portage.exception.InvalidDependString as e:
+ self._invalid_metadata(k + ".syntax", "%s: %s" % (k, e))
+ else:
+ for atom in atoms:
+ if not isinstance(atom, Atom):
+ continue
+
+ if atom.slot and not eapi_has_slot_deps(eapi):
+ self._invalid_metadata('EAPI.incompatible',
+ ("%s slot dependency" + \
+ " not supported with EAPI='%s':" + \
+ " '%s'") % (k, eapi, atom))
+
+ if atom.use and not eapi_has_use_deps(eapi):
+ self._invalid_metadata('EAPI.incompatible',
+ ("%s use dependency" + \
+ " not supported with EAPI='%s':" + \
+ " '%s'") % (k, eapi, atom))
+
+ if atom.use and (atom.use.missing_enabled or atom.use.missing_disabled) and \
+ not eapi_has_use_dep_defaults(eapi):
+ self._invalid_metadata('EAPI.incompatible',
+ ("%s use dependency" + \
+ " not supported with EAPI='%s':" + \
+ " '%s'") % (k, eapi, atom))
+
+ if atom.blocker and atom.blocker.overlap.forbid \
+ and not eapi_has_strong_blocks(eapi):
+ self._invalid_metadata('EAPI.incompatible',
+ ("%s new blocker syntax" + \
+ " not supported with EAPI='%s':" + \
+ " '%s'") % (k, eapi, atom))
+
+ k = 'SRC_URI'
+ v = self.metadata.get(k)
+ if v:
+ try:
+ use_reduce(v, matchall=True, flat=True, is_src_uri=True,
+ allow_src_uri_file_renames=eapi_has_src_uri_arrows(eapi))
+ except portage.exception.InvalidDependString as e:
+ self._invalid_metadata(k + ".syntax", "%s: %s" % (k, e))
+
def copy(self):
return Package(built=self.built, cpv=self.cpv, depth=self.depth,
installed=self.installed, metadata=self._raw_metadata,
diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py
index d0d5386a1..435cc1a98 100644
--- a/pym/_emerge/depgraph.py
+++ b/pym/_emerge/depgraph.py
@@ -1033,16 +1033,14 @@ class depgraph(object):
# TODO: For installed package, save any InvalidDependString
# info in dynamic_config and wait until display_problems()
- # to show it. For packages that aren't installed, we should
- # validate and mask them before they are selected.
+ # to show it.
try:
dep_string = portage.dep.use_reduce(dep_string,
uselist=self._pkg_use_enabled(pkg), is_valid_flag=pkg.iuse.is_valid_flag)
except portage.exception.InvalidDependString as e:
if not pkg.installed:
- # TODO: validate and mask this before it's selected
- show_invalid_depstring_notice(pkg, dep_string, str(e))
- return 0
+ # should have been masked before it was selected
+ raise
del e
# Try again, but omit the is_valid_flag argument, since
@@ -1067,9 +1065,8 @@ class depgraph(object):
del e
continue
- # TODO: validate and mask this before it's selected
- show_invalid_depstring_notice(pkg, dep_string, str(e))
- return 0
+ # should have been masked before it was selected
+ raise
if not dep_string:
continue
@@ -1122,11 +1119,13 @@ class depgraph(object):
dep_string, myuse=self._pkg_use_enabled(pkg), parent=pkg,
strict=strict, priority=dep_priority)
except portage.exception.InvalidDependString as e:
- show_invalid_depstring_notice(pkg, dep_string, str(e))
- del e
if pkg.installed:
+ # TODO: show in display_problems()
+ show_invalid_depstring_notice(pkg, dep_string, str(e))
return 1
- return 0
+
+ # should have been masked before it was selected
+ raise
if debug:
writemsg_level("Candidates: %s\n" % \