From b6060200e016b2c6d7fa828cd611a83abc2a0064 Mon Sep 17 00:00:00 2001 From: Sebastian Luther Date: Thu, 29 Apr 2010 21:45:25 +0200 Subject: Make --deselect work for sets (bug 268798) --- man/emerge.1 | 2 +- pym/_emerge/actions.py | 30 ++++++++++++++++++------------ pym/_emerge/help.py | 2 +- pym/_emerge/main.py | 2 +- 4 files changed, 21 insertions(+), 15 deletions(-) diff --git a/man/emerge.1 b/man/emerge.1 index 26df25148..e717c9821 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 78f564c95..148b8c31f 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 d9994d276..8d6fcb257 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 5422d32bb..ca3d17bee 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") }, -- cgit v1.2.3-18-g5258