From 41bd9a72b26746a073b4adc69bda9e8191408e63 Mon Sep 17 00:00:00 2001 From: Florian Albrechtskirchinger Date: Fri, 16 Jan 2026 11:08:01 +0100 Subject: [PATCH] StableKeywordsCheck: detect packages using stable keywords Add an optional check to scan for packages using stable keywords. This is useful for overlays like ::guru, which require that all packages be keyworded unstable. Signed-off-by: Florian Albrechtskirchinger --- src/pkgcheck/checks/stable_keywords.py | 58 +++++++++++++++++++ .../StableKeywords/expected.json | 2 + .../StableKeywords/fix.patch | 20 +++++++ .../StableKeywords/StableKeywords-0.ebuild | 12 ++++ .../StableKeywords/StableKeywords-1.ebuild | 12 ++++ .../StableKeywords/StableKeywords-2.ebuild | 12 ++++ .../StableKeywords/StableKeywords-9999.ebuild | 11 ++++ .../stable_keywords/metadata/layout.conf | 2 + .../repos/stable_keywords/profiles/arch.list | 2 + .../repos/stable_keywords/profiles/categories | 1 + .../profiles/default/amd64/make.defaults | 1 + .../profiles/default/x86/make.defaults | 1 + .../stable_keywords/profiles/profiles.desc | 2 + .../repos/stable_keywords/profiles/repo_name | 1 + 14 files changed, 137 insertions(+) create mode 100644 src/pkgcheck/checks/stable_keywords.py create mode 100644 testdata/data/repos/stable_keywords/StableKeywordsCheck/StableKeywords/expected.json create mode 100644 testdata/data/repos/stable_keywords/StableKeywordsCheck/StableKeywords/fix.patch create mode 100644 testdata/repos/stable_keywords/StableKeywordsCheck/StableKeywords/StableKeywords-0.ebuild create mode 100644 testdata/repos/stable_keywords/StableKeywordsCheck/StableKeywords/StableKeywords-1.ebuild create mode 100644 testdata/repos/stable_keywords/StableKeywordsCheck/StableKeywords/StableKeywords-2.ebuild create mode 100644 testdata/repos/stable_keywords/StableKeywordsCheck/StableKeywords/StableKeywords-9999.ebuild create mode 100644 testdata/repos/stable_keywords/metadata/layout.conf create mode 100644 testdata/repos/stable_keywords/profiles/arch.list create mode 100644 testdata/repos/stable_keywords/profiles/categories create mode 100644 testdata/repos/stable_keywords/profiles/default/amd64/make.defaults create mode 100644 testdata/repos/stable_keywords/profiles/default/x86/make.defaults create mode 100644 testdata/repos/stable_keywords/profiles/profiles.desc create mode 100644 testdata/repos/stable_keywords/profiles/repo_name diff --git a/src/pkgcheck/checks/stable_keywords.py b/src/pkgcheck/checks/stable_keywords.py new file mode 100644 index 000000000..e86a80863 --- /dev/null +++ b/src/pkgcheck/checks/stable_keywords.py @@ -0,0 +1,58 @@ +from collections import defaultdict + +from pkgcore.ebuild.misc import sort_keywords +from pkgcore.restrictions import packages, values +from snakeoil.strings import pluralism + +from .. import addons, results, sources +from . import OptionalCheck + + +class StableKeywords(results.PackageResult, results.Error): + """Package uses stable keywords.""" + + def __init__(self, versions, arches, **kwargs): + super().__init__(**kwargs) + self.versions = tuple(versions) + self.arches = tuple(arches) + + @property + def desc(self): + s = pluralism(self.arches) + arches = ", ".join(self.arches) + versions = ", ".join(self.versions) + return f"stable keyword{s} [ {arches} ] used on version{s}: [ {versions} ]" + + +class StableKeywordsCheck(OptionalCheck): + """Scan for packages using stable keywords.""" + + _source = sources.PackageRepoSource + required_addons = (addons.StableArchesAddon,) + known_results = frozenset([StableKeywords]) + + def __init__(self, *args, stable_arches_addon=None): + super().__init__(*args) + self.arches = {x.strip().lstrip("~") for x in self.options.stable_arches} + + self.arch_restricts = { + arch: packages.PackageRestriction("keywords", values.ContainmentMatch2((arch,))) + for arch in self.arches + } + + def feed(self, pkgset): + pkgs_arches = defaultdict(set) + for arch, r in self.arch_restricts.items(): + for pkg in pkgset: + if r.match(pkg): + pkgs_arches[pkg].add(arch) + + # invert + arches_pkgs = defaultdict(list) + for pkg, arches in pkgs_arches.items(): + arches_pkgs[frozenset(arches)].append(pkg) + + # collapse reports by sets of arches + for arches, pkgs in arches_pkgs.items(): + versions = (pkg.fullver for pkg in sorted(pkgs)) + yield StableKeywords(versions, sort_keywords(arches), pkg=pkgs[0]) diff --git a/testdata/data/repos/stable_keywords/StableKeywordsCheck/StableKeywords/expected.json b/testdata/data/repos/stable_keywords/StableKeywordsCheck/StableKeywords/expected.json new file mode 100644 index 000000000..30edb4470 --- /dev/null +++ b/testdata/data/repos/stable_keywords/StableKeywordsCheck/StableKeywords/expected.json @@ -0,0 +1,2 @@ +{"__class__": "StableKeywords", "category": "StableKeywordsCheck", "package": "StableKeywords", "versions": ["0"], "arches": ["amd64"]} +{"__class__": "StableKeywords", "category": "StableKeywordsCheck", "package": "StableKeywords", "versions": ["1"], "arches": ["x86"]} diff --git a/testdata/data/repos/stable_keywords/StableKeywordsCheck/StableKeywords/fix.patch b/testdata/data/repos/stable_keywords/StableKeywordsCheck/StableKeywords/fix.patch new file mode 100644 index 000000000..137ef40b7 --- /dev/null +++ b/testdata/data/repos/stable_keywords/StableKeywordsCheck/StableKeywords/fix.patch @@ -0,0 +1,20 @@ +diff --git stable_keywords/StableKeywordsCheck/StableKeywords/StableKeywords-0.ebuild fixed/StableKeywordsCheck/StableKeywords/StableKeywords-0.ebuild +index fc606dee..52f19ba0 100644 +--- stable_keywords/StableKeywordsCheck/StableKeywords/StableKeywords-0.ebuild ++++ fixed/StableKeywordsCheck/StableKeywords/StableKeywords-0.ebuild +@@ -9,4 +9,4 @@ SRC_URI="https://example.com/" + + LICENSE="MIT" + SLOT="0" +-KEYWORDS="amd64" ++KEYWORDS="~amd64" +diff --git stable_keywords/StableKeywordsCheck/StableKeywords/StableKeywords-1.ebuild fixed/StableKeywordsCheck/StableKeywords/StableKeywords-1.ebuild +index e8774608..12e0329a 100644 +--- stable_keywords/StableKeywordsCheck/StableKeywords/StableKeywords-1.ebuild ++++ fixed/StableKeywordsCheck/StableKeywords/StableKeywords-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/stable_keywords/StableKeywordsCheck/StableKeywords/StableKeywords-0.ebuild b/testdata/repos/stable_keywords/StableKeywordsCheck/StableKeywords/StableKeywords-0.ebuild new file mode 100644 index 000000000..fc606dee5 --- /dev/null +++ b/testdata/repos/stable_keywords/StableKeywordsCheck/StableKeywords/StableKeywords-0.ebuild @@ -0,0 +1,12 @@ +# Copyright 2026 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +DESCRIPTION="StableKeywords" +HOMEPAGE="https://example.com/" +SRC_URI="https://example.com/" + +LICENSE="MIT" +SLOT="0" +KEYWORDS="amd64" diff --git a/testdata/repos/stable_keywords/StableKeywordsCheck/StableKeywords/StableKeywords-1.ebuild b/testdata/repos/stable_keywords/StableKeywordsCheck/StableKeywords/StableKeywords-1.ebuild new file mode 100644 index 000000000..e8774608f --- /dev/null +++ b/testdata/repos/stable_keywords/StableKeywordsCheck/StableKeywords/StableKeywords-1.ebuild @@ -0,0 +1,12 @@ +# Copyright 2026 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +DESCRIPTION="StableKeywords" +HOMEPAGE="https://example.com/" +SRC_URI="https://example.com/" + +LICENSE="MIT" +SLOT="0" +KEYWORDS="~amd64 x86" diff --git a/testdata/repos/stable_keywords/StableKeywordsCheck/StableKeywords/StableKeywords-2.ebuild b/testdata/repos/stable_keywords/StableKeywordsCheck/StableKeywords/StableKeywords-2.ebuild new file mode 100644 index 000000000..52f19ba0d --- /dev/null +++ b/testdata/repos/stable_keywords/StableKeywordsCheck/StableKeywords/StableKeywords-2.ebuild @@ -0,0 +1,12 @@ +# Copyright 2026 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +DESCRIPTION="StableKeywords" +HOMEPAGE="https://example.com/" +SRC_URI="https://example.com/" + +LICENSE="MIT" +SLOT="0" +KEYWORDS="~amd64" diff --git a/testdata/repos/stable_keywords/StableKeywordsCheck/StableKeywords/StableKeywords-9999.ebuild b/testdata/repos/stable_keywords/StableKeywordsCheck/StableKeywords/StableKeywords-9999.ebuild new file mode 100644 index 000000000..f9e0a90d1 --- /dev/null +++ b/testdata/repos/stable_keywords/StableKeywordsCheck/StableKeywords/StableKeywords-9999.ebuild @@ -0,0 +1,11 @@ +# Copyright 2026 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +DESCRIPTION="StableKeywords" +HOMEPAGE="https://example.com/" +SRC_URI="https://example.com/" + +LICENSE="MIT" +SLOT="0" diff --git a/testdata/repos/stable_keywords/metadata/layout.conf b/testdata/repos/stable_keywords/metadata/layout.conf new file mode 100644 index 000000000..5ea183486 --- /dev/null +++ b/testdata/repos/stable_keywords/metadata/layout.conf @@ -0,0 +1,2 @@ +masters = +cache-formats = diff --git a/testdata/repos/stable_keywords/profiles/arch.list b/testdata/repos/stable_keywords/profiles/arch.list new file mode 100644 index 000000000..1677fa6f4 --- /dev/null +++ b/testdata/repos/stable_keywords/profiles/arch.list @@ -0,0 +1,2 @@ +amd64 +x86 diff --git a/testdata/repos/stable_keywords/profiles/categories b/testdata/repos/stable_keywords/profiles/categories new file mode 100644 index 000000000..d48bd4914 --- /dev/null +++ b/testdata/repos/stable_keywords/profiles/categories @@ -0,0 +1 @@ +StableKeywordsCheck diff --git a/testdata/repos/stable_keywords/profiles/default/amd64/make.defaults b/testdata/repos/stable_keywords/profiles/default/amd64/make.defaults new file mode 100644 index 000000000..b3e0df883 --- /dev/null +++ b/testdata/repos/stable_keywords/profiles/default/amd64/make.defaults @@ -0,0 +1 @@ +ARCH="amd64" diff --git a/testdata/repos/stable_keywords/profiles/default/x86/make.defaults b/testdata/repos/stable_keywords/profiles/default/x86/make.defaults new file mode 100644 index 000000000..e8f156818 --- /dev/null +++ b/testdata/repos/stable_keywords/profiles/default/x86/make.defaults @@ -0,0 +1 @@ +ARCH="x86" diff --git a/testdata/repos/stable_keywords/profiles/profiles.desc b/testdata/repos/stable_keywords/profiles/profiles.desc new file mode 100644 index 000000000..0f7102bcb --- /dev/null +++ b/testdata/repos/stable_keywords/profiles/profiles.desc @@ -0,0 +1,2 @@ +amd64 default/amd64 stable +x86 default/x86 stable diff --git a/testdata/repos/stable_keywords/profiles/repo_name b/testdata/repos/stable_keywords/profiles/repo_name new file mode 100644 index 000000000..0214baab5 --- /dev/null +++ b/testdata/repos/stable_keywords/profiles/repo_name @@ -0,0 +1 @@ +stable_keywords