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

Reply via email to