_pkg_str: add version attribute for comparisons
authorZac Medico <zmedico@gentoo.org>
Sun, 13 May 2012 08:36:25 +0000 (01:36 -0700)
committerZac Medico <zmedico@gentoo.org>
Sun, 13 May 2012 08:36:25 +0000 (01:36 -0700)
This attribute can be passed directly into vercmp, avoiding the need to
generate this string many times.

pym/_emerge/Package.py
pym/portage/dbapi/__init__.py
pym/portage/dbapi/virtual.py
pym/portage/dep/__init__.py
pym/portage/versions.py

index 69739acc40ed5a3951707357c7b35a93e5e13752..84a2cbced419bc14287f6b9d6d8a6e7a390c68d8 100644 (file)
@@ -28,7 +28,7 @@ class Package(Task):
                "root_config", "type_name",
                "category", "counter", "cp", "cpv_split",
                "inherited", "invalid", "iuse", "masks", "mtime",
-               "pf", "pv_split", "root", "slot", "slot_atom", "visible",) + \
+               "pf", "root", "slot", "slot_atom", "version", "visible",) + \
        ("_raw_metadata", "_use",)
 
        metadata_keys = [
@@ -71,8 +71,8 @@ class Package(Task):
                                        "IUSE contains defaults, but EAPI doesn't allow them")
                self.slot_atom = portage.dep.Atom("%s%s%s" % (self.cp, _slot_separator, slot))
                self.category, self.pf = portage.catsplit(self.cpv)
-               self.cpv_split = portage.catpkgsplit(self.cpv)
-               self.pv_split = self.cpv_split[1:]
+               self.cpv_split = self.cpv.cpv_split
+               self.version = self.cpv.version
                if self.inherited is None:
                        self.inherited = frozenset()
 
@@ -532,28 +532,28 @@ class Package(Task):
        def __lt__(self, other):
                if other.cp != self.cp:
                        return False
-               if portage.pkgcmp(self.pv_split, other.pv_split) < 0:
+               if portage.vercmp(self.version, other.version) < 0:
                        return True
                return False
 
        def __le__(self, other):
                if other.cp != self.cp:
                        return False
-               if portage.pkgcmp(self.pv_split, other.pv_split) <= 0:
+               if portage.vercmp(self.version, other.version) <= 0:
                        return True
                return False
 
        def __gt__(self, other):
                if other.cp != self.cp:
                        return False
-               if portage.pkgcmp(self.pv_split, other.pv_split) > 0:
+               if portage.vercmp(self.version, other.version) > 0:
                        return True
                return False
 
        def __ge__(self, other):
                if other.cp != self.cp:
                        return False
-               if portage.pkgcmp(self.pv_split, other.pv_split) >= 0:
+               if portage.vercmp(self.version, other.version) >= 0:
                        return True
                return False
 
index a835d4de88289b3e83b18ea708ffaf3687807b73..7a4c823ab726995de7342bec18f3cbd9eac56ecd 100644 (file)
@@ -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
index 84b6b9367340217699d56fb51934ab40b4e8f9b2..da15983eec21d447601c18c444cce6988ba6840e 100644 (file)
@@ -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:
index d4888e08622ffa0c38d5755e6b24938f742e547d..240e2237f39edcc9f80e57272ecb9039c6835ec9 100644 (file)
@@ -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
index 33c7159a52498cb0fe65432832ec53fd57210c15..35385e4d2a5d639499419a6b10fd0ff8b57dbbc8 100644 (file)
@@ -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: