commit: 5a51817e29ee8a9879876be1576eaa38b357ffa3
Author: Brian Harring <ferringb <AT> gmail <DOT> com>
AuthorDate: Mon Dec 26 01:31:02 2022 +0000
Commit: Arthur Zamarin <arthurzam <AT> gentoo <DOT> org>
CommitDate: Mon Dec 26 17:27:24 2022 +0000
URL:
https://gitweb.gentoo.org/proj/pkgcore/pkgcore.git/commit/?id=5a51817e
Add use flag validation for /etc/portage/package.use/* content.
Had this been in place, it would've detected pkgcore/pkgcore#384 long ago.
Signed-off-by: Brian Harring <ferringb <AT> gmail.com>
Signed-off-by: Arthur Zamarin <arthurzam <AT> gentoo.org>
src/pkgcore/ebuild/domain.py | 8 ++++++++
tests/ebuild/test_domain.py | 19 +++++++++++--------
2 files changed, 19 insertions(+), 8 deletions(-)
diff --git a/src/pkgcore/ebuild/domain.py b/src/pkgcore/ebuild/domain.py
index 6f86f7d14..9fef5f843 100644
--- a/src/pkgcore/ebuild/domain.py
+++ b/src/pkgcore/ebuild/domain.py
@@ -44,6 +44,7 @@ from ..util.parserestrict import ParseError, parse_match
from . import const
from . import repository as ebuild_repo
from .atom import atom as _atom
+from .eapi import get_latest_PMS_eapi
from .misc import (
ChunkedDataDict,
chunked_data,
@@ -86,7 +87,10 @@ def package_use_splitter(iterable):
USE_EXPAND target and should be expanded into their normalized/long form.
"""
+ eapi_obj = get_latest_PMS_eapi()
+
def f(tokens: list[str]):
+
i = iter(tokens)
for idx, x in enumerate(i):
if x.endswith(":"):
@@ -99,8 +103,12 @@ def package_use_splitter(iterable):
flag = f"-{x}_{flag[1:]}"
else:
flag = f"{x}_{flag}"
+ if not eapi_obj.is_valid_use_flag(flag.lstrip("-")):
+ raise ParseError(f"token {flag} is not a valid use
flag")
l.append(flag)
return l
+ elif not eapi_obj.is_valid_use_flag(x.lstrip("-")):
+ raise ParseError(f"token {flag} is not a valid use flag")
# if we made it here, there's no USE_EXPAND; thus just return the
original sequence
return tokens
diff --git a/tests/ebuild/test_domain.py b/tests/ebuild/test_domain.py
index 87c3d489f..90594b9d6 100644
--- a/tests/ebuild/test_domain.py
+++ b/tests/ebuild/test_domain.py
@@ -20,6 +20,8 @@ class TestDomain:
self.profile_base = tmp_path_factory.mktemp("profiles")
self.profile1 = self.profile_base / "profile1"
self.pmixin.mk_profile(self.profile_base, str(self.profile1))
+ self.pusedir = self.confdir / "package.use"
+ self.pusedir.mkdir()
def mk_domain(self):
return domain_mod.domain(
@@ -32,14 +34,11 @@ class TestDomain:
def test_sorting(self):
"""assert that configuration files are read in alphanum ordering"""
- cdir = self.confdir / "package.use"
- cdir.mkdir()
-
# assert the base state; no files, no content.
assert () == self.mk_domain().pkg_use
- open(cdir / "00", "w").write("*/* X")
- open(cdir / "01", "w").write("*/* -X Y")
+ open(self.pusedir / "00", "w").write("*/* X")
+ open(self.pusedir / "01", "w").write("*/* -X Y")
# Force the returned ordering to be reversed; this is to assert that
# the domain forces a sort.
@@ -57,9 +56,7 @@ class TestDomain:
) == self.mk_domain().pkg_use
def test_use_expand_syntax(self):
- puse = self.confdir / "package.use"
- puse.mkdir()
- open(puse / "a", "w").write(
+ open(self.pusedir / "a", "w").write(
textwrap.dedent(
"""
*/* x_y1
@@ -82,3 +79,9 @@ class TestDomain:
),
),
) == self.mk_domain().pkg_use
+
+ def test_use_flag_parsing_enforcement(self):
+ open(self.pusedir / "a", "w").write("*/* X:")
+ # TODO: need to catch the warning here, but I'm not sure how.
+ # Meanwhile, ensure that the failed token is ignored.
+ assert ((packages.AlwaysTrue, ((), ())),) == self.mk_domain().pkg_use