aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichał Górny <mgorny@gentoo.org>2021-05-13 00:37:00 +0200
committerZac Medico <zmedico@gentoo.org>2021-05-23 22:05:32 -0700
commit2fab50edb1db47a0b12ebb7452b16ffbcde645e5 (patch)
tree3ef0fed867cd7a00d8011a3c3dc8c03af4125d68
parentRefactor fetch() for selective restrictions (diff)
downloadportage-2fab50edb1db47a0b12ebb7452b16ffbcde645e5.tar.gz
portage-2fab50edb1db47a0b12ebb7452b16ffbcde645e5.tar.bz2
portage-2fab50edb1db47a0b12ebb7452b16ffbcde645e5.zip
Support selective fetch/mirror restriction for EAPI 8
Bug: https://bugs.gentoo.org/371413 Signed-off-by: Michał Górny <mgorny@gentoo.org> Signed-off-by: Zac Medico <zmedico@gentoo.org>
-rw-r--r--lib/portage/dep/__init__.py8
-rw-r--r--lib/portage/eapi.py8
-rw-r--r--lib/portage/package/ebuild/fetch.py14
3 files changed, 26 insertions, 4 deletions
diff --git a/lib/portage/dep/__init__.py b/lib/portage/dep/__init__.py
index e32f01fc0..5dd7cb682 100644
--- a/lib/portage/dep/__init__.py
+++ b/lib/portage/dep/__init__.py
@@ -686,7 +686,13 @@ def _use_reduce_cached(depstr, uselist, masklist, matchall, excludeall, \
need_bracket = True
else:
need_simple_token = False
- if token_class and not is_src_uri:
+ if is_src_uri:
+ if (not eapi_attrs.selective_src_uri_restriction and
+ token.startswith(("fetch+", "mirror+"))):
+ raise InvalidDependString(
+ _("Selective fetch/mirror restriction not allowed "
+ "in EAPI %s: token %s") % (eapi, pos+1))
+ elif token_class:
#Add a hack for SRC_URI here, to avoid conditional code at the consumer level
try:
token = token_class(token, eapi=eapi,
diff --git a/lib/portage/eapi.py b/lib/portage/eapi.py
index 796184644..6a655aca2 100644
--- a/lib/portage/eapi.py
+++ b/lib/portage/eapi.py
@@ -22,6 +22,10 @@ def eapi_has_slot_operator(eapi):
def eapi_has_src_uri_arrows(eapi):
return eapi not in ("0", "1")
+def eapi_has_selective_src_uri_restriction(eapi):
+ return eapi not in ("0", "1", "2", "3", "4", "4-python", "4-slot-abi",
+ "5", "5-progress", "6", "7")
+
def eapi_has_use_deps(eapi):
return eapi not in ("0", "1")
@@ -143,7 +147,8 @@ _eapi_attrs = collections.namedtuple('_eapi_attrs',
'iuse_defaults iuse_effective posixish_locale '
'path_variables_end_with_trailing_slash '
'prefix '
- 'repo_deps required_use required_use_at_most_one_of slot_operator slot_deps '
+ 'repo_deps required_use required_use_at_most_one_of '
+ 'selective_src_uri_restriction slot_operator slot_deps '
'src_uri_arrows strong_blocks use_deps use_dep_defaults '
'empty_groups_always_true sysroot')
@@ -228,6 +233,7 @@ def _get_eapi_attrs(eapi):
repo_deps = (eapi is None or eapi_has_repo_deps.func(eapi)),
required_use = (eapi is None or eapi_has_required_use.func(eapi)),
required_use_at_most_one_of = (eapi is None or eapi_has_required_use_at_most_one_of.func(eapi)),
+ selective_src_uri_restriction = (eapi is None or eapi_has_selective_src_uri_restriction.func(eapi)),
slot_deps = (eapi is None or eapi_has_slot_deps.func(eapi)),
slot_operator = (eapi is None or eapi_has_slot_operator.func(eapi)),
src_uri_arrows = (eapi is None or eapi_has_src_uri_arrows.func(eapi)),
diff --git a/lib/portage/package/ebuild/fetch.py b/lib/portage/package/ebuild/fetch.py
index 2f3111b65..f687a01a2 100644
--- a/lib/portage/package/ebuild/fetch.py
+++ b/lib/portage/package/ebuild/fetch.py
@@ -898,6 +898,11 @@ def fetch(myuris, mysettings, listonly=0, fetchonly=0,
primaryuri_dict = {}
thirdpartymirror_uris = {}
for myfile, myuri in file_uri_tuples:
+ override_mirror = myuri.startswith("mirror+")
+ override_fetch = override_mirror or myuri.startswith("fetch+")
+ if override_fetch:
+ myuri = myuri.partition("+")[2]
+
if myfile not in filedict:
filedict[myfile]=[]
if distdir_writable:
@@ -906,12 +911,17 @@ def fetch(myuris, mysettings, listonly=0, fetchonly=0,
else:
mirror_cache = None
+ # fetch restriction implies mirror restriction
+ # but fetch unrestriction does not grant mirror permission
+ file_restrict_mirror = ((restrict_fetch or restrict_mirror)
+ and not override_mirror)
+
# 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:
+ if not file_restrict_mirror:
location_lists.append(public_mirrors)
for l in itertools.chain(*location_lists):
@@ -946,7 +956,7 @@ def fetch(myuris, mysettings, listonly=0, fetchonly=0,
writemsg(_("Invalid mirror definition in SRC_URI:\n"), noiselevel=-1)
writemsg(" %s\n" % (myuri), noiselevel=-1)
else:
- if restrict_fetch or force_mirror:
+ if (restrict_fetch and not override_fetch) or force_mirror:
# Only fetch from specific mirrors is allowed.
continue
primaryuris = primaryuri_dict.get(myfile)