commit: af0d91e9a251cb6ecf2568c51b21e6072e8c5241 Author: Michał Górny <mgorny <AT> gentoo <DOT> org> AuthorDate: Wed May 12 21:37:56 2021 +0000 Commit: Zac Medico <zmedico <AT> gentoo <DOT> org> CommitDate: Mon May 24 04:56:02 2021 +0000 URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=af0d91e9
Refactor fetch() for selective restrictions Refactor the fetch() function so that fetch/mirror restrictions only affect the code per-URI rather than globally. This will make it easier to apply restrictions selectively in EAPI 8. Signed-off-by: Michał Górny <mgorny <AT> gentoo.org> Signed-off-by: Zac Medico <zmedico <AT> gentoo.org> lib/portage/package/ebuild/fetch.py | 54 ++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 28 deletions(-) diff --git a/lib/portage/package/ebuild/fetch.py b/lib/portage/package/ebuild/fetch.py index 73abec595..2f3111b65 100644 --- a/lib/portage/package/ebuild/fetch.py +++ b/lib/portage/package/ebuild/fetch.py @@ -813,8 +813,6 @@ def fetch(myuris, mysettings, listonly=0, fetchonly=0, custommirrors = grabdict(os.path.join(mysettings["PORTAGE_CONFIGROOT"], CUSTOM_MIRRORS_FILE), recursive=1) - mymirrors=[] - if listonly or ("distlocks" not in features): use_locks = 0 @@ -832,16 +830,22 @@ def fetch(myuris, mysettings, listonly=0, fetchonly=0, "FEATURES in /etc/portage/make.conf\n"), noiselevel=-1) # use_locks = 0 - # local mirrors are always added - if try_mirrors and "local" in custommirrors: - mymirrors += custommirrors["local"] - - if restrict_mirror: - # We don't add any mirrors. - pass - else: - if try_mirrors: - mymirrors += [x.rstrip("/") for x in mysettings["GENTOO_MIRRORS"].split() if x] + local_mirrors = [] + public_mirrors = [] + fsmirrors = [] + if try_mirrors: + for x in custommirrors.get("local", []): + if x.startswith("/"): + fsmirrors.append(x) + else: + local_mirrors.append(x) + for x in mysettings["GENTOO_MIRRORS"].split(): + if not x: + continue + if x.startswith('/'): + fsmirrors.append(x.rstrip("/")) + else: + public_mirrors.append(x.rstrip("/")) hash_filter = _hash_filter(mysettings.get("PORTAGE_CHECKSUM_FILTER", "")) if hash_filter.transparent: @@ -864,23 +868,8 @@ def fetch(myuris, mysettings, listonly=0, fetchonly=0, shlex_split(mysettings.get("PORTAGE_RO_DISTDIRS", "")) \ if os.path.isdir(x)] - fsmirrors = [] - for x in range(len(mymirrors)-1,-1,-1): - if mymirrors[x] and mymirrors[x][0]=='/': - fsmirrors += [mymirrors[x]] - del mymirrors[x] - restrict_fetch = "fetch" in restrict force_mirror = "force-mirror" in features and not restrict_mirror - custom_local_mirrors = custommirrors.get("local", []) - if restrict_fetch: - # With fetch restriction, a normal uri may only be fetched from - # custom local mirrors (if available). A mirror:// uri may also - # be fetched from specific mirrors (effectively overriding fetch - # restriction, but only for specific mirrors). - locations = custom_local_mirrors - else: - locations = mymirrors file_uri_tuples = [] # Check for 'items' attribute since OrderedDict is not a dict. @@ -916,7 +905,16 @@ def fetch(myuris, mysettings, listonly=0, fetchonly=0, ".mirror-cache.json") else: mirror_cache = None - for l in locations: + + # With fetch restriction, a normal uri may only be fetched from + # custom local mirrors (if available). A mirror:// uri may also + # be fetched from specific mirrors (effectively overriding fetch + # restriction, but only for specific mirrors). + location_lists = [local_mirrors] + if not restrict_fetch and not restrict_mirror: + location_lists.append(public_mirrors) + + for l in itertools.chain(*location_lists): filedict[myfile].append(functools.partial( get_mirror_url, l, myfile, mysettings, mirror_cache)) if myuri is None: