From 66df5c58c999b92af900b7a382cb2a7025c4b66a Mon Sep 17 00:00:00 2001 From: René 'Necoro' Neumann Date: Thu, 17 Apr 2008 21:25:31 +0200 Subject: Enhanced get_use_desc - similar to the 'unify' branch --- portato/backend/portage/system.py | 84 +++++++++++++++++++++------------------ 1 file changed, 45 insertions(+), 39 deletions(-) (limited to 'portato/backend/portage') diff --git a/portato/backend/portage/system.py b/portato/backend/portage/system.py index ef3feb9..a3583b1 100644 --- a/portato/backend/portage/system.py +++ b/portato/backend/portage/system.py @@ -3,17 +3,18 @@ # 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 +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 @@ -461,46 +465,48 @@ 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 + 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 + try: + f = open(os.path.join(dir, "profiles/use.local.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: + 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 = "" - 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, desc) + return desc -- cgit v1.2.3-54-g00ecf From 4cc1e681aaec4accbc72f33f51677d9aded037cc Mon Sep 17 00:00:00 2001 From: René 'Necoro' Neumann Date: Fri, 18 Apr 2008 01:55:15 +0200 Subject: Fixed update world to fit current portage handling --- portato/backend/portage/system.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) (limited to 'portato/backend/portage') diff --git a/portato/backend/portage/system.py b/portato/backend/portage/system.py index a3583b1..10fa9bc 100644 --- a/portato/backend/portage/system.py +++ b/portato/backend/portage/system.py @@ -36,6 +36,8 @@ class PortageSystem (SystemInterface): self.use_descs = {} self.local_use_descs = defaultdict(dict) + self._version = tuple([x.split("_")[0] for x in portage.VERSION.split(".")]) + def get_version (self): return "Portage %s" % portage.VERSION @@ -155,7 +157,7 @@ class PortageSystem (SystemInterface): return PortagePackage(portage.best(list)) def find_best_match (self, search_key, masked = False, only_installed = False, only_cpv = False): - t = None + t = [] if not only_installed: try: @@ -173,11 +175,14 @@ class PortageSystem (SystemInterface): t += self.settings.porttree.dbapi.match(cp) else: raise - else: - t = self.find_installed_packages(search_key, masked, only_cpv = True) + + if self._version >= (2,1,5) or only_installed: + t += [pkg.get_cpv() for pkg in self.find_installed_packages(search_key) if not pkg.is_masked()] if t: + t = unique_array(t) return self.find_best(t, only_cpv) + return None def find_packages (self, search_key, masked=False, only_cpv = False): @@ -373,7 +378,7 @@ class PortageSystem (SystemInterface): # append system packages packages.extend(unique_array([p.get_cp() for p in self.find_all_system_packages()])) - states = [(["RDEPEND"], True)] + states = [(["RDEPEND", "PDEPEND"], True)] if self.with_bdeps(): states.append((["DEPEND"], True)) -- cgit v1.2.3-54-g00ecf From f8e2398f5d965e43c860f79739c0934652ff4c56 Mon Sep 17 00:00:00 2001 From: René 'Necoro' Neumann Date: Fri, 16 May 2008 17:47:27 +0200 Subject: Fixed 'find_best_match' and 'update_world' to better mimic portage's behavior --- portato/backend/portage/system.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'portato/backend/portage') diff --git a/portato/backend/portage/system.py b/portato/backend/portage/system.py index 10fa9bc..459fe07 100644 --- a/portato/backend/portage/system.py +++ b/portato/backend/portage/system.py @@ -177,7 +177,7 @@ class PortageSystem (SystemInterface): raise if self._version >= (2,1,5) or only_installed: - t += [pkg.get_cpv() for pkg in self.find_installed_packages(search_key) if not pkg.is_masked()] + t += [pkg.get_cpv() for pkg in self.find_installed_packages(search_key) if not (pkg.is_testing(True) or pkg.is_masked())] if t: t = unique_array(t) @@ -454,7 +454,7 @@ class PortageSystem (SystemInterface): else: for pkg in bm: if not pkg: continue - if pkg.is_masked() or pkg.is_testing(True): # check to not update unnecessairily + if not pkg.is_installed() and (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): if self.cpv_matches(inst, i): -- cgit v1.2.3-54-g00ecf