commit: 88c2e6a742e41f81b7485876523b27ab2581b0da
Author: Arthur Zamarin <arthurzam <AT> gentoo <DOT> org>
AuthorDate: Sat Jan 10 10:11:02 2026 +0000
Commit: Arthur Zamarin <arthurzam <AT> gentoo <DOT> org>
CommitDate: Sat Jan 10 10:11:31 2026 +0000
URL:
https://gitweb.gentoo.org/proj/pkgcore/pkgcheck.git/commit/?id=88c2e6a7
StabilizationGroupsCheck: add checks for invalid and non-existing groups
Signed-off-by: Arthur Zamarin <arthurzam <AT> gentoo.org>
src/pkgcheck/checks/repo_metadata.py | 47 ++++++++++++++++++++++
.../StabilizationGroupSourcingError/expected.json | 1 +
.../UnknownStabilizationGroupPackage/expected.json | 1 +
.../metadata/stabilization-groups/invalid.group | 5 +++
.../stabilization-groups/non-existing.group | 2 +
5 files changed, 56 insertions(+)
diff --git a/src/pkgcheck/checks/repo_metadata.py
b/src/pkgcheck/checks/repo_metadata.py
index bd60a456..9aaced90 100644
--- a/src/pkgcheck/checks/repo_metadata.py
+++ b/src/pkgcheck/checks/repo_metadata.py
@@ -814,3 +814,50 @@ class RepoManifestHashCheck(RepoCheck):
def finish(self):
if deprecated_hashes :=
DEPRECATED_HASHES.intersection(self.repo.config.manifests.hashes):
yield DeprecatedRepoHash(sorted(deprecated_hashes))
+
+
+class StabilizationGroupSourcingError(results.LogError):
+ """Misformed stabilization group file."""
+
+
+class UnknownStabilizationGroupPackage(results.Error):
+ """Packages listed in stabilization group that doesn't exist."""
+
+ def __init__(self, group: str, packages: list[str]):
+ super().__init__()
+ self.group = group
+ self.packages = tuple(packages)
+
+ @property
+ def desc(self):
+ s = pluralism(self.packages)
+ packages = ", ".join(self.packages)
+ return f"stabilization group {self.group!r} has unknown package{s}: [
{packages} ]"
+
+
+class StabilizationGroupsCheck(RepoCheck):
+ """Check stabilization groups"""
+
+ _source = (sources.EmptySource, (base.repo_scope,))
+ known_results = frozenset({StabilizationGroupSourcingError,
UnknownStabilizationGroupPackage})
+
+ def __init__(self, *args):
+ super().__init__(*args)
+ self.repo = self.options.target_repo
+
+ def finish(self):
+ _logmap = (
+ base.LogMap("pkgcore.log.logger.warning",
StabilizationGroupSourcingError),
+ base.LogMap("pkgcore.log.logger.error",
StabilizationGroupSourcingError),
+ )
+ with base.LogReports(*_logmap) as log_reports:
+ groups = self.repo.stabilization_groups
+ yield from log_reports
+
+ for group, packages in groups.items():
+ unknown_packages = set()
+ for pkg in packages:
+ if not self.repo.match(pkg):
+ unknown_packages.add(pkg.key)
+ if unknown_packages:
+ yield UnknownStabilizationGroupPackage(group,
sorted(unknown_packages))
diff --git
a/testdata/data/repos/standalone/StabilizationGroupsCheck/StabilizationGroupSourcingError/expected.json
b/testdata/data/repos/standalone/StabilizationGroupsCheck/StabilizationGroupSourcingError/expected.json
new file mode 100644
index 00000000..2d0646b9
--- /dev/null
+++
b/testdata/data/repos/standalone/StabilizationGroupsCheck/StabilizationGroupSourcingError/expected.json
@@ -0,0 +1 @@
+{"__class__": "StabilizationGroupSourcingError", "msg":
"/metadata/stabilization-groups/invalid.group, line 3: parsing error: invalid
package atom: 'cat-cat'"}
diff --git
a/testdata/data/repos/standalone/StabilizationGroupsCheck/UnknownStabilizationGroupPackage/expected.json
b/testdata/data/repos/standalone/StabilizationGroupsCheck/UnknownStabilizationGroupPackage/expected.json
new file mode 100644
index 00000000..33385f3d
--- /dev/null
+++
b/testdata/data/repos/standalone/StabilizationGroupsCheck/UnknownStabilizationGroupPackage/expected.json
@@ -0,0 +1 @@
+{"__class__": "UnknownStabilizationGroupPackage", "group": "non-existing",
"packages": ["dev-lang/doesnot-exist"]}
diff --git
a/testdata/repos/standalone/metadata/stabilization-groups/invalid.group
b/testdata/repos/standalone/metadata/stabilization-groups/invalid.group
new file mode 100644
index 00000000..a8823487
--- /dev/null
+++ b/testdata/repos/standalone/metadata/stabilization-groups/invalid.group
@@ -0,0 +1,5 @@
+# cat/pkg
+# cat-cat
+cat-cat
+<=dev-lang/rust-5.0
+dev-lang/rust
diff --git
a/testdata/repos/standalone/metadata/stabilization-groups/non-existing.group
b/testdata/repos/standalone/metadata/stabilization-groups/non-existing.group
new file mode 100644
index 00000000..675e77d3
--- /dev/null
+++ b/testdata/repos/standalone/metadata/stabilization-groups/non-existing.group
@@ -0,0 +1,2 @@
+dev-lang/rust
+dev-lang/doesnot-exist