diff options
author | Zac Medico <zmedico@gentoo.org> | 2007-11-06 07:00:39 +0000 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2007-11-06 07:00:39 +0000 |
commit | d6ba2af2b47c6d92543ecac00e88c4c4c75601f2 (patch) | |
tree | ee24fdbc7d26fe143b47750ecabf0d5d7371c3a2 /bin | |
parent | 80e42fdf33ccdea0a6a15d067d884e049b6f1a39 (diff) | |
download | portage-d6ba2af2b47c6d92543ecac00e88c4c4c75601f2.tar.gz portage-d6ba2af2b47c6d92543ecac00e88c4c4c75601f2.tar.bz2 portage-d6ba2af2b47c6d92543ecac00e88c4c4c75601f2.zip |
Allow multislot packages to be added to the world file
via --noreplace. Having these atoms in the world file
will trigger recommendations to run emaint in some
cases, like when running `emerge -e world`. The atoms
need to be in the world file to prevent multislot
packages from being removed by --depclean though.
(trunk r8436)
Bug #198129 - Prevent SLOT atoms like sys-devel/binutils:0
from being inappropriately recorded in the world file when
USE=multislot is enabled.
(trunk r8437:8439)
svn path=/main/branches/2.1.2/; revision=8440
Diffstat (limited to 'bin')
-rwxr-xr-x | bin/emerge | 37 |
1 files changed, 30 insertions, 7 deletions
diff --git a/bin/emerge b/bin/emerge index b9bebda6b..2c79af69e 100755 --- a/bin/emerge +++ b/bin/emerge @@ -735,17 +735,40 @@ def create_world_atom(pkg_key, metadata, args_set, root_config): # If the user gave a specific atom, store it as a # slot atom in the world file. slot_atom = "%s:%s" % (cp, metadata["SLOT"]) - # First verify the slot is in the portage tree to avoid - # adding a bogus slot like that produced by multislot. - if portdb.match(slot_atom): - # Now verify that the argument is precise enough to identify a - # specific slot. - matches = portdb.match(arg_atom) + + # For USE=multislot, there are a couple of cases to + # handle here: + # + # 1) SLOT="0", but the real SLOT spontaneously changed to some + # unknown value, so just record an unslotted atom. + # + # 2) SLOT comes from an installed package and there is no + # matching SLOT in the portage tree. + # + # Make sure that the slot atom is available in either the + # portdb or the vardb, since otherwise the user certainly + # doesn't want the SLOT atom recorded in the world file + # (case 1 above). If it's only available in the vardb, + # the user may be trying to prevent a USE=multislot + # package from being removed by --depclean (case 2 above). + + mydb = portdb + if not portdb.match(slot_atom): + # SLOT seems to come from an installed multislot package + mydb = vardb + # If there is no installed package matching the SLOT atom, + # it probably changed SLOT spontaneously due to USE=multislot, + # so just record an unslotted atom. + if vardb.match(slot_atom): + # Now verify that the argument is precise + # enough to identify a specific slot. + matches = mydb.match(arg_atom) matched_slots = set() for cpv in matches: - matched_slots.add(portdb.aux_get(cpv, ["SLOT"])[0]) + matched_slots.add(mydb.aux_get(cpv, ["SLOT"])[0]) if len(matched_slots) == 1: new_world_atom = slot_atom + if new_world_atom == sets["world"].findAtomForPackage(pkg_key, metadata): # Both atoms would be identical, so there's nothing to add. return None |