Index: pym/portage/dbapi/bintree.py |
diff --git a/pym/portage/dbapi/bintree.py b/pym/portage/dbapi/bintree.py |
index f67480378d2785c9b84f6ea757cb7dbd129688dc..d1d83998575d06d034009480fe73d46baecab612 100644 |
--- a/pym/portage/dbapi/bintree.py |
+++ b/pym/portage/dbapi/bintree.py |
@@ -224,7 +224,6 @@ class binarytree(object): |
self.populated = 0 |
self.tree = {} |
self._remote_has_index = False |
- self._remote_base_uri = None |
self._remotepkgs = None # remote metadata indexed by cpv |
self.__remotepkgs = {} # indexed by tbz2 name (deprecated) |
self.invalids = [] |
@@ -242,7 +241,7 @@ class binarytree(object): |
["BUILD_TIME", "CHOST", "DEPEND", "DESCRIPTION", "EAPI", |
"IUSE", "KEYWORDS", "LICENSE", "PDEPEND", "PROPERTIES", |
"PROVIDE", "RDEPEND", "repository", "SLOT", "USE", "DEFINED_PHASES", |
- "REQUIRED_USE"] |
+ "REQUIRED_USE", "BASE_URI"] |
self._pkgindex_aux_keys = list(self._pkgindex_aux_keys) |
self._pkgindex_use_evaluated_keys = \ |
("LICENSE", "RDEPEND", "DEPEND", |
@@ -728,8 +727,12 @@ class binarytree(object): |
writemsg(_("!!! PORTAGE_BINHOST unset, but use is requested.\n"), |
noiselevel=-1) |
- if getbinpkgs and 'PORTAGE_BINHOST' in self.settings: |
- base_url = self.settings["PORTAGE_BINHOST"] |
+ if not getbinpkgs or 'PORTAGE_BINHOST' not in self.settings: |
+ self.populated=1 |
+ return |
+ self._remotepkgs = {} |
+ self.__remotepkgs = {} |
+ for base_url in self.settings["PORTAGE_BINHOST"].split(): |
parsed_url = urlparse(base_url) |
host = parsed_url.netloc |
port = parsed_url.port |
@@ -857,13 +860,12 @@ class binarytree(object): |
# file, but that's alright. |
if pkgindex: |
# Organize remote package list as a cpv -> metadata map. |
- self._remotepkgs = _pkgindex_cpv_map_latest_build(pkgindex) |
+ remotepkgs = _pkgindex_cpv_map_latest_build(pkgindex) |
+ self._remotepkgs.update(remotepkgs) |
self._remote_has_index = True |
- self._remote_base_uri = pkgindex.header.get("URI", base_url) |
- self.__remotepkgs = {} |
- for cpv in self._remotepkgs: |
+ remote_base_uri = pkgindex.header.get("URI", base_url) |
+ for cpv in remotepkgs: |
self.dbapi.cpv_inject(cpv) |
- self.populated = 1 |
if True: |
# Remote package instances override local package |
# if they are not identical. |
@@ -872,6 +874,7 @@ class binarytree(object): |
remote_metadata = self._remotepkgs.get(cpv) |
if remote_metadata is None: |
continue |
+ remote_metadata["BASE_URI"] = remote_base_uri |
# Use digests to compare identity. |
identical = True |
for hash_name in hash_names: |
@@ -893,8 +896,7 @@ class binarytree(object): |
# Local package instances override remote instances. |
for cpv in metadata: |
self._remotepkgs.pop(cpv, None) |
- return |
- self._remotepkgs = {} |
+ continue |
try: |
chunk_size = long(self.settings["PORTAGE_BINHOST_CHUNKSIZE"]) |
if chunk_size < 8: |
@@ -905,11 +907,12 @@ class binarytree(object): |
writemsg_stdout( |
colorize("GOOD", _("Fetching bininfo from ")) + \ |
re.sub(r'//(.+):.+@(.+)/', r'//\1:*password*@\2/', base_url) + "\n") |
- self.__remotepkgs = portage.getbinpkg.dir_get_metadata( |
- self.settings["PORTAGE_BINHOST"], chunk_size=chunk_size) |
+ remotepkgs = portage.getbinpkg.dir_get_metadata( |
+ base_url, chunk_size=chunk_size) |
+ self.__remotepkgs.update(remotepkgs) |
#writemsg(green(" -- DONE!\n\n")) |
- for mypkg in list(self.__remotepkgs): |
+ for mypkg in list(remotepkgs): |
if "CATEGORY" not in self.__remotepkgs[mypkg]: |
#old-style or corrupt package |
writemsg(_("!!! Invalid remote binary package: %s\n") % mypkg, |
@@ -1233,7 +1236,8 @@ class binarytree(object): |
rel_url = self._remotepkgs[pkgname].get("PATH") |
if not rel_url: |
rel_url = pkgname+".tbz2" |
- url = self._remote_base_uri.rstrip("/") + "/" + rel_url.lstrip("/") |
+ remote_base_uri = self._remotepkgs[pkgname]["BASE_URI"] |
+ url = remote_base_uri.rstrip("/") + "/" + rel_url.lstrip("/") |
else: |
url = self.settings["PORTAGE_BINHOST"].rstrip("/") + "/" + tbz2name |
protocol = urlparse(url)[0] |