commit: d5f89e290c66a95a326a59b6103a2239dd08eedc Author: Michał Górny <mgorny <AT> gentoo <DOT> org> AuthorDate: Sat Jul 12 13:45:49 2025 +0000 Commit: Arthur Zamarin <arthurzam <AT> gentoo <DOT> org> CommitDate: Tue Jul 15 18:30:39 2025 +0000 URL: https://gitweb.gentoo.org/proj/pkgcore/pkgcheck.git/commit/?id=d5f89e29
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: https://github.com/pkgcore/pkgcheck/issues/745 Co-authored-by: Arthur Zamarin <arthurzam <AT> gentoo.org> Signed-off-by: Michał Górny <mgorny <AT> gentoo.org> Closes: https://github.com/pkgcore/pkgcheck/pull/746 Signed-off-by: Arthur Zamarin <arthurzam <AT> gentoo.org> src/pkgcheck/checks/overlays.py | 36 +++++++++++++++++++++- .../MasterPackageClobbered/expected.json | 1 + .../MasterPackageClobbered-1.ebuild | 4 +++ .../MasterPackageClobberedMasked-1.ebuild | 4 +++ testdata/repos/overlay/profiles/categories | 1 + .../MasterPackageClobbered-0.ebuild | 4 +++ .../MasterPackageClobberedMasked-0.ebuild | 4 +++ testdata/repos/overlayed/profiles/categories | 1 + testdata/repos/overlayed/profiles/package.mask | 3 ++ 9 files changed, 57 insertions(+), 1 deletion(-) diff --git a/src/pkgcheck/checks/overlays.py b/src/pkgcheck/checks/overlays.py index cbe3d5b6..f44b2aa6 100644 --- a/src/pkgcheck/checks/overlays.py +++ b/src/pkgcheck/checks/overlays.py @@ -2,7 +2,7 @@ from snakeoil.sequences import iflatten_instance from snakeoil.strings import pluralism from .. import results, sources -from . import MirrorsCheck, OptionalCheck, OverlayRepoCheck, RepoCheck +from . import Check, MirrorsCheck, OptionalCheck, OverlayRepoCheck, RepoCheck class UnusedInMastersLicenses(results.VersionResult, results.Warning): @@ -132,3 +132,37 @@ class UnusedInMastersCheck(MirrorsCheck, OverlayRepoCheck, RepoCheck, OptionalCh non_local_use = pkg.iuse_stripped.difference(pkg.local_use.keys()) if flags := self.unused_master_flags.intersection(non_local_use): yield UnusedInMastersGlobalUse(sorted(flags), pkg=pkg) + + +class MasterPackageClobbered(results.PackageResult, results.Error): + """Package in master is clobbered by package in overlay. + + A repository (such as ``::guru``) that is supposed to only provide + additional packages to its masters (``::gentoo``), provides a package + that is found in its master, therefore potentially clobbering it. + """ + + def __init__(self, repository: str, **kwarg): + super().__init__(**kwarg) + self.repository = repository + + @property + def desc(self): + return f"package from repository ::{self.repository} clobbered" + + +class MasterPackageClobberedCheck(OverlayRepoCheck, OptionalCheck): + """Detect clobbering packages from master.""" + + _source = sources.PackageRepoSource + known_results = frozenset({MasterPackageClobbered}) + + def feed(self, pkgset): + pkg = pkgset[0] + for repo in self.options.target_repo.masters: + # Trigger only if at least one non-p.masked package matches, + # to cover for packages being moved to subordinate repo. + for master_pkg in repo.itermatch(pkg.unversioned_atom): + if not repo.masked.match(master_pkg): + yield MasterPackageClobbered(str(repo), pkg=pkg) + break diff --git a/testdata/data/repos/overlay/MasterPackageClobberedCheck/MasterPackageClobbered/expected.json b/testdata/data/repos/overlay/MasterPackageClobberedCheck/MasterPackageClobbered/expected.json new file mode 100644 index 00000000..25549996 --- /dev/null +++ b/testdata/data/repos/overlay/MasterPackageClobberedCheck/MasterPackageClobbered/expected.json @@ -0,0 +1 @@ +{"__class__": "MasterPackageClobbered", "category": "MasterPackageClobberedCheck", "package": "MasterPackageClobbered", "repository": "overlayed"} diff --git a/testdata/repos/overlay/MasterPackageClobberedCheck/MasterPackageClobbered/MasterPackageClobbered-1.ebuild b/testdata/repos/overlay/MasterPackageClobberedCheck/MasterPackageClobbered/MasterPackageClobbered-1.ebuild new file mode 100644 index 00000000..d89cba09 --- /dev/null +++ b/testdata/repos/overlay/MasterPackageClobberedCheck/MasterPackageClobbered/MasterPackageClobbered-1.ebuild @@ -0,0 +1,4 @@ +DESCRIPTION="Ebuild clobbered by overlay" +HOMEPAGE="https://github.com/pkgcore/pkgcheck" +LICENSE="BSD" +SLOT="0" diff --git a/testdata/repos/overlay/MasterPackageClobberedCheck/MasterPackageClobberedMasked/MasterPackageClobberedMasked-1.ebuild b/testdata/repos/overlay/MasterPackageClobberedCheck/MasterPackageClobberedMasked/MasterPackageClobberedMasked-1.ebuild new file mode 100644 index 00000000..d89cba09 --- /dev/null +++ b/testdata/repos/overlay/MasterPackageClobberedCheck/MasterPackageClobberedMasked/MasterPackageClobberedMasked-1.ebuild @@ -0,0 +1,4 @@ +DESCRIPTION="Ebuild clobbered by overlay" +HOMEPAGE="https://github.com/pkgcore/pkgcheck" +LICENSE="BSD" +SLOT="0" diff --git a/testdata/repos/overlay/profiles/categories b/testdata/repos/overlay/profiles/categories index 6dbed601..30c92f40 100644 --- a/testdata/repos/overlay/profiles/categories +++ b/testdata/repos/overlay/profiles/categories @@ -1,2 +1,3 @@ +MasterPackageClobberedCheck UnusedInMastersCheck VisibilityCheck diff --git a/testdata/repos/overlayed/MasterPackageClobberedCheck/MasterPackageClobbered/MasterPackageClobbered-0.ebuild b/testdata/repos/overlayed/MasterPackageClobberedCheck/MasterPackageClobbered/MasterPackageClobbered-0.ebuild new file mode 100644 index 00000000..d89cba09 --- /dev/null +++ b/testdata/repos/overlayed/MasterPackageClobberedCheck/MasterPackageClobbered/MasterPackageClobbered-0.ebuild @@ -0,0 +1,4 @@ +DESCRIPTION="Ebuild clobbered by overlay" +HOMEPAGE="https://github.com/pkgcore/pkgcheck" +LICENSE="BSD" +SLOT="0" diff --git a/testdata/repos/overlayed/MasterPackageClobberedCheck/MasterPackageClobberedMasked/MasterPackageClobberedMasked-0.ebuild b/testdata/repos/overlayed/MasterPackageClobberedCheck/MasterPackageClobberedMasked/MasterPackageClobberedMasked-0.ebuild new file mode 100644 index 00000000..d89cba09 --- /dev/null +++ b/testdata/repos/overlayed/MasterPackageClobberedCheck/MasterPackageClobberedMasked/MasterPackageClobberedMasked-0.ebuild @@ -0,0 +1,4 @@ +DESCRIPTION="Ebuild clobbered by overlay" +HOMEPAGE="https://github.com/pkgcore/pkgcheck" +LICENSE="BSD" +SLOT="0" diff --git a/testdata/repos/overlayed/profiles/categories b/testdata/repos/overlayed/profiles/categories index 39802f64..84b9f25f 100644 --- a/testdata/repos/overlayed/profiles/categories +++ b/testdata/repos/overlayed/profiles/categories @@ -1 +1,2 @@ +MasterPackageClobberedCheck stub diff --git a/testdata/repos/overlayed/profiles/package.mask b/testdata/repos/overlayed/profiles/package.mask index e6ebacc1..9c34e3d9 100644 --- a/testdata/repos/overlayed/profiles/package.mask +++ b/testdata/repos/overlayed/profiles/package.mask @@ -1 +1,4 @@ stub/masked + +# Package being moved to ::overlay. +<MasterPackageClobberedCheck/MasterPackageClobberedMasked-1
