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

Reply via email to