From 5c7a70d4f8a67bac7cff32220a3015e0954dd764 Mon Sep 17 00:00:00 2001 From: Florian Albrechtskirchinger Date: Fri, 16 Jan 2026 11:08:01 +0100 Subject: [PATCH] ProhibitedStableKeywordsCheck: detect prohibited stable keywords Add an optional check to scan for packages using stable keywords prohibited by the repository. This is useful for overlays like GURU, which require that all packages use unstable keywords. Signed-off-by: Florian Albrechtskirchinger --- src/pkgcheck/checks/prohibited_stable.py | 41 +++++++++++++++++++ .../ProhibitedStableKeywords/expected.json | 2 + .../ProhibitedStableKeywords/fix.patch | 20 +++++++++ .../ProhibitedStableKeywords-0.ebuild | 12 ++++++ .../ProhibitedStableKeywords-1.ebuild | 12 ++++++ .../ProhibitedStableKeywords-2.ebuild | 12 ++++++ .../ProhibitedStableKeywords-9999.ebuild | 11 +++++ .../prohibited_stable/metadata/layout.conf | 2 + .../prohibited_stable/profiles/arch.list | 2 + .../prohibited_stable/profiles/categories | 1 + .../profiles/default/amd64/make.defaults | 1 + .../profiles/default/x86/make.defaults | 1 + .../prohibited_stable/profiles/profiles.desc | 2 + .../prohibited_stable/profiles/repo_name | 1 + 14 files changed, 120 insertions(+) create mode 100644 src/pkgcheck/checks/prohibited_stable.py create mode 100644 testdata/data/repos/prohibited_stable/ProhibitedStableKeywordsCheck/ProhibitedStableKeywords/expected.json create mode 100644 testdata/data/repos/prohibited_stable/ProhibitedStableKeywordsCheck/ProhibitedStableKeywords/fix.patch create mode 100644 testdata/repos/prohibited_stable/ProhibitedStableKeywordsCheck/ProhibitedStableKeywords/ProhibitedStableKeywords-0.ebuild create mode 100644 testdata/repos/prohibited_stable/ProhibitedStableKeywordsCheck/ProhibitedStableKeywords/ProhibitedStableKeywords-1.ebuild create mode 100644 testdata/repos/prohibited_stable/ProhibitedStableKeywordsCheck/ProhibitedStableKeywords/ProhibitedStableKeywords-2.ebuild create mode 100644 testdata/repos/prohibited_stable/ProhibitedStableKeywordsCheck/ProhibitedStableKeywords/ProhibitedStableKeywords-9999.ebuild create mode 100644 testdata/repos/prohibited_stable/metadata/layout.conf create mode 100644 testdata/repos/prohibited_stable/profiles/arch.list create mode 100644 testdata/repos/prohibited_stable/profiles/categories create mode 100644 testdata/repos/prohibited_stable/profiles/default/amd64/make.defaults create mode 100644 testdata/repos/prohibited_stable/profiles/default/x86/make.defaults create mode 100644 testdata/repos/prohibited_stable/profiles/profiles.desc create mode 100644 testdata/repos/prohibited_stable/profiles/repo_name diff --git a/src/pkgcheck/checks/prohibited_stable.py b/src/pkgcheck/checks/prohibited_stable.py new file mode 100644 index 000000000..27e97a414 --- /dev/null +++ b/src/pkgcheck/checks/prohibited_stable.py @@ -0,0 +1,41 @@ +import typing + +from pkgcore.ebuild.misc import sort_keywords +from snakeoil.strings import pluralism + +from .. import results +from . import OptionalCheck + + +class ProhibitedStableKeywords(results.VersionResult, results.Error): + """Package uses stable keywords prohibited by the repository.""" + + def __init__(self, arches, **kwargs): + super().__init__(**kwargs) + self.arches = tuple(sort_keywords(arches)) + + @property + def desc(self): + s = pluralism(self.arches) + arches = ", ".join(self.arches) + return f"prohibited stable keyword{s}: [ {arches} ]" + + +class ProhibitedStableKeywordsCheck(OptionalCheck): + """Scan for packages using stable keywords prohibited by the repository.""" + + known_results: typing.ClassVar[frozenset] = frozenset({ProhibitedStableKeywords}) + + # acct-group and acct-user eclasses define KEYWORDS + # See https://bugs.gentoo.org/342185 + ignored_categories: typing.ClassVar[frozenset] = frozenset({"acct-group", "acct-user"}) + + def feed(self, pkg): + if pkg.category in self.ignored_categories: + return + + arches = {k for k in pkg.keywords if not k.startswith(("~", "-"))} + if not arches: + return + + yield ProhibitedStableKeywords(arches, pkg=pkg) diff --git a/testdata/data/repos/prohibited_stable/ProhibitedStableKeywordsCheck/ProhibitedStableKeywords/expected.json b/testdata/data/repos/prohibited_stable/ProhibitedStableKeywordsCheck/ProhibitedStableKeywords/expected.json new file mode 100644 index 000000000..6b1ef9ee1 --- /dev/null +++ b/testdata/data/repos/prohibited_stable/ProhibitedStableKeywordsCheck/ProhibitedStableKeywords/expected.json @@ -0,0 +1,2 @@ +{"__class__": "ProhibitedStableKeywords", "category": "ProhibitedStableKeywordsCheck", "package": "ProhibitedStableKeywords", "version": "0", "arches": ["amd64"]} +{"__class__": "ProhibitedStableKeywords", "category": "ProhibitedStableKeywordsCheck", "package": "ProhibitedStableKeywords", "version": "1", "arches": ["x86"]} diff --git a/testdata/data/repos/prohibited_stable/ProhibitedStableKeywordsCheck/ProhibitedStableKeywords/fix.patch b/testdata/data/repos/prohibited_stable/ProhibitedStableKeywordsCheck/ProhibitedStableKeywords/fix.patch new file mode 100644 index 000000000..3e564d4cf --- /dev/null +++ b/testdata/data/repos/prohibited_stable/ProhibitedStableKeywordsCheck/ProhibitedStableKeywords/fix.patch @@ -0,0 +1,20 @@ +diff --git prohibited_stable/ProhibitedStableKeywordsCheck/ProhibitedStableKeywords/ProhibitedStableKeywords-0.ebuild fixed/ProhibitedStableKeywordsCheck/ProhibitedStableKeywords/ProhibitedStableKeywords-0.ebuild +index fc606dee..52f19ba0 100644 +--- prohibited_stable/ProhibitedStableKeywordsCheck/ProhibitedStableKeywords/ProhibitedStableKeywords-0.ebuild ++++ fixed/ProhibitedStableKeywordsCheck/ProhibitedStableKeywords/ProhibitedStableKeywords-0.ebuild +@@ -9,4 +9,4 @@ SRC_URI="https://example.com/" + + LICENSE="MIT" + SLOT="0" +-KEYWORDS="amd64" ++KEYWORDS="~amd64" +diff --git prohibited_stable/ProhibitedStableKeywordsCheck/ProhibitedStableKeywords/ProhibitedStableKeywords-1.ebuild fixed/ProhibitedStableKeywordsCheck/ProhibitedStableKeywords/ProhibitedStableKeywords-1.ebuild +index e8774608..12e0329a 100644 +--- prohibited_stable/ProhibitedStableKeywordsCheck/ProhibitedStableKeywords/ProhibitedStableKeywords-1.ebuild ++++ fixed/ProhibitedStableKeywordsCheck/ProhibitedStableKeywords/ProhibitedStableKeywords-1.ebuild +@@ -9,4 +9,4 @@ SRC_URI="https://example.com/" + + LICENSE="MIT" + SLOT="0" +-KEYWORDS="~amd64 x86" ++KEYWORDS="~amd64 ~x86" diff --git a/testdata/repos/prohibited_stable/ProhibitedStableKeywordsCheck/ProhibitedStableKeywords/ProhibitedStableKeywords-0.ebuild b/testdata/repos/prohibited_stable/ProhibitedStableKeywordsCheck/ProhibitedStableKeywords/ProhibitedStableKeywords-0.ebuild new file mode 100644 index 000000000..f1afc7a96 --- /dev/null +++ b/testdata/repos/prohibited_stable/ProhibitedStableKeywordsCheck/ProhibitedStableKeywords/ProhibitedStableKeywords-0.ebuild @@ -0,0 +1,12 @@ +# Copyright 2026 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +DESCRIPTION="ProhibitedStableKeywords" +HOMEPAGE="https://example.com/" +SRC_URI="https://example.com/" + +LICENSE="MIT" +SLOT="0" +KEYWORDS="amd64" diff --git a/testdata/repos/prohibited_stable/ProhibitedStableKeywordsCheck/ProhibitedStableKeywords/ProhibitedStableKeywords-1.ebuild b/testdata/repos/prohibited_stable/ProhibitedStableKeywordsCheck/ProhibitedStableKeywords/ProhibitedStableKeywords-1.ebuild new file mode 100644 index 000000000..a681ea6d0 --- /dev/null +++ b/testdata/repos/prohibited_stable/ProhibitedStableKeywordsCheck/ProhibitedStableKeywords/ProhibitedStableKeywords-1.ebuild @@ -0,0 +1,12 @@ +# Copyright 2026 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +DESCRIPTION="ProhibitedStableKeywords" +HOMEPAGE="https://example.com/" +SRC_URI="https://example.com/" + +LICENSE="MIT" +SLOT="0" +KEYWORDS="~amd64 x86" diff --git a/testdata/repos/prohibited_stable/ProhibitedStableKeywordsCheck/ProhibitedStableKeywords/ProhibitedStableKeywords-2.ebuild b/testdata/repos/prohibited_stable/ProhibitedStableKeywordsCheck/ProhibitedStableKeywords/ProhibitedStableKeywords-2.ebuild new file mode 100644 index 000000000..64df5d383 --- /dev/null +++ b/testdata/repos/prohibited_stable/ProhibitedStableKeywordsCheck/ProhibitedStableKeywords/ProhibitedStableKeywords-2.ebuild @@ -0,0 +1,12 @@ +# Copyright 2026 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +DESCRIPTION="ProhibitedStableKeywords" +HOMEPAGE="https://example.com/" +SRC_URI="https://example.com/" + +LICENSE="MIT" +SLOT="0" +KEYWORDS="~amd64" diff --git a/testdata/repos/prohibited_stable/ProhibitedStableKeywordsCheck/ProhibitedStableKeywords/ProhibitedStableKeywords-9999.ebuild b/testdata/repos/prohibited_stable/ProhibitedStableKeywordsCheck/ProhibitedStableKeywords/ProhibitedStableKeywords-9999.ebuild new file mode 100644 index 000000000..a3e5afb01 --- /dev/null +++ b/testdata/repos/prohibited_stable/ProhibitedStableKeywordsCheck/ProhibitedStableKeywords/ProhibitedStableKeywords-9999.ebuild @@ -0,0 +1,11 @@ +# Copyright 2026 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +DESCRIPTION="ProhibitedStableKeywords" +HOMEPAGE="https://example.com/" +SRC_URI="https://example.com/" + +LICENSE="MIT" +SLOT="0" diff --git a/testdata/repos/prohibited_stable/metadata/layout.conf b/testdata/repos/prohibited_stable/metadata/layout.conf new file mode 100644 index 000000000..5ea183486 --- /dev/null +++ b/testdata/repos/prohibited_stable/metadata/layout.conf @@ -0,0 +1,2 @@ +masters = +cache-formats = diff --git a/testdata/repos/prohibited_stable/profiles/arch.list b/testdata/repos/prohibited_stable/profiles/arch.list new file mode 100644 index 000000000..1677fa6f4 --- /dev/null +++ b/testdata/repos/prohibited_stable/profiles/arch.list @@ -0,0 +1,2 @@ +amd64 +x86 diff --git a/testdata/repos/prohibited_stable/profiles/categories b/testdata/repos/prohibited_stable/profiles/categories new file mode 100644 index 000000000..515b4979c --- /dev/null +++ b/testdata/repos/prohibited_stable/profiles/categories @@ -0,0 +1 @@ +ProhibitedStableKeywordsCheck diff --git a/testdata/repos/prohibited_stable/profiles/default/amd64/make.defaults b/testdata/repos/prohibited_stable/profiles/default/amd64/make.defaults new file mode 100644 index 000000000..b3e0df883 --- /dev/null +++ b/testdata/repos/prohibited_stable/profiles/default/amd64/make.defaults @@ -0,0 +1 @@ +ARCH="amd64" diff --git a/testdata/repos/prohibited_stable/profiles/default/x86/make.defaults b/testdata/repos/prohibited_stable/profiles/default/x86/make.defaults new file mode 100644 index 000000000..e8f156818 --- /dev/null +++ b/testdata/repos/prohibited_stable/profiles/default/x86/make.defaults @@ -0,0 +1 @@ +ARCH="x86" diff --git a/testdata/repos/prohibited_stable/profiles/profiles.desc b/testdata/repos/prohibited_stable/profiles/profiles.desc new file mode 100644 index 000000000..0f7102bcb --- /dev/null +++ b/testdata/repos/prohibited_stable/profiles/profiles.desc @@ -0,0 +1,2 @@ +amd64 default/amd64 stable +x86 default/x86 stable diff --git a/testdata/repos/prohibited_stable/profiles/repo_name b/testdata/repos/prohibited_stable/profiles/repo_name new file mode 100644 index 000000000..fee27daba --- /dev/null +++ b/testdata/repos/prohibited_stable/profiles/repo_name @@ -0,0 +1 @@ +prohibited_stable