summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2007-11-06 07:00:39 +0000
committerZac Medico <zmedico@gentoo.org>2007-11-06 07:00:39 +0000
commitd6ba2af2b47c6d92543ecac00e88c4c4c75601f2 (patch)
treeee24fdbc7d26fe143b47750ecabf0d5d7371c3a2
parent80e42fdf33ccdea0a6a15d067d884e049b6f1a39 (diff)
downloadportage-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
-rwxr-xr-xbin/emerge37
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