From 816fbaf42407fbbb8466c0d08d64fc11f605e5b6 Mon Sep 17 00:00:00 2001 From: René 'Necoro' Neumann Date: Wed, 28 Jan 2009 13:13:56 +0100 Subject: Use the new database class layout --- portato/gui/windows/main.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'portato/gui/windows/main.py') diff --git a/portato/gui/windows/main.py b/portato/gui/windows/main.py index 0882c2a..b8d3c17 100644 --- a/portato/gui/windows/main.py +++ b/portato/gui/windows/main.py @@ -26,11 +26,12 @@ from ...backend import flags, system # must be the first to avoid circular deps from ... import get_listener, plugin from ...helper import debug, warning, error, info, unique_array from ...session import Session +from ...db import Database from ...constants import CONFIG_LOCATION, VERSION, APP_ICON, ICON_DIR from ...backend.exceptions import PackageNotFoundException, BlockedException # more GUI stuff -from ..utils import Database, Config, GtkThread, get_color +from ..utils import Config, GtkThread, get_color from ..queue import EmergeQueue from ..session import SESSION_VERSION, SessionException, OldSessionException, NewSessionException from ..wrapper import GtkTree, GtkConsole -- cgit v1.2.3-54-g00ecf From 2a5e9163052e607e509da61c674502cad30de65c Mon Sep 17 00:00:00 2001 From: René 'Necoro' Neumann Date: Wed, 28 Jan 2009 15:40:50 +0100 Subject: Add a global session list --- portato/gui/windows/main.py | 4 ++-- portato/session.py | 21 ++++++++++++++++++--- 2 files changed, 20 insertions(+), 5 deletions(-) (limited to 'portato/gui/windows/main.py') diff --git a/portato/gui/windows/main.py b/portato/gui/windows/main.py index 0882c2a..d66ca0c 100644 --- a/portato/gui/windows/main.py +++ b/portato/gui/windows/main.py @@ -1826,8 +1826,8 @@ class MainWindow (Window): self.__save_queue = (ret == gtk.RESPONSE_YES) self.queue.kill_emerge() - # write session - self.session.save() + # write sessions + Session.close() return False diff --git a/portato/session.py b/portato/session.py index cd4737e..0bafee2 100644 --- a/portato/session.py +++ b/portato/session.py @@ -18,6 +18,8 @@ from .config_parser import ConfigParser, SectionNotFoundException from .constants import SESSION_DIR from .helper import debug, info +sessionlist = [] + class Session (object): """ A small class allowing to save certain states of a program. @@ -31,13 +33,14 @@ class Session (object): # the current session format version VERSION = 1 - def __init__ (self, file, name="", oldfiles = []): + def __init__ (self, file, name="", oldfiles = [], register = True): """ Initialize a session with a certain file inside L{SESSION_DIR}. @param file: the file in L{SESSION_DIR}, where the options will be saved. @param oldfiles: old file names for the same file @param name: short name describing the type of session + @param register: register in the global sessionlist, which is closed at the end """ self._cfg = None @@ -60,9 +63,9 @@ class Session (object): self._cfg = ConfigParser(file) if name: - i = _("Loading '%s' session from '%s'.") % (name, self._cfg.file) + i = _("Loading '%s' session from %s.") % (name, self._cfg.file) else: - i = _("Loading session from '%s'.") % self._cfg.file + i = _("Loading session from %s.") % self._cfg.file info(i) @@ -72,6 +75,9 @@ class Session (object): if e.errno == 2: pass else: raise + # register + if register: sessionlist.append(self) + # add version check self.add_handler(([("version", "session")], self.check_version, lambda: self.VERSION)) @@ -127,6 +133,15 @@ class Session (object): self._cfg.write() + @classmethod + def close (cls): + for s in sessionlist: + if s._name != "MAIN": + info(_("Saving '%s' session to %s.") % (s._name, s._cfg.file)) + else: + info(_("Saving session to %s.") % s._cfg.file) + s.save() + def set (self, key, value, section = ""): if not section: section = self._name -- cgit v1.2.3-54-g00ecf From f9fd4bbbe6778d27591c767c634e796a7054931e Mon Sep 17 00:00:00 2001 From: René 'Necoro' Neumann Date: Mon, 2 Feb 2009 12:05:33 +0100 Subject: Handle non existing versions --- portato/gui/dialogs.py | 7 +++++++ portato/gui/windows/main.py | 24 ++++++++++++++++++++---- 2 files changed, 27 insertions(+), 4 deletions(-) (limited to 'portato/gui/windows/main.py') diff --git a/portato/gui/dialogs.py b/portato/gui/dialogs.py index edf34b7..8931535 100644 --- a/portato/gui/dialogs.py +++ b/portato/gui/dialogs.py @@ -113,3 +113,10 @@ def prereq_error_dialog (e): ret = dialog.run() dialog.destroy() return ret + +def no_versions_dialog (cp): + dialog = gtk.MessageDialog(None, gtk.DIALOG_MODAL, gtk.MESSAGE_WARNING, gtk.BUTTONS_OK, _("No versions of package '%s' found!") % cp) + ret = dialog.run() + dialog.destroy() + return ret + diff --git a/portato/gui/windows/main.py b/portato/gui/windows/main.py index e51897f..472ddf0 100644 --- a/portato/gui/windows/main.py +++ b/portato/gui/windows/main.py @@ -28,7 +28,7 @@ from ...helper import debug, warning, error, info, unique_array from ...session import Session from ...db import Database from ...constants import CONFIG_LOCATION, VERSION, APP_ICON, ICON_DIR -from ...backend.exceptions import PackageNotFoundException, BlockedException +from ...backend.exceptions import PackageNotFoundException, BlockedException, VersionsNotFoundException # more GUI stuff from ..utils import Config, GtkThread, get_color @@ -38,7 +38,8 @@ from ..wrapper import GtkTree, GtkConsole from ..views import LogView, HighlightView, InstalledOnlyView, LazyStoreView from ..dialogs import (blocked_dialog, changed_flags_dialog, io_ex_dialog, nothing_found_dialog, queue_not_empty_dialog, remove_deps_dialog, - remove_queue_dialog, remove_updates_dialog, unmask_dialog) + remove_queue_dialog, remove_updates_dialog, unmask_dialog, + no_versions_dialog) from ..exceptions import PreReqError # even more GUI stuff @@ -745,7 +746,11 @@ class MainWindow (Window): store.clear() if name: - for cat, pkg, is_inst in self.db.get_cat(name, self.sortPkgListByName): + for cat, pkg, is_inst, disabled in self.db.get_cat(name, self.sortPkgListByName): + if disabled: + warning(_("Package '%s/%s' is disabled."), cat, pkg) + continue + if is_inst: icon = self.icons["installed"] elif not self.showAll: @@ -806,6 +811,8 @@ class MainWindow (Window): self.slotcol.set_visible(False) packages = system.sort_package_list(system.find_packages(cp, masked=True)) + if not packages: + raise VersionsNotFoundException(cp) # append versions for vers, inst, slot in ((x.get_version(), x.is_installed(), get_slot(x)) for x in packages): @@ -1336,8 +1343,17 @@ class MainWindow (Window): """ store, it = selection.get_selected() if it: + oldcp = self.selCP + self.selCP = "%s/%s" % (store.get_value(it, 2), store.get_value(it, 1)) - self.fill_version_list(self.selCP) + try: + self.fill_version_list(self.selCP) + except VersionsNotFoundException, e: + warning(_("No versions of package '%s' found!.") % self.selCP) + no_versions_dialog(self.selCP) + self.db.disable(self.selCP) + self.selCP = oldcp + return True def cb_pkg_list_header_clicked(self, col): -- cgit v1.2.3-54-g00ecf From a80ff9994c49b3aaba7d3f0bbf6317107fcf39bb Mon Sep 17 00:00:00 2001 From: René 'Necoro' Neumann Date: Mon, 2 Feb 2009 12:47:49 +0100 Subject: Do not show categories which only hold disabled packages --- portato/db/database.py | 4 +++- portato/db/dict.py | 7 +++++-- portato/db/sql.py | 12 ++++++++---- portato/gui/windows/main.py | 10 +++++----- 4 files changed, 21 insertions(+), 12 deletions(-) (limited to 'portato/gui/windows/main.py') diff --git a/portato/db/database.py b/portato/db/database.py index c36c5dc..bc78b01 100644 --- a/portato/db/database.py +++ b/portato/db/database.py @@ -59,13 +59,15 @@ class Database (object): """ raise NotImplentedError - def get_cat (self, cat = None, byName = True): + def get_cat (self, cat = None, byName = True, showDisabled = False): """Returns the packages in the category. @param cat: category to return the packages from; if None it defaults to C{ALL} @type cat: string @param byName: selects whether to return the list sorted by name or by installation @type byName: boolean + @param showDisabled: should disabled packages be returned + @type showDisabled: boolean @return: an iterator over the packages @rtype: L{PkgData} """ diff --git a/portato/db/dict.py b/portato/db/dict.py index fd859dd..d7e2649 100644 --- a/portato/db/dict.py +++ b/portato/db/dict.py @@ -62,17 +62,20 @@ class DictDatabase (Database): self._db[key].sort(key = self.__sort_key) @lock - def get_cat (self, cat = None, byName = True): + def get_cat (self, cat = None, byName = True, showDisabled = False): if not cat: cat = self.ALL def get_pkgs(): if byName: for pkg in self._db[cat]: - yield pkg + if showDisabled or not pkg.disabled: + yield pkg else: ninst = [] for pkg in self._db[cat]: + if not showDisabled and pkg.disabled: continue + if pkg.inst: yield pkg else: diff --git a/portato/db/sql.py b/portato/db/sql.py index b406981..cac5c97 100644 --- a/portato/db/sql.py +++ b/portato/db/sql.py @@ -169,15 +169,19 @@ class SQLDatabase (Database): connection.commit() @con - def get_cat (self, category = None, byName = True, connection = None): + def get_cat (self, category = None, byName = True, showDisabled = False, connection = None): sort = "ORDER BY name" if not byName: sort = "ORDER BY inst DESC, name" + disabled = "1=1" + if not showDisabled: + disabled = "disabled = 0" + if not category or category == self.ALL: - c = connection.execute("SELECT cat, name, inst, disabled FROM packages WHERE 1=1 %s %s" % (self.restrict, sort)) + c = connection.execute("SELECT cat, name, inst, disabled FROM packages WHERE %s %s %s" % (disabled, self.restrict, sort)) else: - c = connection.execute("SELECT cat, name, inst, disabled FROM packages WHERE cat = ? %s %s" % (self.restrict ,sort), (category,)) + c = connection.execute("SELECT cat, name, inst, disabled FROM packages WHERE cat = ? AND %s %s %s" % (disabled, self.restrict ,sort), (category,)) for pkg in c: yield PkgData(pkg["cat"], pkg["name"], pkg["inst"], pkg["disabled"]) @@ -191,7 +195,7 @@ class SQLDatabase (Database): else: where = "1 = 1" - c = connection.execute("SELECT cat FROM packages WHERE %s %s GROUP BY cat" % (where, self.restrict)) + c = connection.execute("SELECT cat FROM packages WHERE disabled = 0 AND %s %s GROUP BY cat" % (where, self.restrict)) l = c.fetchall() c.close() diff --git a/portato/gui/windows/main.py b/portato/gui/windows/main.py index 472ddf0..9f3c123 100644 --- a/portato/gui/windows/main.py +++ b/portato/gui/windows/main.py @@ -746,18 +746,18 @@ class MainWindow (Window): store.clear() if name: - for cat, pkg, is_inst, disabled in self.db.get_cat(name, self.sortPkgListByName): - if disabled: - warning(_("Package '%s/%s' is disabled."), cat, pkg) + for pkg in self.db.get_cat(name, self.sortPkgListByName): + if pkg.disabled: + warning(_("Package '%s/%s' is disabled."), pkg.cat, pkg.pkg) continue - if is_inst: + if pkg.inst: icon = self.icons["installed"] elif not self.showAll: continue # ignore not installed packages else: icon = None - store.append([icon, pkg, cat]) + store.append([icon, pkg.pkg, pkg.cat]) def build_version_list (self): store = gtk.ListStore(gtk.gdk.Pixbuf, str, str) -- cgit v1.2.3-54-g00ecf