From 46c48b270a71d2668fbb2614c4ee9f6f3fd741b2 Mon Sep 17 00:00:00 2001 From: Fabio Erculiani Date: Sat, 9 Jan 2010 22:01:14 +0100 Subject: [PATCH] [sulfur] inform user about orphan packages on system --- sulfur/src/sulfur/__init__.py | 69 +++++++++++++++++++++++++++-------- sulfur/src/sulfur/events.py | 9 ++--- sulfur/src/sulfur/packages.py | 32 +++++++++------- 3 files changed, 75 insertions(+), 35 deletions(-) diff --git a/sulfur/src/sulfur/__init__.py b/sulfur/src/sulfur/__init__.py index f65262c8e..3f68063e2 100644 --- a/sulfur/src/sulfur/__init__.py +++ b/sulfur/src/sulfur/__init__.py @@ -292,6 +292,7 @@ class SulfurApplication(Controller, SulfurApplicationEventsMixin): self._mtime_pingus = MtimePingus() self._spawning_ugc = False self._preferences = None + self._orphans_message_shown = False self.skipMirrorNow = False self.abortQueueNow = False self.doProgress = False @@ -1449,6 +1450,42 @@ class SulfurApplication(Controller, SulfurApplicationEventsMixin): self.ui.skipMirror.hide() self.skipMirror = False + def add_to_queue(self, pkgs, action, always_ask): + + q_cache = {} + for obj in pkgs: + q_cache[obj.matched_atom] = obj.queued + obj.queued = action + + status, myaction = self.queue.add(pkgs, always_ask = always_ask) + if status != 0: + for obj in pkgs: + obj.queued = q_cache.get(obj.matched_atom) + return False + + self.queueView.refresh() + self.ui.viewPkg.queue_draw() + return True + + def _show_orphans_message(self, orphans): + + confirm = ConfirmationDialog( self.ui.main, + orphans, + top_text = _("These packages are no longer available"), + sub_text = _("These packages should be removed because support has been dropped. Do you want to remove them?"), + bottom_text = '', + bottom_data = '' + ) + result = confirm.run() + ok = False + if result == -5: # ok + ok = True + confirm.destroy() + + if not ok: + return False + return self.add_to_queue(orphans, "r", False) + def show_packages(self, back_to_page = None, on_init = False): self.ui_lock(True) @@ -1485,7 +1522,8 @@ class SulfurApplication(Controller, SulfurApplicationEventsMixin): self.start_working() allpkgs = [] - if self.doProgress: next(self.progress.total) # -> Get lists + if self.doProgress: + next(self.progress.total) # -> Get lists self.progress.set_mainLabel(_('Generating Metadata, please wait.')) self.progress.set_subLabel( _('Entropy is indexing the repositories. It will take a few seconds')) @@ -1526,6 +1564,15 @@ class SulfurApplication(Controller, SulfurApplicationEventsMixin): elif allpkgs and (self.lastPkgPB != "pkgsets"): self.ui.pkgSorter.set_property('sensitive', True) + if not self._orphans_message_shown: + if action == "updates" and empty: + orphans = self.etpbase.get_raw_groups('orphans') + if self.do_debug: + print_generic("show_packages: found orphans %s" % (orphans,)) + if orphans: + self._orphans_message_shown = True + self._show_orphans_message(orphans) + self.pkgView.populate(allpkgs, empty = empty, pkgsets = show_pkgsets) self.progress.total.show() @@ -1543,7 +1590,10 @@ class SulfurApplication(Controller, SulfurApplicationEventsMixin): self.reset_queue_progress_bars() self.disable_ugc = False - def add_atoms_to_queue(self, atoms, always_ask = False, matches = set()): + def add_atoms_to_queue(self, atoms, always_ask = False, matches = None): + + if matches is None: + matches = set() self.set_busy() if not matches: @@ -1580,20 +1630,7 @@ class SulfurApplication(Controller, SulfurApplicationEventsMixin): continue found_objs.append(obj) - - q_cache = {} - for obj in found_objs: - q_cache[obj.matched_atom] = obj.queued - obj.queued = "u" - - status, myaction = self.queue.add(found_objs, always_ask = always_ask) - if status != 0: - rc = False - for obj in found_objs: - obj.queued = q_cache.get(obj.matched_atom) - - self.queueView.refresh() - self.ui.viewPkg.queue_draw() + rc = self.add_to_queue(found_objs, "u", always_ask) self.unset_busy() return rc diff --git a/sulfur/src/sulfur/events.py b/sulfur/src/sulfur/events.py index 3cf008494..7c9e587aa 100644 --- a/sulfur/src/sulfur/events.py +++ b/sulfur/src/sulfur/events.py @@ -424,15 +424,12 @@ class SulfurApplicationEventsMixin: pkgs = [] for idpackage, atom in atomsfound: yp, new = self.etpbase.get_package_item((idpackage, newrepo,)) - yp.action = 'i' - yp.queued = 'i' pkgs.append(yp) busy_cursor(self.ui.main) - status, myaction = self.queue.add(pkgs) - if status != 0: - for obj in pkgs: - obj.queued = None + + done = self.add_to_queue(pkgs, "i", False) + if not done: clean_n_quit(newrepo) normal_cursor(self.ui.main) return diff --git a/sulfur/src/sulfur/packages.py b/sulfur/src/sulfur/packages.py index d6059901a..6abd91a56 100644 --- a/sulfur/src/sulfur/packages.py +++ b/sulfur/src/sulfur/packages.py @@ -683,19 +683,24 @@ class EntropyPackages: self.pkgCache[pkgdata] = yp return yp, new - def _pkg_get_installed(self): + def __inst_pkg_setup(self, idpackage): + try: + yp, new = self.get_package_item((idpackage, 0)) + except RepositoryError: + return 0 + yp.action = 'r' + yp.installed_match = (idpackage, 0,) + yp.color = SulfurConf.color_install + return yp - gp_call = self.get_package_item - def fm(idpackage): - try: - yp, new = gp_call((idpackage, 0)) - except RepositoryError: - return 0 - yp.action = 'r' - yp.installed_match = (idpackage, 0,) - yp.color = SulfurConf.color_install - return yp - return [x for x in map(fm, + def _pkg_get_orphans(self): + updates, remove, fine, spm_fine = self.Entropy.calculate_updates( + critical_updates = False) + return [x for x in map(self.__inst_pkg_setup, remove) if not \ + isinstance(x, int)] + + def _pkg_get_installed(self): + return [x for x in map(self.__inst_pkg_setup, self.Entropy.clientDbconn.listAllIdpackages(order_by = 'atom')) if \ not isinstance(x, int)] @@ -721,7 +726,7 @@ class EntropyPackages: def _pkg_get_updates_raw(self): return self._pkg_get_updates(critical_updates = False) - def _pkg_get_updates(self, critical_updates = True): + def _pkg_get_updates(self, critical_updates = True, orphans = False): gp_call = self.get_package_item cdb_atomMatch = self.Entropy.clientDbconn.atomMatch @@ -1022,6 +1027,7 @@ class EntropyPackages: "queued": self._pkg_get_queued, "available": self._pkg_get_available, "updates": self._pkg_get_updates, + "orphans": self._pkg_get_orphans, "unfiltered_updates": self._pkg_get_updates_raw, "reinstallable": self._pkg_get_reinstallable, "masked": self._pkg_get_masked,