summaryrefslogtreecommitdiffstats
path: root/pym/portage/dbapi/bintree.py
diff options
context:
space:
mode:
Diffstat (limited to 'pym/portage/dbapi/bintree.py')
-rw-r--r--pym/portage/dbapi/bintree.py20
1 files changed, 16 insertions, 4 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"))