aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'g_octave/description_tree.py')
-rw-r--r--g_octave/description_tree.py153
1 files changed, 43 insertions, 110 deletions
diff --git a/g_octave/description_tree.py b/g_octave/description_tree.py
index 7b27b35..299ffe1 100644
--- a/g_octave/description_tree.py
+++ b/g_octave/description_tree.py
@@ -16,22 +16,23 @@ from __future__ import absolute_import
__all__ = ['DescriptionTree']
+import glob
import os
import re
+from .config import Config
+from .description import Description
+from .log import Log
from portage.versions import vercmp
-from .config import Config, ConfigException
-from .description import *
-from .exception import DescriptionTreeException
-from .log import Log
log = Log('g_octave.description_tree')
-
config = Config()
+
# from http://wiki.python.org/moin/HowTo/Sorting/
def cmp_to_key(mycmp):
'Convert a cmp= function into a key= function'
+
class K(object):
def __init__(self, obj, *args):
self.obj = obj
@@ -47,132 +48,64 @@ def cmp_to_key(mycmp):
return mycmp(self.obj, other.obj) >= 0
def __ne__(self, other):
return mycmp(self.obj, other.obj) != 0
+
return K
-class DescriptionTree(object):
+
+class DescriptionTree(list):
def __init__(self, parse_sysreq=True):
-
log.info('Parsing the package database.')
-
- self._parse_sysreq = parse_sysreq
- self.pkg_list = {}
- self._db_path = os.path.join(config.db, 'octave-forge')
-
- if not os.path.isdir(self._db_path):
- log.error('Invalid db: %s' % self._db_path)
- raise DescriptionTreeException('Invalid db: %s' % self._db_path)
-
- self.categories = {}
- for cat in [i.strip() for i in config.categories.split(',')]:
- catdir = os.path.join(self._db_path, cat)
- if os.path.isdir(catdir):
- self.pkg_list[cat] = []
- pkgs = os.listdir(catdir)
- for pkg in pkgs:
- pkgdir = os.path.join(catdir, pkg)
- for desc_file in os.listdir(pkgdir):
- pkg_p = desc_file[:-len('.DESCRIPTION')]
- mypkg = re_pkg_atom.match(pkg_p)
- if mypkg is None:
- log.error('Invalid Atom: %s' % pkg_p)
- raise DescriptionTreeException('Invalid Atom: %s' % pkg_p)
- self.categories[mypkg.group(1)] = cat
- self.pkg_list[cat].append({
- 'name': mypkg.group(1),
- 'version': mypkg.group(2),
- })
-
-
- def __getitem__(self, key):
-
- mykey = re_pkg_atom.match(key)
- if mykey == None:
- return None
-
- name = mykey.group(1)
- version = mykey.group(2)
-
- for cat in self.pkg_list:
- for pkg in self.pkg_list[cat]:
- if pkg['name'] == name and pkg['version'] == version:
- pkgfile = os.path.join(
- self._db_path,
- cat,
- pkg['name'],
- '%s-%s.DESCRIPTION' % (pkg['name'], pkg['version']),
- )
- return Description(pkgfile, parse_sysreq=self._parse_sysreq)
-
- return None
-
+ list.__init__(self)
+ self._categories = [i.strip() for i in config.categories.split(',')]
+ for my_file in glob.glob(os.path.join(config.db, 'octave-forge', \
+ '**', '**', '*.DESCRIPTION')):
+ description = Description(my_file, parse_sysreq=parse_sysreq)
+ if description.CAT in self._categories:
+ self.append(description)
- def package_versions(self, pkgname):
-
+ def package_versions(self, pn):
tmp = []
-
- for cat in self.pkg_list:
- for pkg in self.pkg_list[cat]:
- if pkg['name'] == pkgname:
- tmp.append(pkg['version'])
-
+ for pkg in self:
+ if pkg.PN == pn:
+ tmp.append(pkg.PV)
tmp.sort(key=cmp_to_key(vercmp))
return tmp
-
- def latest_version(self, pkgname):
-
- tmp = self.package_versions(pkgname)
+ def latest_version(self, pn):
+ tmp = self.package_versions(pn)
return (len(tmp) > 0) and tmp[-1] or None
-
- def version_compare(self, versions):
-
- tmp = list(versions[:])
+ def latest_version_from_list(self, pv_list):
+ tmp = pv_list[:]
tmp.sort(key=cmp_to_key(vercmp))
return (len(tmp) > 0) and tmp[-1] or None
-
-
- def packages(self):
-
- packages = []
-
- for cat in self.pkg_list:
- for pkg in self.pkg_list[cat]:
- packages.append(pkg['name'] + '-' + pkg['version'])
-
- packages.sort()
- return packages
-
def search(self, term):
-
# term can be a regular expression
re_term = re.compile(r'%s' % term)
packages = {}
-
- for cat in self.pkg_list:
- for pkg in self.pkg_list[cat]:
- if re_term.search(pkg['name']) is not None:
- if pkg['name'] not in packages:
- packages[pkg['name']] = [pkg['version'], '9999']
- else:
- packages[pkg['name']].insert(-1, pkg['version'])
- packages[pkg['name']].sort(key=cmp_to_key(vercmp))
-
+ for pkg in self:
+ if re_term.search(pkg.PN) is not None:
+ if pkg.PN not in packages:
+ packages[pkg.PN] = []
+ packages[pkg.PN].append(pkg.PV)
+ packages[pkg.PN].sort(key=cmp_to_key(vercmp))
return packages
def list(self):
-
packages = {}
-
- for cat in self.pkg_list:
- packages[cat] = {}
- for pkg in self.pkg_list[cat]:
- if pkg['name'] not in packages[cat]:
- packages[cat][pkg['name']] = [pkg['version'], '9999']
- else:
- packages[cat][pkg['name']].insert(-1, pkg['version'])
- packages[cat][pkg['name']].sort(key=cmp_to_key(vercmp))
-
+ for category in self._categories:
+ packages[category] = {}
+ for pkg in self:
+ if pkg.PN not in packages[pkg.CAT]:
+ packages[pkg.CAT][pkg.PN] = []
+ packages[pkg.CAT][pkg.PN].append(pkg.PV)
+ packages[pkg.CAT][pkg.PN].sort(key=cmp_to_key(vercmp))
return packages
+
+ def get(self, p):
+ for pkg in self:
+ if pkg.P == p:
+ return pkg
+ return None