From 5e39119d80433d9333fac70d12cf7c6b6ca61afe Mon Sep 17 00:00:00 2001 From: Sebastian Luther Date: Wed, 24 Mar 2010 08:22:58 +0100 Subject: Implement use dependency defaults --- pym/_emerge/Package.py | 2 +- pym/_emerge/depgraph.py | 32 ++++++++++++++++++++++++-------- pym/_emerge/resolver/slot_collision.py | 10 ++++++---- 3 files changed, 31 insertions(+), 13 deletions(-) (limited to 'pym/_emerge') 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 -- cgit v1.2.3-1-g7c22