diff options
Diffstat (limited to 'pym/portage')
-rw-r--r-- | pym/portage/dbapi/__init__.py | 14 | ||||
-rw-r--r-- | pym/portage/dbapi/virtual.py | 10 | ||||
-rw-r--r-- | pym/portage/dep/__init__.py | 18 | ||||
-rw-r--r-- | pym/portage/versions.py | 1 |
4 files changed, 27 insertions, 16 deletions
diff --git a/pym/portage/dbapi/__init__.py b/pym/portage/dbapi/__init__.py index a835d4de8..7a4c823ab 100644 --- a/pym/portage/dbapi/__init__.py +++ b/pym/portage/dbapi/__init__.py @@ -46,7 +46,12 @@ class dbapi(object): def cp_list(self, cp, use_cache=1): raise NotImplementedError(self) - def _cpv_sort_ascending(self, cpv_list): + @staticmethod + def _cmp_cpv(cpv1, cpv2): + return vercmp(cpv1.version, cpv2.version) + + @staticmethod + def _cpv_sort_ascending(cpv_list): """ Use this to sort self.cp_list() results in ascending order. It sorts in place and returns None. @@ -55,12 +60,7 @@ class dbapi(object): # If the cpv includes explicit -r0, it has to be preserved # for consistency in findname and aux_get calls, so use a # dict to map strings back to their original values. - ver_map = {} - for cpv in cpv_list: - ver_map[cpv] = '-'.join(catpkgsplit(cpv)[2:]) - def cmp_cpv(cpv1, cpv2): - return vercmp(ver_map[cpv1], ver_map[cpv2]) - cpv_list.sort(key=cmp_sort_key(cmp_cpv)) + cpv_list.sort(key=cmp_sort_key(dbapi._cmp_cpv)) def cpv_all(self): """Return all CPVs in the db diff --git a/pym/portage/dbapi/virtual.py b/pym/portage/dbapi/virtual.py index 84b6b9367..da15983ee 100644 --- a/pym/portage/dbapi/virtual.py +++ b/pym/portage/dbapi/virtual.py @@ -4,7 +4,7 @@ from portage.dbapi import dbapi from portage.dbapi.dep_expand import dep_expand -from portage import cpv_getkey +from portage.versions import cpv_getkey, _pkg_str class fakedbapi(dbapi): """A fake dbapi that allows consumers to inject/remove packages to/from it @@ -74,7 +74,13 @@ class fakedbapi(dbapi): @param metadata: dict """ self._clear_cache() - mycp = cpv_getkey(mycpv) + if not hasattr(mycpv, 'cp'): + if metadata is None: + mycpv = _pkg_str(mycpv) + else: + mycpv = _pkg_str(mycpv, slot=metadata.get('SLOT'), + repo=metadata.get('repository')) + mycp = mycpv.cp self.cpvdict[mycpv] = metadata myslot = None if self._exclusive_slots and metadata: diff --git a/pym/portage/dep/__init__.py b/pym/portage/dep/__init__.py index d4888e086..240e2237f 100644 --- a/pym/portage/dep/__init__.py +++ b/pym/portage/dep/__init__.py @@ -1141,9 +1141,11 @@ class Atom(_atom_base): self.__dict__['cp'] = cp try: self.__dict__['cpv'] = _pkg_str(cpv) + self.__dict__['version'] = self.cpv.version except InvalidData: # plain cp, wildcard, or something self.__dict__['cpv'] = cpv + self.__dict__['version'] = None self.__dict__['repo'] = repo self.__dict__['slot'] = slot self.__dict__['operator'] = op @@ -2003,15 +2005,17 @@ def match_from_list(mydep, candidate_list): mylist.append(x) elif operator in [">", ">=", "<", "<="]: - mysplit = ["%s/%s" % (cat, pkg), ver, rev] for x in candidate_list: - xs = getattr(x, "cpv_split", None) - if xs is None: - xs = catpkgsplit(remove_slot(x)) - xcat, xpkg, xver, xrev = xs - xs = ["%s/%s" % (xcat, xpkg), xver, xrev] + if not hasattr(x, 'cp'): + try: + x = _pkg_str(remove_slot(x)) + except InvalidData: + continue + + if x.cp != mydep.cp: + continue try: - result = pkgcmp(xs, mysplit) + result = vercmp(x.version, mydep.version) except ValueError: # pkgcmp may return ValueError during int() conversion writemsg(_("\nInvalid package name: %s\n") % x, noiselevel=-1) raise diff --git a/pym/portage/versions.py b/pym/portage/versions.py index 33c7159a5..35385e4d2 100644 --- a/pym/portage/versions.py +++ b/pym/portage/versions.py @@ -351,6 +351,7 @@ class _pkg_str(_unicode): if self.cpv_split is None: raise InvalidData(cpv) self.__dict__['cp'] = self.cpv_split[0] + '/' + self.cpv_split[1] + self.__dict__['version'] = "-".join(self.cpv_split[2:]) # for match_from_list introspection self.__dict__['cpv'] = self if slot is not None: |