summaryrefslogtreecommitdiffstats
path: root/pym
diff options
context:
space:
mode:
Diffstat (limited to 'pym')
-rw-r--r--pym/portage/dbapi/bintree.py20
-rw-r--r--pym/portage/getbinpkg.py23
2 files changed, 32 insertions, 11 deletions
diff --git a/pym/portage/dbapi/bintree.py b/pym/portage/dbapi/bintree.py
index ba0809f48..79a792e56 100644
--- a/pym/portage/dbapi/bintree.py
+++ b/pym/portage/dbapi/bintree.py
@@ -382,7 +382,9 @@ class binarytree(object):
if not self._pkgindex_version_supported(pkgindex):
pkgindex = self._new_pkgindex()
header = pkgindex.header
- metadata = pkgindex.packages
+ metadata = {}
+ for d in pkgindex.packages:
+ metadata[d["CPV"]] = d
update_pkgindex = False
for mydir in dirs:
for myfile in listdir(os.path.join(self.pkgdir, mydir)):
@@ -554,7 +556,8 @@ class binarytree(object):
stale = [cpv for cpv in metadata if cpv not in self._pkg_paths]
for cpv in stale:
del metadata[cpv]
- #
+ del pkgindex.packages[:]
+ pkgindex.packages.extend(metadata.itervalues())
self._update_pkgindex_header(pkgindex.header)
from portage.util import atomic_ofstream
f = atomic_ofstream(self._pkgindex_file)
@@ -625,7 +628,9 @@ class binarytree(object):
finally:
f.close()
if pkgindex:
- self._remotepkgs = pkgindex.packages
+ self._remotepkgs = {}
+ for d in pkgindex.packages:
+ self._remotepkgs[d["CPV"]] = d
self._remote_has_index = True
self._remote_base_uri = pkgindex.header.get("URI", base_url)
self.remotepkgs = {}
@@ -768,7 +773,14 @@ class binarytree(object):
self.dbapi.cpv_remove(cpv)
del self._pkg_paths[cpv]
return
- pkgindex.packages[cpv] = d
+ # If found, remove package(s) with duplicate path.
+ for i in xrange(len(pkgindex.packages) - 1, -1, -1):
+ d2 = pkgindex.packages[i]
+ if d2["CPV"] != cpv:
+ continue
+ if d2.get("PATH") == d.get("PATH"):
+ del pkgindex.packages[i]
+ pkgindex.packages.append(d)
self._update_pkgindex_header(pkgindex.header)
from portage.util import atomic_ofstream
f = atomic_ofstream(os.path.join(self.pkgdir, "Packages"))
diff --git a/pym/portage/getbinpkg.py b/pym/portage/getbinpkg.py
index d2d1f75ab..e3f97e7a2 100644
--- a/pym/portage/getbinpkg.py
+++ b/pym/portage/getbinpkg.py
@@ -675,13 +675,23 @@ def writepkgindex(pkgfile, items):
pkgfile.write("%s: %s\n" % (k, v))
pkgfile.write("\n")
+def _cmp_cpv(d1, d2):
+ cpv1 = d1["CPV"]
+ cpv2 = d2["CPV"]
+ if cpv1 > cpv2:
+ return 1
+ elif cpv1 == cpv2:
+ return 0
+ else:
+ return -1
+
class PackageIndex(object):
def __init__(self, default_pkg_data=None, inherited_keys=None):
self._default_pkg_data = default_pkg_data
self._inherited_keys = inherited_keys
self.header = {}
- self.packages = {}
+ self.packages = []
self.modified = True
def read(self, pkgfile):
@@ -707,19 +717,18 @@ class PackageIndex(object):
v = self.header.get(k)
if v is not None:
d.setdefault(k, v)
- self.packages[mycpv] = d
+ self.packages.append(d)
def write(self, pkgfile):
- cpv_all = self.packages.keys()
- cpv_all.sort()
if self.modified:
self.header["TIMESTAMP"] = str(long(time.time()))
- self.header["PACKAGES"] = str(len(cpv_all))
+ self.header["PACKAGES"] = str(len(self.packages))
keys = self.header.keys()
keys.sort()
writepkgindex(pkgfile, [(k, self.header[k]) for k in keys])
- for cpv in cpv_all:
- metadata = self.packages[cpv].copy()
+ for metadata in sorted(self.packages, _cmp_cpv):
+ metadata = metadata.copy()
+ cpv = metadata["CPV"]
if self._inherited_keys:
for k in self._inherited_keys:
v = self.header.get(k)