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

Reply via email to