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