summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--man/emerge.12
-rw-r--r--pym/_emerge/actions.py30
-rw-r--r--pym/_emerge/help.py2
-rw-r--r--pym/_emerge/main.py2
4 files changed, 21 insertions, 15 deletions
diff --git a/man/emerge.1 b/man/emerge.1
index 26df2514..e717c982 100644
--- a/man/emerge.1
+++ b/man/emerge.1
@@ -134,7 +134,7 @@ unmerge matched packages that have no reverse dependencies. Use
dependencies.
.TP
.BR "\-\-deselect[=n]"
-Remove atoms from the world file. This action is implied
+Remove atoms and/or sets from the world file. This action is implied
by uninstall actions, including \fB-\-depclean\fR,
\fB-\-prune\fR and \fB-\-unmerge\fR. Use \fB-\-deselect=n\fR
in order to prevent uninstall actions from removing
diff --git a/pym/_emerge/actions.py b/pym/_emerge/actions.py
index 78f564c9..148b8c31 100644
--- a/pym/_emerge/actions.py
+++ b/pym/_emerge/actions.py
@@ -1164,11 +1164,12 @@ def action_deselect(settings, trees, opts, atoms):
expanded_atoms = set(atoms)
from portage.dep import Atom
for atom in atoms:
- for cpv in vardb.match(atom):
- slot, = vardb.aux_get(cpv, ['SLOT'])
- if not slot:
- slot = '0'
- expanded_atoms.add(Atom('%s:%s' % (portage.cpv_getkey(cpv), slot)))
+ if not atom.startswith(SETPREFIX):
+ for cpv in vardb.match(atom):
+ slot, = vardb.aux_get(cpv, ['SLOT'])
+ if not slot:
+ slot = '0'
+ expanded_atoms.add(Atom('%s:%s' % (portage.cpv_getkey(cpv), slot)))
pretend = '--pretend' in opts
locked = False
@@ -1179,14 +1180,16 @@ def action_deselect(settings, trees, opts, atoms):
discard_atoms = set()
world_set.load()
for atom in world_set:
- if not isinstance(atom, Atom):
- # nested set
- continue
for arg_atom in expanded_atoms:
- if arg_atom.intersects(atom) and \
- not (arg_atom.slot and not atom.slot):
- discard_atoms.add(atom)
- break
+ if arg_atom.startswith(SETPREFIX):
+ if arg_atom == atom:
+ discard_atoms.add(atom)
+ break
+ else:
+ if arg_atom.intersects(atom) and \
+ not (arg_atom.slot and not atom.slot):
+ discard_atoms.add(atom)
+ break
if discard_atoms:
for atom in sorted(discard_atoms):
print(">>> Removing %s from \"world\" favorites file..." % \
@@ -2310,6 +2313,9 @@ def action_uninstall(settings, trees, ldpath_mtimes,
# multiple files in a single iter_owners() call.
lookup_owners.append(x)
+ elif x.startswith(SETPREFIX) and action == "deselect":
+ valid_atoms.append(x)
+
else:
msg = []
msg.append("'%s' is not a valid package atom." % (x,))
diff --git a/pym/_emerge/help.py b/pym/_emerge/help.py
index d9994d27..8d6fcb25 100644
--- a/pym/_emerge/help.py
+++ b/pym/_emerge/help.py
@@ -108,7 +108,7 @@ def help(myopts, havecolor=1):
print(" " + green("--deselect") + "[=%s]" % turquoise("n"))
paragraph = \
- "Remove atoms from the world file. This action is implied " + \
+ "Remove atoms and/or sets from the world file. This action is implied " + \
"by uninstall actions, including --depclean, " + \
"--prune and --unmerge. Use --deselect=n " + \
"in order to prevent uninstall actions from removing " + \
diff --git a/pym/_emerge/main.py b/pym/_emerge/main.py
index 5422d32b..ca3d17be 100644
--- a/pym/_emerge/main.py
+++ b/pym/_emerge/main.py
@@ -555,7 +555,7 @@ def parse_opts(tmpcmdline, silent=False):
},
"--deselect": {
- "help" : "remove atoms from the world file",
+ "help" : "remove atoms/sets from the world file",
"type" : "choice",
"choices" : ("True", "n")
},