From 6afedef9c75bc8fef351286c87440c9a7a5b47bc Mon Sep 17 00:00:00 2001 From: Fabio Erculiani Date: Fri, 14 Oct 2011 17:12:16 +0200 Subject: [PATCH] [eit.commands.remove] new command "eit remove" --- server/eit/commands/remove.py | 124 ++++++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 server/eit/commands/remove.py diff --git a/server/eit/commands/remove.py b/server/eit/commands/remove.py new file mode 100644 index 000000000..94c28ec8e --- /dev/null +++ b/server/eit/commands/remove.py @@ -0,0 +1,124 @@ +# -*- coding: utf-8 -*- +""" + + @author: Fabio Erculiani + @contact: lxnay@sabayon.org + @copyright: Fabio Erculiani + @license: GPL-2 + + B{Entropy Infrastructure Toolkit}. + +""" +import sys +import argparse + +from entropy.i18n import _ +from entropy.output import purple, darkgreen, brown, teal + +from eit.commands.descriptor import EitCommandDescriptor +from eit.commands.command import EitCommand + + +class EitRemove(EitCommand): + """ + Main Eit remove command. + """ + + NAME = "remove" + ALIASES = ["rm"] + + def __init__(self, args): + EitCommand.__init__(self, args) + self._packages = [] + self._from = None + self._nodeps = False + self._ask = True + + def parse(self): + descriptor = EitCommandDescriptor.obtain_descriptor( + EitRemove.NAME) + parser = argparse.ArgumentParser( + description=descriptor.get_description(), + formatter_class=argparse.RawDescriptionHelpFormatter, + prog="%s %s" % (sys.argv[0], EitRemove.NAME)) + + parser.add_argument("packages", nargs='+', metavar="", + help=_("package name")) + parser.add_argument("--from", metavar="", + help=_("inject into given repository"), + dest="fromrepo", default=None) + parser.add_argument("--nodeps", action="store_true", + help=_("do not include reverse dependencies"), + dest="nodeps", default=self._nodeps) + parser.add_argument("--quick", action="store_true", + default=not self._ask, + help=_("no stupid questions")) + + try: + nsargs = parser.parse_args(self._args) + except IOError: + return parser.print_help, [] + + self._ask = not nsargs.quick + self._nodeps = nsargs.nodeps + self._from = nsargs.fromrepo + self._packages += nsargs.packages + return self._call_locked, [self._remove, self._from] + + def _remove(self, entropy_server): + """ + Actual Eit remove code. + """ + repository_id = entropy_server.repository() + repo = entropy_server.open_repository(repository_id) + pkg_matches = [] + for package in self._packages: + pkg = repo.atomMatch(package, multiMatch = True) + for pkg_id in pkg[0]: + pkg_match = (pkg_id, repository_id) + if pkg_match not in pkg_matches: + pkg_matches.append(pkg_match) + + if not pkg_matches: + entropy_server.output( + purple(_("No packages found")), + importance=1, level="error") + return 1 + + if not self._nodeps: + pkg_matches = entropy_server.get_reverse_queue(pkg_matches, + system_packages = False) + + entropy_server.output( + darkgreen( + _("These are the packages that would be removed") + ":"), + importance=1, header=brown(" @@ ")) + + repo_map = {} + for pkg_id, repo_id in pkg_matches: + repo = entropy_server.open_repository(repo_id) + pkgatom = repo.retrieveAtom(pkg_id) + entropy_server.output( + "[%s] %s" % (teal(repo_id), purple(pkgatom)), + header=brown(" # ")) + obj = repo_map.setdefault(repo_id, []) + obj.append(pkg_id) + + if self._ask: + resp = entropy_server.ask_question( + _("Would you like to continue ?")) + if resp == _("No"): + return 0 + + for repo_id, pkg_ids in repo_map.items(): + entropy_server.remove_packages(repo_id, pkg_ids) + + return 0 + + +EitCommandDescriptor.register( + EitCommandDescriptor( + EitRemove, + EitRemove.NAME, + _('remove packages from repository')) + )