From patchwork Wed Jun 20 14:12:58 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [bitbake-devel, 07/14] fetch2: Improve mirror looping to consider more cases Date: Wed, 20 Jun 2012 14:12:58 -0000 From: Richard Purdie X-Patchwork-Id: 30307 Message-Id: <7c711081043606dd14bca0f76a52675cb4c8fe09.1340200208.git.richard.purdie@linuxfoundation.org> To: bitbake-devel@lists.openembedded.org Currently we only consider one pass through the mirror list. This doesn't catch cases where for example you might want to setup a mirror of a mirror and allow multiple redirection. There is no reason we can't support this and the patch loops through the list recursively now. As a safeguard, it will stop if any duplicate urls are found, hence avoiding circular dependency looping. Signed-off-by: Richard Purdie --- bitbake/lib/bb/fetch2/__init__.py | 41 ++++++++++++++++++++++++++---------- 1 files changed, 29 insertions(+), 12 deletions(-) diff --git a/bitbake/lib/bb/fetch2/__init__.py b/bitbake/lib/bb/fetch2/__init__.py index a2e0beb..5838436 100644 --- a/bitbake/lib/bb/fetch2/__init__.py +++ b/bitbake/lib/bb/fetch2/__init__.py @@ -464,6 +464,30 @@ def check_network_access(d, info = "", url = None): else: logger.debug(1, "Fetcher accessed the network with the command %s" % info) +def build_mirroruris(origud, mirrors, ld): + uris = [] + uds = [] + + def adduri(uri, ud, uris, uds): + for line in mirrors: + try: + (find, replace) = line + except ValueError: + continue + newuri = uri_replace(ud, find, replace, ld) + if not newuri or newuri in uris or uri == origud.url: + continue + uris.append(newuri) + ud = FetchData(newuri, ld) + ud.setup_localpath(ld) + uds.append(ud) + + adduri(newuri, ud, uris, uds) + + adduri(None, origud, uris, uds) + + return uris, uds + def try_mirror_url(newuri, origud, ud, ld, check = False): # Return of None or a value means we're finished # False means try another url @@ -529,18 +553,11 @@ def try_mirrors(d, origud, mirrors, check = False): mirrors is the list of mirrors we're going to try """ ld = d.createCopy() - for line in mirrors: - try: - (find, replace) = line - except ValueError: - continue - newuri = uri_replace(origud, find, replace, ld) - if not newuri: - continue - ud = FetchData(newuri, ld) - ud.setup_localpath(ld) - - ret = try_mirror_url(newuri, origud, ud, ld, check) + + uris, uds = build_mirroruris(origud, mirrors, ld) + + for index, uri in enumerate(uris): + ret = try_mirror_url(uri, origud, uds[index], ld, check) if ret != False: return ret return None