@@ -814,3 +814,50 @@ def __init__(self, *args):
814814 def finish (self ):
815815 if deprecated_hashes := DEPRECATED_HASHES .intersection (self .repo .config .manifests .hashes ):
816816 yield DeprecatedRepoHash (sorted (deprecated_hashes ))
817+
818+
819+ class StabilizationGroupSourcingError (results .LogError ):
820+ """Misformed stabilization group file."""
821+
822+
823+ class UnknownStabilizationGroupPackage (results .Error ):
824+ """Packages listed in stabilization group that doesn't exist."""
825+
826+ def __init__ (self , group : str , packages : list [str ]):
827+ super ().__init__ ()
828+ self .group = group
829+ self .packages = tuple (packages )
830+
831+ @property
832+ def desc (self ):
833+ s = pluralism (self .packages )
834+ packages = ", " .join (self .packages )
835+ return f"stabilization group { self .group !r} has unknown package{ s } : [ { packages } ]"
836+
837+
838+ class StabilizationGroupsCheck (RepoCheck ):
839+ """Check stabilization groups"""
840+
841+ _source = (sources .EmptySource , (base .repo_scope ,))
842+ known_results = frozenset ({StabilizationGroupSourcingError , UnknownStabilizationGroupPackage })
843+
844+ def __init__ (self , * args ):
845+ super ().__init__ (* args )
846+ self .repo = self .options .target_repo
847+
848+ def finish (self ):
849+ _logmap = (
850+ base .LogMap ("pkgcore.log.logger.warning" , StabilizationGroupSourcingError ),
851+ base .LogMap ("pkgcore.log.logger.error" , StabilizationGroupSourcingError ),
852+ )
853+ with base .LogReports (* _logmap ) as log_reports :
854+ groups = self .repo .stabilization_groups
855+ yield from log_reports
856+
857+ for group , packages in groups .items ():
858+ unknown_packages = set ()
859+ for pkg in packages :
860+ if not self .repo .match (pkg ):
861+ unknown_packages .add (pkg .key )
862+ if unknown_packages :
863+ yield UnknownStabilizationGroupPackage (group , sorted (unknown_packages ))
0 commit comments