From c8ab8375fe4f719ca484b0f395fd3812c73444aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20=27Necoro=27=20Neumann?= Date: Thu, 17 Apr 2008 10:25:39 +0200 Subject: Changed 'is_overlay' to 'is_in_overlay' --- portato/backend/package.py | 7 +++---- portato/backend/portage/package.py | 2 +- portato/gui/windows/main.py | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/portato/backend/package.py b/portato/backend/package.py index 1e17b1f..16148d2 100644 --- a/portato/backend/package.py +++ b/portato/backend/package.py @@ -165,9 +165,8 @@ class Package (_Package): p = self.get_ebuild_path() sp = p.split("/") - if len(sp): - import string - return string.join(sp[:-1],"/") + if sp: + return "/".join(sp[:-1]) def get_dependencies (self): """ @@ -243,7 +242,7 @@ class Package (_Package): raise NotImplementedError - def is_overlay(self): + def is_in_overlay(self): """Returns true if the package is in an overlay. @rtype: boolean""" diff --git a/portato/backend/portage/package.py b/portato/backend/portage/package.py index dc3cde3..5f1fa74 100644 --- a/portato/backend/portage/package.py +++ b/portato/backend/portage/package.py @@ -88,7 +88,7 @@ class PortagePackage (Package): def is_installed(self): return self._settings.vartree.dbapi.cpv_exists(self._cpv) - def is_overlay(self): + def is_in_overlay(self): dir,ovl = self._settings.porttree.dbapi.findname2(self._cpv) return ovl != self._settings.settings["PORTDIR"] and str(ovl) != "0" diff --git a/portato/gui/windows/main.py b/portato/gui/windows/main.py index 99739ae..1962e12 100644 --- a/portato/gui/windows/main.py +++ b/portato/gui/windows/main.py @@ -173,7 +173,7 @@ class PackageTable: self.descLabel.set_label(desc) # overlay - if pkg.is_overlay(): + if pkg.is_in_overlay(): self.overlayLabel.set_label(pkg.get_overlay_path()) self.overlayLabel.show() self.overlayLL.show() -- cgit v1.2.3 From da138a749908cb653de6f1b96c806bab5bd0f7d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20=27Necoro=27=20Neumann?= Date: Thu, 17 Apr 2008 10:45:22 +0200 Subject: Make get_package_settings take an 'installed' argument instead of a tree --- portato/backend/package.py | 6 +++--- portato/backend/portage/package.py | 25 +++++++++++-------------- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/portato/backend/package.py b/portato/backend/package.py index 16148d2..4dc439a 100644 --- a/portato/backend/package.py +++ b/portato/backend/package.py @@ -369,13 +369,13 @@ class Package (_Package): raise NotImplementedError - def get_package_settings(self, var, tree = None): + def get_package_settings(self, var, installed = True): """Returns a package specific setting, such as DESCRIPTION, SRC_URI, IUSE ... @param var: the setting to get @type var: string - @param tree: an object defining whether to take the information from the installed package or from the ebuild - @type tree: unknown + @param installed: take the vartree or the porttree + @type installed: boolean @returns: the value of the setting @rtype: string""" diff --git a/portato/backend/portage/package.py b/portato/backend/portage/package.py index 5f1fa74..37fa230 100644 --- a/portato/backend/portage/package.py +++ b/portato/backend/portage/package.py @@ -163,12 +163,10 @@ class PortagePackage (Package): return reason def get_iuse_flags (self, installed = False, removeForced = True): - if installed or not self.is_in_system(): - tree = self._settings.vartree - else: - tree = self._settings.porttree + if not self.is_in_system(): + installed = True - iuse = flags.filter_defaults(self.get_package_settings("IUSE", tree = tree).split()) + iuse = flags.filter_defaults(self.get_package_settings("IUSE", installed = installed).split()) iuse = set(iuse) @@ -184,11 +182,11 @@ class PortagePackage (Package): depstring = "" try: for d in depvar: - depstring += self.get_package_settings(d, tree = self._settings.porttree)+" " + depstring += self.get_package_settings(d, installed = False)+" " except KeyError: # not found in porttree - use vartree depstring = "" for d in depvar: - depstring += self.get_package_settings(d, tree = self._settings.vartree)+" " + depstring += self.get_package_settings(d, installed = True)+" " deps = portage.dep_check(depstring, None, self._settings.settings, myuse = actual, trees = self._trees) @@ -210,7 +208,7 @@ class PortagePackage (Package): depstring = "" for d in depvar: - depstring += self.get_package_settings(d, tree=self._settings.porttree)+" " + depstring += self.get_package_settings(d, installed = False)+" " # let portage do the main stuff ;) # pay attention to any changes here @@ -280,20 +278,19 @@ class PortagePackage (Package): for line in f: yield line.split()[1].strip() - def get_package_settings(self, var, tree = None): - if not tree: + def get_package_settings(self, var, installed = True): + if installed and self.is_installed(): mytree = self._settings.vartree - if not self.is_installed(): - mytree = self._settings.porttree else: - mytree = tree + mytree = self._settings.porttree + r = mytree.dbapi.aux_get(self._cpv,[var]) return r[0] def get_installed_use_flags(self): if self.is_installed(): - return self.get_package_settings("USE", tree = self._settings.vartree).split() + return self.get_package_settings("USE", installed = True).split() else: return [] def compare_version(self,other): -- cgit v1.2.3 From 58f6704d1f3a178781229e9c7c0c4145d0b3e8ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20=27Necoro=27=20Neumann?= Date: Thu, 17 Apr 2008 11:43:52 +0200 Subject: Ported the find_* and the get_use_desc from catapult --- portato/backend/portage/system.py | 234 ++++++++++++++++++-------------------- 1 file changed, 113 insertions(+), 121 deletions(-) diff --git a/portato/backend/portage/system.py b/portato/backend/portage/system.py index ef3feb9..d07fa6d 100644 --- a/portato/backend/portage/system.py +++ b/portato/backend/portage/system.py @@ -12,8 +12,9 @@ from __future__ import absolute_import -import re, os +import re, os, os.path import portage +from collections import defaultdict from .package import PortagePackage from .settings import PortageSettings @@ -30,7 +31,10 @@ class PortageSystem (SystemInterface): def __init__ (self): """Constructor.""" self.settings = PortageSettings() - portage.WORLD_FILE = self.settings.settings["ROOT"]+portage.WORLD_FILE + portage.WORLD_FILE = os.path.join(self.settings.settings["ROOT"], portage.WORLD_FILE) + + self.use_descs = {} + self.local_use_descs = defaultdict(dict) def get_version (self): return "Portage %s" % portage.VERSION @@ -175,46 +179,98 @@ class PortageSystem (SystemInterface): if t: return self.find_best(t, only_cpv) return None + + def find_packages (self, key = "", pkgSet = "all", masked = False, with_version = True, only_cpv = False): - def find_packages (self, search_key, masked=False, only_cpv = False): - try: - if masked: - t = self.settings.porttree.dbapi.xmatch("match-all", search_key) - t += self.settings.vartree.dbapi.match(search_key) + is_regexp = key == "" or ("*" in key and key[0] not in ("*","=","<",">","~","!")) + + def installed(key): + if is_regexp: + if with_version: + t = self.settings.vartree.dbapi.cpv_all() + t = self.settings.vartree.dbapi.cp_all() + + if key: + t = filter(lambda x: re.match(key, x, re.I), t) + + return t + else: + return self.settings.vartree.dbapi.match(key) + + def tree(key): + if is_regexp: + if with_version: + t = self.settings.porttree.dbapi.cpv_all() + else: + t = self.settings.porttree.dbapi.cp_all() + + if key: + t = filter(lambda x: re.match(key, x, re.I), t) + + elif masked: + t = self.settings.porttree.dbapi.xmatch("match-all", key) else: - t = self.settings.porttree.dbapi.match(search_key) - t += self.settings.vartree.dbapi.match(search_key) + t = self.settings.porttree.dbapi.match(key) + + return t + + def all(key): + return unique_array(installed(key)+tree(key)) + + def uninstalled (key): + alist = set(all(key)) + inst = set(installed(key)) + return list(alist - inst) + + def _ws (key, crit, pkglist): + list = self.__find_resolved_unresolved(pkglist, crit)[0] + if not with_version: + list = [self.pkg.get_cp(x) for x in list] + + if is_regexp: + return filter(lambda x: re.match(key, x, re.I), list) + + return list + + def world (key): + with open(portage.WORLD_FILE) as f: + pkglist = f.readlines() + + return _ws(key, lambda cpv: cpv[0] != "#", pkglist) + + def system (key): + return _ws(key, lambda cpv: cpv[0] == "*", self.settings.settings.packages) + + pkgSet = pkgSet.lower() + if pkgSet == "" or pkgSet == "all": + func = all + elif pkgSet == "installed": + func = installed + elif pkgSet == "uninstalled": + func = uninstalled + elif pkgSet == "world": + func = world + elif pkgSet == "system": + func = system + elif pkgSet == "tree": + func = tree + + try: + t = func(key) # catch the "ambigous package" Exception except ValueError, e: if isinstance(e[0], list): t = [] for cp in e[0]: - if masked: - t += self.settings.porttree.dbapi.xmatch("match-all", cp) - t += self.settings.vartree.dbapi.match(cp) - else: - t += self.settings.porttree.dbapi.match(cp) - t += self.settings.vartree.dbapi.match(cp) + t += func(cp) else: raise + # Make the list of packages unique t = unique_array(t) t.sort() - return self.geneticize_list(t, only_cpv) - def find_installed_packages (self, search_key, masked = False, only_cpv = False): - try: - t = self.settings.vartree.dbapi.match(search_key) - # catch the "ambigous package" Exception - except ValueError, e: - if isinstance(e[0], list): - t = [] - for cp in e[0]: - t += self.settings.vartree.dbapi.match(cp) - else: - raise ValueError(e) - - return self.geneticize_list(t, only_cpv) + return geneticize_list(t, only_cpv) def __find_resolved_unresolved (self, list, check, only_cpv = False): """Checks a given list and divides it into a "resolved" and an "unresolved" part. @@ -239,63 +295,6 @@ class PortageSystem (SystemInterface): else: unresolved.append(self.find_best_match(cpv, True, only_cpv = only_cpv)) return (resolved, unresolved) - - def find_system_packages (self, only_cpv = False): - pkglist = self.settings.settings.packages - - return self.__find_resolved_unresolved(pkglist, lambda cpv: cpv[0] == "*", only_cpv) - - def find_world_packages (self, only_cpv = False): - f = open(portage.WORLD_FILE) - pkglist = f.readlines() - f.close() - - return self.__find_resolved_unresolved(pkglist, lambda cpv: cpv[0] != "#", only_cpv) - - def find_all_installed_packages (self, name = None, withVersion=True, only_cpv = False): - if withVersion: - t = self.settings.vartree.dbapi.cpv_all() - if name: - t = filter(self.find_lambda(name),t) - return self.geneticize_list(t, only_cpv) - - else: - t = self.settings.vartree.dbapi.cp_all() - if name: - t = filter(self.find_lambda(name),t) - return t - - def find_all_uninstalled_packages (self, name = None, only_cpv = False): - alist = self.find_all_packages(name) - return self.geneticize_list([x.get_cpv() for x in alist if not x.is_installed()], only_cpv) - - def find_all_packages (self, name = None, withVersion = True, only_cpv = False): - t = self.settings.porttree.dbapi.cp_all() - t += self.settings.vartree.dbapi.cp_all() - if name: - t = filter(self.find_lambda(name),t) - - t = filter(lambda x: not self.unwantedPkgsRE.match(x), unique_array(t)) - - if withVersion: - t2 = [] - for x in t: - t2 += self.settings.porttree.dbapi.cp_list(x) - t2 += self.settings.vartree.dbapi.cp_list(x) - t2 = unique_array(t2) - return self.geneticize_list(t2, only_cpv) - else: - return t - - def find_all_world_packages (self, name = None, only_cpv = False): - world = filter(self.find_lambda(name), self.find_world_packages(only_cpv = True)[0]) - world = unique_array(world) - return self.geneticize_list(world, only_cpv) - - def find_all_system_packages (self, name = None): - sys = filter(self.find_lambda(name), self.find_system_packages(only_cpv = True)[0]) - sys = unique_array(sys) - return self.geneticize_list(sys) def list_categories (self, name = None): categories = self.settings.settings.categories @@ -461,46 +460,39 @@ class PortageSystem (SystemInterface): check(p, True) return updating - - use_descs = {} - local_use_descs = {} + def get_use_desc (self, flag, package = None): # In the first run the dictionaries 'use_descs' and 'local_use_descs' are filled. # fill cache if needed - if self.use_descs == {} or self.local_use_descs == {}: - # read use.desc - fd = open(self.settings.settings["PORTDIR"]+"/profiles/use.desc") - lines = fd.readlines() - fd.close() - for line in lines: - line = line.strip() - if line != "" and line[0] != '#': - fields = [x.strip() for x in line.split(" - ",1)] - if len(fields) == 2: - self.use_descs[fields[0]] = fields[1] - - # read use.local.desc - fd = open(self.settings.settings["PORTDIR"]+"/profiles/use.local.desc") - lines = fd.readlines() - fd.close() - for line in lines: - line = line.strip() - if line != "" and line[0] != '#': - fields = [x.strip() for x in line.split(":",1)] - if len(fields) == 2: - if not fields[0] in self.local_use_descs: # create - self.local_use_descs[fields[0]] = {} - subfields = [x.strip() for x in fields[1].split(" - ",1)] - if len(subfields) == 2: - self.local_use_descs[fields[0]][subfields[0]] = subfields[1] + if not self.use_descs and not self.local_use_descs: + for dir in [self.settings.settings["PORTDIR"]] + self.settings.settings["PORTDIR_OVERLAY"].split(): + # read use.desc + with open(os.path.join(dir, "profiles/use.desc")) as f: + for line in f: + line = line.strip() + if line and line[0] != '#': + fields = [x.strip() for x in line.split(" - ",1)] + if len(fields) == 2: + self.use_descs[fields[0]] = fields[1] + + # read use.local.desc + with open(os.path.join(dir, "profiles/use.local.desc")) as f: + for line in f: + line = line.strip() + if line and line[0] != '#': + fields = [x.strip() for x in line.split(":",1)] + if len(fields) == 2: + subfields = [x.strip() for x in fields[1].split(" - ",1)] + if len(subfields) == 2: + self.local_use_descs[fields[0]].update([subfields]) # start - desc = "" - if flag in self.use_descs: - desc = self.use_descs[flag] - if package != None: + desc = self.use_descs.get(flag) + if package is not None: if package in self.local_use_descs: - if flag in self.local_use_descs[package]: - desc = self.local_use_descs[package][flag] + desc = self.local_use_descs[package].get(flag) + + if desc is None: return "" + return desc -- cgit v1.2.3 From 3b446c965b7319ed56d69057743220c8278e0703 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20=27Necoro=27=20Neumann?= Date: Thu, 17 Apr 2008 11:50:38 +0200 Subject: Cleaned up interface --- portato/backend/portage/system.py | 2 +- portato/backend/system_interface.py | 131 +++--------------------------------- 2 files changed, 12 insertions(+), 121 deletions(-) diff --git a/portato/backend/portage/system.py b/portato/backend/portage/system.py index d07fa6d..0b5124c 100644 --- a/portato/backend/portage/system.py +++ b/portato/backend/portage/system.py @@ -270,7 +270,7 @@ class PortageSystem (SystemInterface): t = unique_array(t) t.sort() - return geneticize_list(t, only_cpv) + return geneticize_list(t, only_cpv or not with_version) def __find_resolved_unresolved (self, list, check, only_cpv = False): """Checks a given list and divides it into a "resolved" and an "unresolved" part. diff --git a/portato/backend/system_interface.py b/portato/backend/system_interface.py index a523af7..3c50675 100644 --- a/portato/backend/system_interface.py +++ b/portato/backend/system_interface.py @@ -75,31 +75,20 @@ class SystemInterface (object): raise NotImplementedError - def find_packages (self, search_key, masked = False, only_cpv = False): - """This returns a list of packages which have to fit exactly. Additionally ranges like '<,>,=,~,!' et. al. are possible. + def find_packages (self, key, set = "all", masked = False, with_version = True, only_cpv = False): + """This returns a list of packages matching the key. + As key, it is allowed to use basic regexps (".*") and the normal package specs. But not a combination + of them. - @param search_key: the key to look for - @type search_key: string - @param masked: if True, also look for masked packages - @type masked: boolean - @param only_cpv: do not return package but only the cpv - @type only_cpv: boolean - - @returns: list of found packages - @rtype: backend.Package[] or string[] - """ - - raise NotImplementedError - - - def find_installed_packages (self, search_key, masked = False, only_cpv = False): - """This returns a list of packages which have to fit exactly. Additionally ranges like '<,>,=,~,!' et. al. are possible. - - @param search_key: the key to look for - @type search_key: string + @param key: the key to look for + @type key: string + @param all: the package set to use + @type all: string @param masked: if True, also look for masked packages @type masked: boolean - @param only_cpv: do not return package but only the cpv + @param with_version: if True, return CPVs - else CP + @type with_version: boolean + @param only_cpv: do not return package but only the cpv. if with_version is False, this is ignored @type only_cpv: boolean @returns: list of found packages @@ -108,104 +97,6 @@ class SystemInterface (object): raise NotImplementedError - def find_system_packages (self, only_cpv = False): - """Looks for all packages saved as "system-packages". - - @param only_cpv: do not return package but only the cpv - @type only_cpv: boolean - - @returns: a tuple of (resolved_packages, unresolved_packages). - @rtype: (backend.Package[], backend.Package[]) or (string[], string[]) - """ - - raise NotImplementedError - - def find_world_packages (self, only_cpv = False): - """Looks for all packages saved in the world-file. - - @param only_cpv: do not return package but only the cpv - @type only_cpv: boolean - - @returns: a tuple of (resolved_packages, unresolved_packages). - @rtype: (backend.Package[], backend.Package[]) or (string[], string[]) - """ - - raise NotImplementedError - - def find_all_installed_packages (self, name = None, withVersion = True, only_cpv = False): - """Finds all installed packages matching a name or all if no name is specified. - - @param name: the name to look for - it is expanded to .*name.* ; if None, all packages are returned - @type name: string or None - @param withVersion: if True version-specific packages are returned; else only the cat/package-strings a delivered - @type withVersion: boolean - @param only_cpv: do not return package but only the cpv - @type only_cpv: boolean - - @returns: all packages/cp-strings found - @rtype: backend.Package[] or string[] - """ - - raise NotImplementedError - - def find_all_uninstalled_packages (self, name = None, only_cpv = False): - """Finds all uninstalled packages matching a name or all if no name is specified. - - @param name: the name to look for - it is expanded to .*name.* ; if None, all packages are returned - @type name: string or None - @param only_cpv: do not return package but only the cpv - @type only_cpv: boolean - - @returns: all packages found - @rtype: backend.Package[] or string[] - """ - - raise NotImplementedError - - def find_all_packages (self, name = None, withVersion = True, only_cpv = False): - """Finds all packages matching a name or all if no name is specified. - - @param name: the name to look for - it is expanded to .*name.* ; if None, all packages are returned - @type name: string or None - @param withVersion: if True version-specific packages are returned; else only the cat/package-strings a delivered - @type withVersion: boolean - @param only_cpv: do not return package but only the cpv - @type only_cpv: boolean - - @returns: all packages/cp-strings found - @rtype: backend.Package[] or string[] - """ - - raise NotImplementedError - - def find_all_world_packages (self, name = None, only_cpv = False): - """Finds all world packages matching a name or all if no name is specified. - - @param name: the name to look for - it is expanded to .*name.* ; if None, all packages are returned - @type name: string or None - @param only_cpv: do not return package but only the cpv - @type only_cpv: boolean - - @returns: all packages found - @rtype: backend.Package[] or string[] - """ - - raise NotImplementedError - - def find_all_system_packages (self, name = None, only_cpv = False): - """Finds all system packages matching a name or all if no name is specified. - - @param name: the name to look for - it is expanded to .*name.* ; if None, all packages are returned - @type name: string or None - @param only_cpv: do not return package but only the cpv - @type only_cpv: boolean - - @returns: all packages found - @rtype: backend.Package[] or string[] - """ - - raise NotImplementedError - def list_categories (self, name = None): """Finds all categories matching a name or all if no name is specified. -- cgit v1.2.3 From f10c0e92853aef25a765925bd54608ced73cd164 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20=27Necoro=27=20Neumann?= Date: Thu, 17 Apr 2008 21:24:25 +0200 Subject: Fixed get_use_desc --- portato/backend/portage/system.py | 25 +++++++++++++++++-------- portato/backend/system_interface.py | 2 +- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/portato/backend/portage/system.py b/portato/backend/portage/system.py index 0b5124c..78afa52 100644 --- a/portato/backend/portage/system.py +++ b/portato/backend/portage/system.py @@ -3,14 +3,14 @@ # File: portato/backend/portage/system.py # This file is part of the Portato-Project, a graphical portage-frontend. # -# Copyright (C) 2006-2007 René 'Necoro' Neumann +# Copyright (C) 2006-2008 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 __future__ import absolute_import, with_statement import re, os, os.path import portage @@ -467,17 +467,24 @@ class PortageSystem (SystemInterface): # fill cache if needed if not self.use_descs and not self.local_use_descs: for dir in [self.settings.settings["PORTDIR"]] + self.settings.settings["PORTDIR_OVERLAY"].split(): + # read use.desc - with open(os.path.join(dir, "profiles/use.desc")) as f: + try: + f = open(os.path.join(dir, "profiles/use.desc")) for line in f: line = line.strip() if line and line[0] != '#': fields = [x.strip() for x in line.split(" - ",1)] if len(fields) == 2: self.use_descs[fields[0]] = fields[1] + except IOError: + pass + finally: + f.close() # read use.local.desc - with open(os.path.join(dir, "profiles/use.local.desc")) as f: + try: + f = open(os.path.join(dir, "profiles/use.local.desc")) for line in f: line = line.strip() if line and line[0] != '#': @@ -486,13 +493,15 @@ class PortageSystem (SystemInterface): subfields = [x.strip() for x in fields[1].split(" - ",1)] if len(subfields) == 2: self.local_use_descs[fields[0]].update([subfields]) + except IOError: + pass + finally: + f.close() # start - desc = self.use_descs.get(flag) + desc = self.use_descs.get(flag, "") if package is not None: if package in self.local_use_descs: - desc = self.local_use_descs[package].get(flag) + desc = self.local_use_descs[package].get(flag, desc) - if desc is None: return "" - return desc diff --git a/portato/backend/system_interface.py b/portato/backend/system_interface.py index 3c50675..c22c857 100644 --- a/portato/backend/system_interface.py +++ b/portato/backend/system_interface.py @@ -3,7 +3,7 @@ # File: portato/backend/system_interface.py # This file is part of the Portato-Project, a graphical portage-frontend. # -# Copyright (C) 2007 René 'Necoro' Neumann +# Copyright (C) 2007-2008 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. -- cgit v1.2.3 From 6337bce4fd5ca7a7e7c16602fe7136bd6fdf4786 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20=27Necoro=27=20Neumann?= Date: Wed, 14 May 2008 17:28:41 +0200 Subject: Ported find_best_match --- portato/backend/portage/system.py | 35 +++++++++++------------------------ 1 file changed, 11 insertions(+), 24 deletions(-) diff --git a/portato/backend/portage/system.py b/portato/backend/portage/system.py index 78afa52..8536292 100644 --- a/portato/backend/portage/system.py +++ b/portato/backend/portage/system.py @@ -156,30 +156,19 @@ class PortageSystem (SystemInterface): def find_best_match (self, search_key, masked = False, only_installed = False, only_cpv = False): t = None - + if not only_installed: - try: - if masked: - t = self.settings.porttree.dbapi.xmatch("match-all", search_key) - else: - t = self.settings.porttree.dbapi.match(search_key) - except ValueError, e: # ambigous package - if isinstance(e[0], list): - t = [] - for cp in e[0]: - if masked: - t += self.settings.porttree.dbapi.xmatch("match-all", cp) - else: - t += self.settings.porttree.dbapi.match(cp) - else: - raise + pkgSet = "tree" else: - t = self.find_installed_packages(search_key, masked, only_cpv = True) + pkgSet = "installed" + + t = self.find_packages(search_key, pkgSet = pkgSet, masked = masked, with_version = True) if t: - return self.find_best(t, only_cpv) - return None - + return self.find_best(t) + + return t + def find_packages (self, key = "", pkgSet = "all", masked = False, with_version = True, only_cpv = False): is_regexp = key == "" or ("*" in key and key[0] not in ("*","=","<",">","~","!")) @@ -322,7 +311,7 @@ class PortageSystem (SystemInterface): new_packages = [] for p in packages: - inst = self.find_installed_packages(p) + inst = self.find_packages(p, "installed") best_p = self.find_best_match(p) if best_p is None: @@ -341,9 +330,7 @@ class PortageSystem (SystemInterface): myslots.add(best_p.get_package_settings("SLOT")) # add the slot of the best package in portage for slot in myslots: new_packages.append(\ - self.find_best(\ - [x.get_cpv() for x in self.find_packages("%s:%s" % (i.get_cp(), slot))]\ - )) + self.find_best(self.find_packages("%s:%s" % (i.get_cp(), slot), only_cpv = True))) else: new_packages.append(best_p) -- cgit v1.2.3 From adb8acd0b90992a8281494c76d30a529bde45fea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20=27Necoro=27=20Neumann?= Date: Wed, 21 May 2008 20:19:41 +0200 Subject: Ported package --- portato/backend/flags.py | 2 +- portato/backend/package.py | 10 ++++++---- portato/backend/portage/package.py | 39 +++++++++++++------------------------- 3 files changed, 20 insertions(+), 31 deletions(-) diff --git a/portato/backend/flags.py b/portato/backend/flags.py index d388e08..018e804 100644 --- a/portato/backend/flags.py +++ b/portato/backend/flags.py @@ -677,7 +677,7 @@ def set_testing (pkg, enable): if (enable and line != "-1") or (not enable and line == "-1"): newTesting[cpv].remove((file, line)) - if (enable and not pkg.is_testing(use_keywords=True)) or (not enable and pkg.is_testing(use_keywords=True)): + if (enable and not pkg.is_testing()) or (not enable and pkg.is_testing()): return if not enable: diff --git a/portato/backend/package.py b/portato/backend/package.py index 4dc439a..6d73a42 100644 --- a/portato/backend/package.py +++ b/portato/backend/package.py @@ -88,13 +88,15 @@ class Package (_Package): if f[0] == "~": f = f[1:] removed = True + + invf = flags.invert_use_flag(f) if f[0] == '-': - if flags.invert_use_flag(f) in i_flags and not (removed and flags.invert_use_flag(f) in m_flags): - i_flags.remove(flags.invert_use_flag(f)) + if invf in i_flags and not (removed and invf in m_flags): + i_flags.remove(invf) elif f not in i_flags: - if not (removed and flags.invert_use_flag(f) in m_flags): + if not (removed and invf in m_flags): i_flags.append(f) return i_flags @@ -270,7 +272,7 @@ class Package (_Package): raise NotImplementedError - def is_testing(self, use_keywords = False): + def is_testing(self, use_keywords = True): """Checks whether a package is marked as testing. @param use_keywords: Controls whether possible keywords are taken into account or not. diff --git a/portato/backend/portage/package.py b/portato/backend/portage/package.py index 37fa230..0452641 100644 --- a/portato/backend/portage/package.py +++ b/portato/backend/portage/package.py @@ -89,7 +89,7 @@ class PortagePackage (Package): return self._settings.vartree.dbapi.cpv_exists(self._cpv) def is_in_overlay(self): - dir,ovl = self._settings.porttree.dbapi.findname2(self._cpv) + ovl = self.get_overlay_path() return ovl != self._settings.settings["PORTDIR"] and str(ovl) != "0" def get_overlay_path (self): @@ -100,23 +100,17 @@ class PortagePackage (Package): return (self._status != None) def is_missing_keyword(self): - if self._status and "missing keyword" in self._status: - return True - return False + return self._status and "missing keyword" in self._status - def is_testing(self, use_keywords = False): + def is_testing(self, use_keywords = True): testArch = "~" + self.get_global_settings("ARCH") if not use_keywords: # keywords are NOT taken into account - if testArch in self.get_package_settings("KEYWORDS").split(): - return True - return False + return testArch in self.get_package_settings("KEYWORDS").split() else: # keywords are taken into account status = flags.new_testing_status(self.get_cpv()) if status is None: # we haven't changed it in any way - if self._status and testArch+" keyword" in self._status: - return True - return False + return self._status and testArch+" keyword" in self._status else: return status @@ -130,15 +124,13 @@ class PortagePackage (Package): else: error(_("BUG in flags.new_masking_status. It returns \'%s\'"), status) else: # we have not touched the status - if self._status and ("profile" in self._status or "package.mask" in self._status): - return True - return False + return self._status and ("profile" in self._status or "package.mask" in self._status) + else: # we want the original portage value XXX: bug if masked by user AND by system # get the normal masked ones if self._status and ("profile" in self._status or "package.mask" in self._status): - 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 + return flags.is_locally_masked(self, changes = False) # assume that if it is locally masked, it is not masked by the system else: # more difficult: get the ones we unmasked, but are masked by the system try: masked = self._settings.settings.pmaskdict[self.get_cp()] @@ -147,10 +139,7 @@ class PortagePackage (Package): 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 not flags.is_locally_masked(self, changes = False) # assume that if it is locally masked, it is not masked by the system return False @@ -158,7 +147,7 @@ class PortagePackage (Package): reason = portage.getmaskingreason(self.get_cpv(), settings = self._settings.settings) if reason: - return reason[:-1] # strip of last \n + return reason.strip() else: return reason @@ -234,9 +223,9 @@ class PortagePackage (Package): if dep[0] == '!': # blocking sth dep = dep[1:] if dep != self.get_cp(): # not cpv, because a version might explicitly block another one - blocked = system.find_installed_packages(dep) + blocked = system.find_packages(dep, "installed", only_cpv = True) if blocked != []: - raise BlockedException, (self.get_cpv(), blocked[0].get_cpv()) + raise BlockedException, (self.get_cpv(), blocked[0]) continue # finished with the blocking one -> next pkg = system.find_best_match(dep) @@ -246,10 +235,8 @@ class PortagePackage (Package): raise PackageNotFoundException, dep list = system.sort_package_list(list) - list.reverse() done = False - for i in range(len(list)): - p = list[i] + for p in reversed(list): if not p.is_masked(): dep_pkgs.append(create_dep_pkgs_data(dep, p)) done = True -- cgit v1.2.3 From 9ecb704361e551d02ef0a9d4a88f217e59e48c8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20=27Necoro=27=20Neumann?= Date: Wed, 21 May 2008 20:27:05 +0200 Subject: Ported to new find_packages API --- portato/backend/portage/system.py | 10 +++++----- portato/gui/queue.py | 2 +- portato/gui/utils.py | 4 ++-- portato/gui/windows/main.py | 6 +++--- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/portato/backend/portage/system.py b/portato/backend/portage/system.py index 8536292..8aebb85 100644 --- a/portato/backend/portage/system.py +++ b/portato/backend/portage/system.py @@ -337,7 +337,7 @@ class PortageSystem (SystemInterface): return new_packages def get_updated_packages (self): - packages = self.get_new_packages(self.find_all_installed_packages(withVersion = False)) + packages = self.get_new_packages(self.find_packages(set = "installed", withVersion = False)) packages = [x for x in packages if x is not None and not x.is_installed()] return packages @@ -353,7 +353,7 @@ class PortageSystem (SystemInterface): world.close() # append system packages - packages.extend(unique_array([p.get_cp() for p in self.find_all_system_packages()])) + packages.extend(unique_array([p.get_cp() for p in self.find_packages(set = "system")])) states = [(["RDEPEND"], True)] if self.with_bdeps(): @@ -379,11 +379,11 @@ class PortageSystem (SystemInterface): tempDeep = False if not p.is_installed(): - oldList = self.find_installed_packages(p.get_slot_cp()) + oldList = self.find_packages(p.get_slot_cp(), "installed") if oldList: old = oldList[0] # we should only have one package here - else it is a bug else: - oldList = self.sort_package_list(self.find_installed_packages(p.get_cp())) + oldList = self.sort_package_list(self.find_packages(p.get_cp(), "installed")) if not oldList: info(_("Found a not installed dependency: %s.") % p.get_cpv()) oldList = [p] @@ -433,7 +433,7 @@ class PortageSystem (SystemInterface): if not pkg: continue if pkg.is_masked() or pkg.is_testing(True): # check to not update unnecessairily cont = False - for inst in self.find_installed_packages(pkg.get_cp(), only_cpv = True): + for inst in self.find_packages(pkg.get_cp(), "installed", only_cpv = True): if self.cpv_matches(inst, i): debug("The installed %s matches %s. Discarding upgrade to masked version.", inst, i) cont = True diff --git a/portato/gui/queue.py b/portato/gui/queue.py index eb0a43e..a75048d 100644 --- a/portato/gui/queue.py +++ b/portato/gui/queue.py @@ -139,7 +139,7 @@ class EmergeQueue: try: pkg = self._get_pkg_from_cpv(cpv, unmask) if not pkg.is_installed(): - old = system.find_installed_packages(pkg.get_slot_cp()) + old = system.find_packages(pkg.get_slot_cp(), "installed") if old: old = old[0] # assume we have only one there cmp = pkg.compare_version(old) diff --git a/portato/gui/utils.py b/portato/gui/utils.py index 151ec22..01a6b2f 100644 --- a/portato/gui/utils.py +++ b/portato/gui/utils.py @@ -165,8 +165,8 @@ class Database (object): """ # get the lists - packages = system.find_all_packages(name = category, withVersion = False) - installed = system.find_all_installed_packages(name = category, withVersion = False) + packages = system.find_packages(category, withVersion = False) + installed = system.find_packages(category, set = "installed", withVersion = False) # cycle through packages for p in packages: diff --git a/portato/gui/windows/main.py b/portato/gui/windows/main.py index 1962e12..787bb28 100644 --- a/portato/gui/windows/main.py +++ b/portato/gui/windows/main.py @@ -145,7 +145,7 @@ class PackageTable: self.instPackages = self.packages = system.find_packages("=%s-%s" % (cp, version), masked = True) else: self.packages = system.sort_package_list(system.find_packages(cp, masked = True)) - self.instPackages = system.sort_package_list(system.find_installed_packages(cp, masked = True)) + self.instPackages = system.sort_package_list(system.find_packages(cp, "installed", masked = True)) # version-combo-box self.versionList.get_model().clear() @@ -1252,7 +1252,7 @@ class MainWindow (Window): if pkg.is_installed(): installed = set(pkg.get_iuse_flags()).intersection(pkg.get_installed_use_flags()) else: - inst = system.find_installed_packages(pkg.get_slot_cp()) + inst = system.find_packages(pkg.get_slot_cp(), "installed") if inst: installed = set(inst[0].get_iuse_flags()).intersection(inst[0].get_installed_use_flags()) else: @@ -1428,7 +1428,7 @@ class MainWindow (Window): if "/" not in text: text = "/.*"+text # only look for package names - packages = system.find_all_packages(text, withVersion = False) + packages = system.find_packages(text, withVersion = False) if packages == []: nothing_found_dialog() -- cgit v1.2.3 From 3023e6997fbd591667398b992c490d237205c85b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20=27Necoro=27=20Neumann?= Date: Wed, 21 May 2008 20:29:51 +0200 Subject: Ported to new find_packages API #2: withVersion --> with_version --- portato/backend/portage/system.py | 2 +- portato/gui/utils.py | 4 ++-- portato/gui/windows/main.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/portato/backend/portage/system.py b/portato/backend/portage/system.py index 8aebb85..adb9799 100644 --- a/portato/backend/portage/system.py +++ b/portato/backend/portage/system.py @@ -337,7 +337,7 @@ class PortageSystem (SystemInterface): return new_packages def get_updated_packages (self): - packages = self.get_new_packages(self.find_packages(set = "installed", withVersion = False)) + packages = self.get_new_packages(self.find_packages(set = "installed", with_version = False)) packages = [x for x in packages if x is not None and not x.is_installed()] return packages diff --git a/portato/gui/utils.py b/portato/gui/utils.py index 01a6b2f..7a3e8ee 100644 --- a/portato/gui/utils.py +++ b/portato/gui/utils.py @@ -165,8 +165,8 @@ class Database (object): """ # get the lists - packages = system.find_packages(category, withVersion = False) - installed = system.find_packages(category, set = "installed", withVersion = False) + packages = system.find_packages(category, with_version = False) + installed = system.find_packages(category, set = "installed", with_version = False) # cycle through packages for p in packages: diff --git a/portato/gui/windows/main.py b/portato/gui/windows/main.py index 787bb28..2c9eade 100644 --- a/portato/gui/windows/main.py +++ b/portato/gui/windows/main.py @@ -1428,7 +1428,7 @@ class MainWindow (Window): if "/" not in text: text = "/.*"+text # only look for package names - packages = system.find_packages(text, withVersion = False) + packages = system.find_packages(text, with_version = False) if packages == []: nothing_found_dialog() -- cgit v1.2.3 From 406603141a35e2be08e559fc9ec090c6c968b596 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20=27Necoro=27=20Neumann?= Date: Wed, 21 May 2008 20:37:09 +0200 Subject: Fixed errors, so the app starts --- portato/backend/portage/system.py | 14 ++++++++------ portato/backend/system_interface.py | 2 +- portato/gui/utils.py | 2 +- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/portato/backend/portage/system.py b/portato/backend/portage/system.py index adb9799..f92e34e 100644 --- a/portato/backend/portage/system.py +++ b/portato/backend/portage/system.py @@ -162,21 +162,23 @@ class PortageSystem (SystemInterface): else: pkgSet = "installed" - t = self.find_packages(search_key, pkgSet = pkgSet, masked = masked, with_version = True) + t = self.find_packages(search_key, pkgSet = pkgSet, masked = masked, with_version = True, only_cpv = True) if t: return self.find_best(t) - return t + return self.geneticize_list(t, only_cpv) def find_packages (self, key = "", pkgSet = "all", masked = False, with_version = True, only_cpv = False): - + if key is None: key = "" + is_regexp = key == "" or ("*" in key and key[0] not in ("*","=","<",">","~","!")) def installed(key): if is_regexp: if with_version: t = self.settings.vartree.dbapi.cpv_all() + else: t = self.settings.vartree.dbapi.cp_all() if key: @@ -259,7 +261,7 @@ class PortageSystem (SystemInterface): t = unique_array(t) t.sort() - return geneticize_list(t, only_cpv or not with_version) + return self.geneticize_list(t, only_cpv or not with_version) def __find_resolved_unresolved (self, list, check, only_cpv = False): """Checks a given list and divides it into a "resolved" and an "unresolved" part. @@ -337,7 +339,7 @@ class PortageSystem (SystemInterface): return new_packages def get_updated_packages (self): - packages = self.get_new_packages(self.find_packages(set = "installed", with_version = False)) + packages = self.get_new_packages(self.find_packages(pkgSet = "installed", with_version = False)) packages = [x for x in packages if x is not None and not x.is_installed()] return packages @@ -353,7 +355,7 @@ class PortageSystem (SystemInterface): world.close() # append system packages - packages.extend(unique_array([p.get_cp() for p in self.find_packages(set = "system")])) + packages.extend(unique_array([p.get_cp() for p in self.find_packages(pkgSet = "system")])) states = [(["RDEPEND"], True)] if self.with_bdeps(): diff --git a/portato/backend/system_interface.py b/portato/backend/system_interface.py index c22c857..4b0f8df 100644 --- a/portato/backend/system_interface.py +++ b/portato/backend/system_interface.py @@ -75,7 +75,7 @@ class SystemInterface (object): raise NotImplementedError - def find_packages (self, key, set = "all", masked = False, with_version = True, only_cpv = False): + def find_packages (self, key, pkgSet = "all", masked = False, with_version = True, only_cpv = False): """This returns a list of packages matching the key. As key, it is allowed to use basic regexps (".*") and the normal package specs. But not a combination of them. diff --git a/portato/gui/utils.py b/portato/gui/utils.py index 7a3e8ee..59210e1 100644 --- a/portato/gui/utils.py +++ b/portato/gui/utils.py @@ -166,7 +166,7 @@ class Database (object): # get the lists packages = system.find_packages(category, with_version = False) - installed = system.find_packages(category, set = "installed", with_version = False) + installed = system.find_packages(category, "installed", with_version = False) # cycle through packages for p in packages: -- cgit v1.2.3 From 43509c27dd08219147e4bcdb0897ebb2f5ec22cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20=27Necoro=27=20Neumann?= Date: Wed, 21 May 2008 21:03:58 +0200 Subject: Some more fixes --- portato/backend/portage/system.py | 36 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/portato/backend/portage/system.py b/portato/backend/portage/system.py index f92e34e..d0a0bc3 100644 --- a/portato/backend/portage/system.py +++ b/portato/backend/portage/system.py @@ -165,9 +165,7 @@ class PortageSystem (SystemInterface): t = self.find_packages(search_key, pkgSet = pkgSet, masked = masked, with_version = True, only_cpv = True) if t: - return self.find_best(t) - - return self.geneticize_list(t, only_cpv) + return self.find_best(t, only_cpv) def find_packages (self, key = "", pkgSet = "all", masked = False, with_version = True, only_cpv = False): if key is None: key = "" @@ -214,14 +212,14 @@ class PortageSystem (SystemInterface): return list(alist - inst) def _ws (key, crit, pkglist): - list = self.__find_resolved_unresolved(pkglist, crit)[0] + pkgs = self.__find_resolved_unresolved(pkglist, crit, only_cpv = with_version)[0] if not with_version: - list = [self.pkg.get_cp(x) for x in list] + pkgs = [x.get_cp(x) for x in list] if is_regexp: - return filter(lambda x: re.match(key, x, re.I), list) + return filter(lambda x: re.match(key, x, re.I), pkgs) - return list + return pkgs def world (key): with open(portage.WORLD_FILE) as f: @@ -232,19 +230,19 @@ class PortageSystem (SystemInterface): def system (key): return _ws(key, lambda cpv: cpv[0] == "*", self.settings.settings.packages) + funcmap = { + "all" : all, + "installed" : installed, + "uninstalled" : uninstalled, + "world" : world, + "system" : system, + "tree" : tree + } + pkgSet = pkgSet.lower() - if pkgSet == "" or pkgSet == "all": - func = all - elif pkgSet == "installed": - func = installed - elif pkgSet == "uninstalled": - func = uninstalled - elif pkgSet == "world": - func = world - elif pkgSet == "system": - func = system - elif pkgSet == "tree": - func = tree + if pkgSet == "": pkgSet = "all" + + func = funcmap[pkgSet] try: t = func(key) -- cgit v1.2.3 From be7f3e89a19cadad856dae717836f9ed3a66c85d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20=27Necoro=27=20Neumann?= Date: Wed, 21 May 2008 21:20:42 +0200 Subject: Small fixes --- portato/backend/portage/package.py | 2 +- portato/backend/portage/system.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/portato/backend/portage/package.py b/portato/backend/portage/package.py index 0452641..02d141a 100644 --- a/portato/backend/portage/package.py +++ b/portato/backend/portage/package.py @@ -130,7 +130,7 @@ class PortagePackage (Package): # get the normal masked ones if self._status and ("profile" in self._status or "package.mask" in self._status): - return flags.is_locally_masked(self, changes = False) # assume that if it is locally masked, it is not masked by the system + return not flags.is_locally_masked(self, changes = False) # assume that if it is locally masked, it is not masked by the system else: # more difficult: get the ones we unmasked, but are masked by the system try: masked = self._settings.settings.pmaskdict[self.get_cp()] diff --git a/portato/backend/portage/system.py b/portato/backend/portage/system.py index fa4fece..e14908c 100644 --- a/portato/backend/portage/system.py +++ b/portato/backend/portage/system.py @@ -167,7 +167,7 @@ class PortageSystem (SystemInterface): t = self.find_packages(search_key, pkgSet = pkgSet, masked = masked, with_version = True, only_cpv = True) if self._version >= (2,1,5): - t += [pkg.get_cpv() for pkg in self.find_installed_packages(search_key) if not (pkg.is_testing(True) or pkg.is_masked())] + t += [pkg.get_cpv() for pkg in self.find_packages(search_key, "installed") if not (pkg.is_testing(True) or pkg.is_masked())] if t: t = unique_array(t) -- cgit v1.2.3