Skip to content

Commit 9b5e01f

Browse files
committed
Add a check for clobbered packages in overlays
Add a check that reports if a given package clobbers a package from the master repository. Since this only applies to some repositores (e.g. ::guru), it is optional (disabled by default). Closes: #745 Signed-off-by: Michał Górny <[email protected]>
1 parent c1a730b commit 9b5e01f

File tree

6 files changed

+43
-1
lines changed

6 files changed

+43
-1
lines changed

src/pkgcheck/checks/overlays.py

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from snakeoil.strings import pluralism
33

44
from .. import results, sources
5-
from . import MirrorsCheck, OptionalCheck, OverlayRepoCheck, RepoCheck
5+
from . import Check, MirrorsCheck, OptionalCheck, OverlayRepoCheck, RepoCheck
66

77

88
class UnusedInMastersLicenses(results.VersionResult, results.Warning):
@@ -132,3 +132,34 @@ def feed(self, pkg):
132132
non_local_use = pkg.iuse_stripped.difference(pkg.local_use.keys())
133133
if flags := self.unused_master_flags.intersection(non_local_use):
134134
yield UnusedInMastersGlobalUse(sorted(flags), pkg=pkg)
135+
136+
137+
class MasterPackageClobbered(results.PackageResult, results.Error):
138+
"""Package in master is clobbered by package in overlay.
139+
140+
A repository (such as ``::guru``) that is supposed to only provide
141+
additional packages to its masters (``::gentoo``), provides a package
142+
that is found in its master, therefore potentially clobbering it.
143+
"""
144+
145+
def __init__(self, repository: str, **kwarg):
146+
super().__init__(**kwarg)
147+
self.repository = repository
148+
149+
@property
150+
def desc(self):
151+
return f"package from repository ::{self.repository} clobbered"
152+
153+
154+
class MasterPackageClobberedCheck(OverlayRepoCheck, OptionalCheck):
155+
"""Detect clobbering packages from master."""
156+
157+
_source = sources.PackageRepoSource
158+
known_results = frozenset([MasterPackageClobbered])
159+
160+
def feed(self, pkgset):
161+
for pkg in pkgset:
162+
for repo in self.options.target_repo.masters:
163+
if repo.has_match(pkg.unversioned_atom):
164+
yield MasterPackageClobbered(str(repo), pkg=pkg)
165+
break
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"__class__": "MasterPackageClobbered", "category": "MasterPackageClobberedCheck", "package": "MasterPackageClobbered", "repository": "overlayed"}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
DESCRIPTION="Ebuild clobbered by overlay"
2+
HOMEPAGE="https://github.com/pkgcore/pkgcheck"
3+
LICENSE="BSD"
4+
SLOT="0"
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
1+
MasterPackageClobberedCheck
12
UnusedInMastersCheck
23
VisibilityCheck
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
DESCRIPTION="Ebuild clobbered by overlay"
2+
HOMEPAGE="https://github.com/pkgcore/pkgcheck"
3+
LICENSE="BSD"
4+
SLOT="0"
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1+
MasterPackageClobberedCheck
12
stub

0 commit comments

Comments
 (0)