aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichał Górny <mgorny@gentoo.org>2021-05-12 23:37:56 +0200
committerZac Medico <zmedico@gentoo.org>2021-05-23 21:56:02 -0700
commitaf0d91e9a251cb6ecf2568c51b21e6072e8c5241 (patch)
tree195f8d73ae0284084a1ac658927e3bdc1da92712
parentMake doconf, doenvd, doheader & doinitd ignore ins/exeopts in EAPI 8 (diff)
downloadportage-af0d91e9a251cb6ecf2568c51b21e6072e8c5241.tar.gz
portage-af0d91e9a251cb6ecf2568c51b21e6072e8c5241.tar.bz2
portage-af0d91e9a251cb6ecf2568c51b21e6072e8c5241.zip
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@gentoo.org> Signed-off-by: Zac Medico <zmedico@gentoo.org>
-rw-r--r--lib/portage/package/ebuild/fetch.py54
1 files 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: