From 5eda979fdfd005eff962524bda730a20061b103d Mon Sep 17 00:00:00 2001 From: Necoro <> Date: Sun, 7 Oct 2007 17:53:49 +0000 Subject: first catapult support --- portato/backend/__init__.py | 9 +- portato/backend/catapult/__init__.py | 16 ++++ portato/backend/catapult/package.py | 132 ++++++++++++++++++++++++++ portato/backend/catapult/system.py | 174 +++++++++++++++++++++++++++++++++++ portato/constants.py | 2 + portato/gui/gui_helper.py | 2 +- 6 files changed, 333 insertions(+), 2 deletions(-) create mode 100644 portato/backend/catapult/__init__.py create mode 100644 portato/backend/catapult/package.py create mode 100644 portato/backend/catapult/system.py diff --git a/portato/backend/__init__.py b/portato/backend/__init__.py index 92b77a8..16cebe6 100644 --- a/portato/backend/__init__.py +++ b/portato/backend/__init__.py @@ -12,10 +12,14 @@ from __future__ import absolute_import +from ..constants import USE_CATAPULT from .system_interface import SystemInterface from .exceptions import BlockedException, PackageNotFoundException, DependencyCalcError, InvalidSystemError -SYSTEM = "portage" # the name of the current system +if USE_CATAPULT: + SYSTEM = "catapult" +else: + SYSTEM = "portage" # the name of the current system _sys = None # the SystemInterface-instance class _Package (object): @@ -53,6 +57,9 @@ def load_system (): if SYSTEM == "portage": from .portage import PortageSystem _sys = PortageSystem () + elif SYSTEM == "catapult": + from .catapult import CatapultSystem + _sys = CatapultSystem() else: raise InvalidSystemError, SYSTEM diff --git a/portato/backend/catapult/__init__.py b/portato/backend/catapult/__init__.py new file mode 100644 index 0000000..47fc042 --- /dev/null +++ b/portato/backend/catapult/__init__.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# +# File: portato/backend/catapult/__init__.py +# This file is part of the Portato-Project, a graphical portage-frontend. +# +# Copyright (C) 2007 René 'Necoro' Neumann +# This is free software. You may redistribute copies of it under the terms of +# the GNU General Public License version 2. +# There is NO WARRANTY, to the extent permitted by law. +# +# Written by René 'Necoro' Neumann + +from __future__ import absolute_import + +from .system import CatapultSystem +from .package import CatapultPackage diff --git a/portato/backend/catapult/package.py b/portato/backend/catapult/package.py new file mode 100644 index 0000000..a756f33 --- /dev/null +++ b/portato/backend/catapult/package.py @@ -0,0 +1,132 @@ +# -*- coding: utf-8 -*- +# +# File: portato/backend/catapult/package.py +# This file is part of the Portato-Project, a graphical portage-frontend. +# +# Copyright (C) 2007 René 'Necoro' Neumann +# This is free software. You may redistribute copies of it under the terms of +# the GNU General Public License version 2. +# There is NO WARRANTY, to the extent permitted by law. +# +# Written by René 'Necoro' Neumann + +from __future__ import absolute_import, with_statement + +from ..package import Package +from .. import flags +from .. import system +from ..exceptions import BlockedException, PackageNotFoundException +from ...helper import debug, unique_array + +import dbus + +import os.path +from gettext import lgettext as _ + +class CatapultPackage(Package): + + def __init__ (self, cpv): + Package.__init__(self, cpv) + + self.bus = dbus.SessionBus() + # get the system + po = self.bus.get_object("org.gentoo.catapult.portage", "/org/gentoo/catapult/Package") + self.proxy = dbus.Interface(po, "org.gentoo.catapult.Package") + + def use_expanded (self, flag, suggest = None): + if not suggest: + suggest = "" + return self.proxy.use_expanded(self.get_cpv(), flag, suggest) + + def get_cp (self): + return self.proxy.get_cp(self.get_cpv()) + + def get_slot_cp (self): + return self.proxy.get_slot_cp(self.get_cpv()) + + def get_package_path(self): + return self.proxy.get_package_path(self.get_cpv()) + + def is_installed(self): + return self.proxy.is_installed(self.get_cpv()) + + def is_overlay(self): + return self.proxy.is_overlay(self.get_cpv()) + + def get_overlay_path(self): + return self.proxy.is_overlay_path(self.get_cpv()) + + def is_in_system (self): + return self.proxy.is_in_system(self.get_cpv()) + + def is_missing_keyword(self): + return self.proxy.is_missing_keyword(self.get_cpv()) + + def is_testing(self, use_keywords = False): + if not use_keywords: + return self.proxy.is_testing(self.get_cpv(), False) + else: + status = flags.new_testing_status(self.get_cpv()) + if status is None: + return self.proxy.is_testing(self.get_cpv(), True) + else: + return status + + def is_masked (self, use_changed = True): + if use_changed: + status = flags.new_masking_status(self.get_cpv()) + if status != None: # we have locally changed it + if status == "masked": return True + elif status == "unmasked": return False + else: + error(_("BUG in flags.new_masking_status. It returns \'%s\'"), status) + else: # we have not touched the status + return self.proxy.is_masked(self.get_cpv()) + else: # we want the original portage value XXX: bug if masked by user AND by system + if self.proxy.is_masked(self.get_cpv()): + if not flags.is_locally_masked(self, changes = False): # assume that if it is locally masked, it is not masked by the system + return True +# else: # more difficult: get the ones we unmasked, but are masked by the system +# try: +# masked = self._settings.settings.pmaskdict[self.get_cp()] +# except KeyError: # key error: not masked +# return False +# +# for cpv in masked: +# if self.matches(cpv): +# if not flags.is_locally_masked(self, changes = False): # assume that if it is locally masked, it is not masked by the system +# return True +# else: +# return False + + return False + + def get_masking_reason (self): + return self.proxy.get_masking_reason(self.get_cpv()) + + def get_iuse_flags (self, installed = False): + return self.proxy.get_iuse_flags(self.get_cpv(), installed) + + def get_matched_dep_packages (self, depvar): + return self.proxy.get_matched_dep_packages(self.get_cpv(), self.get_new_use_flags()) + + def get_dep_packages (self, depvar = ["RDEPEND", "PDEPEND", "DEPEND"], with_criterions = False): + return self.proxy.get_dep_packages(self.get_cpv(), depvar, self.get_new_use_flags(), with_criterions) + + def get_global_settings(self, key): + return self.proxy.get_global_settings(self.get_cpv(), key) + + def get_ebuild_path(self): + return self.proxy.get_ebuild_path(self.get_cpv()) + + def get_package_settings(self, var, tree = True): + return self.proxy.get_package_settings(self.get_cpv(), var, tree) + + def get_use_flags(self): + return " ".join(self.proxy.get_use_flags(self.get_cpv())) + + def compare_version(self, other): + return self.proxy.compare_version(self.get_cpv(), other) + + def matches (self, criterion): + return self.proxy.matches(self.get_cpv(), criterion) diff --git a/portato/backend/catapult/system.py b/portato/backend/catapult/system.py new file mode 100644 index 0000000..ba73ef6 --- /dev/null +++ b/portato/backend/catapult/system.py @@ -0,0 +1,174 @@ +# -*- coding: utf-8 -*- +# +# File: portato/backend/catapult/system.py +# This file is part of the Portato-Project, a graphical portage-frontend. +# +# Copyright (C) 2006-2007 René 'Necoro' Neumann +# This is free software. You may redistribute copies of it under the terms of +# the GNU General Public License version 2. +# There is NO WARRANTY, to the extent permitted by law. +# +# Written by René 'Necoro' Neumann + +from __future__ import absolute_import + +import re, os +from gettext import lgettext as _ +import dbus + +from .package import CatapultPackage +from ..system_interface import SystemInterface +from ...helper import debug, info, warning, unique_array + +class CatapultSystem (SystemInterface): + + def __init__ (self): + SystemInterface.__init__(self) + + self.bus = dbus.SessionBus() + # get the system + so = self.bus.get_object("org.gentoo.catapult.portage", "/org/gentoo/catapult/System") + self.proxy = dbus.Interface(so, "org.gentoo.catapult.System") + + def geneticize_list (self, list_of_packages, only_cpv = False): + """Convertes a list of cpv's into L{backend.Package}s. + + @param list_of_packages: the list of packages + @type list_of_packages: string[] + @param only_cpv: do nothing - return the passed list + @type only_cpv: boolean + @returns: converted list + @rtype: PortagePackage[] + """ + + if not only_cpv: + return [CatapultPackage(x) for x in list_of_packages] + else: + return list_of_packages + + + def split_cpv (self, cpv): + return self.proxy.split_cpv(cpv) + + def cpv_matches (self, cpv, criterion): + return self.proxy.cpv_matches(cpv, criterion) + + def find_best(self, list, only_cpv = False): + if only_cpv: + return self.proxy.find_best(list) + else: + return CatapultPackage(self.proxy.find_best(list)) + + def find_best_match (self, search_key, only_installed = False, only_cpv = False): + p = self.proxy.find_best_match(search_key, only_installed) + + if p and not only_cpv: + return CatapultPackage(p) + return p + + def find_packages (self, search_key, masked = False, only_cpv = False): + return self.geneticize_list(self.proxy.find_packages(search_key, masked), only_cpv) + + def find_installed_packages (self, search_key, masked = False, only_cpv = False): + return self.geneticize_list(self.proxy.find_installed_packages(search_key, masked), only_cpv) + + def find_system_packages (self, only_cpv = False): + + result = self.proxy.find_system_packages() + if only_cpv: + return result + else: + return tuple(map(self.geneticize_list, result)) + + def find_world_packages (self, only_cpv = False): + result = self.proxy.find_world_packages() + if only_cpv: + return result + else: + return tuple(map(self.geneticize_list, result)) + + def find_all_installed_packages (self, name = None, withVersion = True, only_cpv = False): + if not name: + name = "" + return self.geneticize_list(self.proxy.find_all_installed_packages(name, withVersion), (not withVersion) or only_cpv) + + def find_all_uninstalled_packages (self, name = None, only_cpv = False): + if not name: + name = "" + return self.geneticize_list(self.proxy.find_all_uninstalled_packages(name), only_cpv) + + def find_all_packages (self, name = None, withVersion = True, only_cpv = False): + if not name: + name = "" + return self.geneticize_list(self.proxy.find_all_packages(name, withVersion), (not withVersion) or only_cpv) + + def find_all_world_packages (self, name = None, only_cpv = False): + if not name: + name = "" + return self.geneticize_list(self.proxy.find_all_world_packages(name), only_cpv) + + def find_all_system_packages (self, name = None, only_cpv = False): + if not name: + name = "" + return self.geneticize_list(self.proxy.find_all_system_packages(name), only_cpv) + + def list_categories (self, name = None): + if not name: + name = "" + return self.proxy.list_categories(name) + + def sort_package_list(self, pkglist): + return self.geneticize_list(self.proxy.sort_package_list([x.get_cpv() for x in pkglist])) + + def reload_settings (self): + return self.proxy.reload_settings() + + def update_world (self, newuse = False, deep = False): + return [(CatapultPackage(x), CatapultPackage(y)) for x,y in self.proxy.update_world(newuse, deep, {})] + + def get_updated_packages (self): + return self.geneticize_list(self.proxy.get_updated_packages()) + + def get_use_desc (self, flag, package = None): + if not package: + package = "" + return self.proxy.get_use_desc(flag, package) + + def get_global_settings(self, key): + return self.proxy.get_global_settings(key) + + def new_package (self, cpv): + return CatapultPackage(cpv) + + def get_config_path (self): + return self.proxy.get_config_path() + + def get_world_file_path (self): + return self.proxy.get_world_file_path() + + def get_sync_command (self): + return self.proxy.get_sync_command() + + def get_merge_command (self): + return self.proxy.get_merge_command() + + def get_oneshot_option (self): + return self.proxy.get_oneshot_option() + + def get_newuse_option (self): + return self.proxy.get_newuse_option() + + def get_deep_option (self): + return self.proxy.get_deep_option() + + def get_update_option (self): + return self.proxy.get_update_option() + + def get_pretend_option (self): + return self.proxy.get_pretend_option() + + def get_unmerge_option (self): + return self.proxy.get_unmerge_option() + + def get_environment (self): + return self.proxy.get_environment() diff --git a/portato/constants.py b/portato/constants.py index 4d68ab5..d871e78 100644 --- a/portato/constants.py +++ b/portato/constants.py @@ -72,3 +72,5 @@ STD_FRONTEND = "gtk" SU_COMMAND = "gksu -D 'Portato'" SOCKET = "/tmp/portato.socket" + +USE_CATAPULT = False diff --git a/portato/gui/gui_helper.py b/portato/gui/gui_helper.py index fb531d7..ef7a508 100644 --- a/portato/gui/gui_helper.py +++ b/portato/gui/gui_helper.py @@ -206,7 +206,7 @@ class Database: self._db[cat].append((pkg, p in installed)) for key in self._db: # sort alphabetically - self._db[key].sort(cmp=cmp, key=lambda x: str.lower(x[0])) + self._db[key].sort(cmp=cmp, key=lambda x: x[0].lower()) def get_cat (self, cat, byName = True): """Returns the packages in the category. -- cgit v1.2.3-54-g00ecf