Split out a _pkgindex_cpv_map_latest_build() function.
authorZac Medico <zmedico@gentoo.org>
Fri, 4 Jun 2010 21:40:11 +0000 (14:40 -0700)
committerZac Medico <zmedico@gentoo.org>
Fri, 4 Jun 2010 21:40:11 +0000 (14:40 -0700)
pym/portage/dbapi/bintree.py

index 680a6395a81defde12f42107012746ce249c02f9..080f9e5ff7f60e2c6a395a63d0c76a22c217e0fd 100644 (file)
@@ -159,6 +159,41 @@ class bindbapi(fakedbapi):
                        self.bintree.populate()
                return fakedbapi.cpv_all(self)
 
+def _pkgindex_cpv_map_latest_build(pkgindex):
+       """
+       Given a PackageIndex instance, create a dict of cpv -> metadata map.
+       If multiple packages have identical CPV values, prefer the package
+       with latest BUILD_TIME value.
+       @param pkgindex: A PackageIndex instance.
+       @type pkgindex: PackageIndex
+       @rtype: dict
+       @returns: a dict containing entry for the give cpv.
+       """
+       cpv_map = {}
+
+       for d in pkgindex.packages:
+               cpv = d["CPV"]
+
+               btime = d.get('BUILD_TIME', '')
+               try:
+                       btime = int(btime)
+               except ValueError:
+                       btime = None
+
+               other_d = cpv_map.get(cpv)
+               if other_d is not None:
+                       other_btime = other_d.get('BUILD_TIME', '')
+                       try:
+                               other_btime = int(other_btime)
+                       except ValueError:
+                               other_btime = None
+                       if other_btime and (not btime or other_btime > btime):
+                               continue
+
+               cpv_map[cpv] = d
+
+       return cpv_map
+
 class binarytree(object):
        "this tree scans for a list of all packages available in PKGDIR"
        def __init__(self, root, pkgdir, virtual=None, settings=None):
@@ -777,33 +812,8 @@ class binarytree(object):
                                        # The current user doesn't have permission to cache the
                                        # file, but that's alright.
                        if pkgindex:
-                               self._remotepkgs = {}
-
                                # Organize remote package list as a cpv -> metadata map.
-                               # If multiple packages have identical CPV values, prefer
-                               # the package with latest BUILD_TIME value.
-                               remotepkgs = self._remotepkgs
-                               for d in pkgindex.packages:
-                                       cpv = d["CPV"]
-
-                                       btime = d.get('BUILD_TIME', '')
-                                       try:
-                                               btime = int(btime)
-                                       except ValueError:
-                                               btime = None
-
-                                       other_d = remotepkgs.get(cpv)
-                                       if other_d is not None:
-                                               other_btime = other_d.get('BUILD_TIME', '')
-                                               try:
-                                                       other_btime = int(other_btime)
-                                               except ValueError:
-                                                       other_btime = None
-                                               if other_btime and (not btime or other_btime > btime):
-                                                       continue
-
-                                       remotepkgs[cpv] = d
-
+                               self._remotepkgs = _pkgindex_cpv_map_latest_build(pkgindex)
                                self._remote_has_index = True
                                self._remote_base_uri = pkgindex.header.get("URI", base_url)
                                self.__remotepkgs = {}