summaryrefslogtreecommitdiffstats
path: root/pym/_emerge
diff options
context:
space:
mode:
authorSebastian Luther <SebastianLuther@gmx.de>2010-03-24 08:22:58 +0100
committerZac Medico <zmedico@gentoo.org>2010-08-13 20:16:40 -0700
commit5e39119d80433d9333fac70d12cf7c6b6ca61afe (patch)
tree7383c8fd7b5d0089a6565b2c6cef0017d512bcc9 /pym/_emerge
parent12e38fd2fe321c64c90a8f8863f271994d4e235d (diff)
downloadportage-5e39119d80433d9333fac70d12cf7c6b6ca61afe.tar.gz
portage-5e39119d80433d9333fac70d12cf7c6b6ca61afe.tar.bz2
portage-5e39119d80433d9333fac70d12cf7c6b6ca61afe.zip
Implement use dependency defaults
Diffstat (limited to 'pym/_emerge')
-rw-r--r--pym/_emerge/Package.py2
-rw-r--r--pym/_emerge/depgraph.py32
-rw-r--r--pym/_emerge/resolver/slot_collision.py10
3 files changed, 31 insertions, 13 deletions
diff --git a/pym/_emerge/Package.py b/pym/_emerge/Package.py
index 90a5d03eb..0cc36e18f 100644
--- a/pym/_emerge/Package.py
+++ b/pym/_emerge/Package.py
@@ -48,7 +48,7 @@ class Package(Task):
# Avoid an InvalidAtom exception when creating slot_atom.
# This package instance will be masked due to empty SLOT.
slot = '0'
- if (self.iuse.enabled or self.iuse.enabled) and \
+ if (self.iuse.enabled or self.iuse.disabled) and \
not eapi_has_iuse_defaults(self.metadata["EAPI"]):
self._invalid_metadata('IUSE.invalid',
"IUSE contains defaults, but EAPI doesn't allow them")
diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py
index 56ea1bd19..e3a47e8a7 100644
--- a/pym/_emerge/depgraph.py
+++ b/pym/_emerge/depgraph.py
@@ -2078,7 +2078,7 @@ class depgraph(object):
masked_pkg_instances.add(pkg)
if atom.unevaluated_atom.use:
if not pkg.iuse.is_valid_flag(atom.unevaluated_atom.use.required) \
- or atom.violated_conditionals(self._pkg_use_enabled(pkg)).use:
+ or atom.violated_conditionals(self._pkg_use_enabled(pkg), pkg.iuse.all).use:
missing_use.append(pkg)
if not mreasons:
continue
@@ -2097,14 +2097,22 @@ class depgraph(object):
missing_iuse_reasons = []
for pkg in missing_use:
use = self._pkg_use_enabled(pkg)
- missing_iuse = pkg.iuse.get_missing_iuse(atom.use.required)
+ missing_iuse = []
+ for x in pkg.iuse.get_missing_iuse(atom.use.required):
+ #FIXME: If a use flag occures more then it might be possible that
+ #one has a default one doesn't.
+ if x not in atom.use.missing_enabled and \
+ x not in atom.use.missing_disabled:
+ missing_iuse.append(x)
+
mreasons = []
if missing_iuse:
mreasons.append("Missing IUSE: %s" % " ".join(missing_iuse))
missing_iuse_reasons.append((pkg, mreasons))
else:
- need_enable = sorted(atom.use.enabled.difference(use))
- need_disable = sorted(atom.use.disabled.intersection(use))
+ need_enable = sorted(atom.use.enabled.difference(use).intersection(pkg.iuse.all))
+ need_disable = sorted(atom.use.disabled.intersection(use).intersection(pkg.iuse.all))
+
if need_enable or need_disable:
changes = []
changes.extend(colorize("red", "+" + x) \
@@ -2118,7 +2126,7 @@ class depgraph(object):
# Lets see if the violated use deps are conditional.
# If so, suggest to change them on the parent.
mreasons = []
- violated_atom = atom.unevaluated_atom.violated_conditionals(self._pkg_use_enabled(pkg), myparent.use.enabled)
+ violated_atom = atom.unevaluated_atom.violated_conditionals(self._pkg_use_enabled(pkg), pkg.iuse.all, myparent.use.enabled)
if not (violated_atom.use.enabled or violated_atom.use.disabled):
#all violated use deps are conditional
changes = []
@@ -2625,7 +2633,13 @@ class depgraph(object):
found_available_arg = True
if atom.use:
- missing_iuse = pkg.iuse.get_missing_iuse(atom.use.required)
+ missing_iuse = []
+ for x in pkg.iuse.get_missing_iuse(atom.use.required):
+ #FIXME: If a use flag occures more then it might be possible that
+ #one has a default one doesn't.
+ if x not in atom.use.missing_enabled and \
+ x not in atom.use.missing_disabled:
+ missing_iuse.append(x)
if missing_iuse:
# Don't add this to packages_with_invalid_use_config
# since IUSE cannot be adjusted by the user.
@@ -2641,11 +2655,13 @@ class depgraph(object):
else:
use = self._pkg_use_enabled(pkg)
- if atom.use.enabled.difference(use):
+ if atom.use.enabled.difference(use) and \
+ atom.use.enabled.difference(use).difference(atom.use.missing_enabled.difference(pkg.iuse.all)):
if not pkg.built:
packages_with_invalid_use_config.append(pkg)
continue
- if atom.use.disabled.intersection(use):
+ if atom.use.disabled.intersection(use) or \
+ atom.use.disabled.difference(pkg.iuse.all).difference(atom.use.missing_disabled):
if not pkg.built:
packages_with_invalid_use_config.append(pkg)
continue
diff --git a/pym/_emerge/resolver/slot_collision.py b/pym/_emerge/resolver/slot_collision.py
index 8b499ec00..b11fcb0c7 100644
--- a/pym/_emerge/resolver/slot_collision.py
+++ b/pym/_emerge/resolver/slot_collision.py
@@ -211,7 +211,8 @@ class slot_conflict_handler(object):
collision_reasons[("version", sub_type)] = atoms
elif not atom_set.findAtomForPackage(other_pkg):
#Use conditionals not met.
- violated_atom = atom.violated_conditionals(other_pkg.use.enabled, ppkg.use.enabled)
+ violated_atom = atom.violated_conditionals(other_pkg.use.enabled, \
+ other_pkg.iuse.all, ppkg.use.enabled)
for flag in violated_atom.use.enabled.union(violated_atom.use.disabled):
atoms = collision_reasons.get(("use", flag), set())
atoms.add((ppkg, atom, other_pkg))
@@ -251,7 +252,7 @@ class slot_conflict_handler(object):
conditional_matches = set()
for ppkg, atom, other_pkg in parents:
violated_atom = atom.unevaluated_atom.violated_conditionals( \
- other_pkg.use.enabled, ppkg.use.enabled)
+ other_pkg.use.enabled, other_pkg.iuse.all, ppkg.use.enabled)
if use in violated_atom.use.enabled.union(violated_atom.use.disabled):
hard_matches.add((ppkg, atom))
else:
@@ -456,9 +457,10 @@ class slot_conflict_handler(object):
if ppkg.installed:
#We cannot assume that it's possible to reinstall the package. Do not
#check if some of its atom has use.conditional
- violated_atom = atom.violated_conditionals(pkg.use.enabled, ppkg.use.enabled)
+ violated_atom = atom.violated_conditionals(pkg.use.enabled, pkg.iuse.all, ppkg.use.enabled)
else:
- violated_atom = atom.unevaluated_atom.violated_conditionals(pkg.use.enabled, ppkg.use.enabled)
+ violated_atom = atom.unevaluated_atom.violated_conditionals(pkg.use.enabled, \
+ pkg.iuse.all, ppkg.use.enabled)
if pkg.installed and (violated_atom.use.enabled or violated_atom.use.disabled):
#We can't change USE of an installed package (only of an ebuild, but that is already