commit:     d837ae22cc5381710f63d6600940d48a8e2875f5
Author:     Arthur Zamarin <arthurzam <AT> gentoo <DOT> org>
AuthorDate: Thu Nov 16 19:51:44 2023 +0000
Commit:     Arthur Zamarin <arthurzam <AT> gentoo <DOT> org>
CommitDate: Thu Nov 16 19:51:44 2023 +0000
URL:        
https://gitweb.gentoo.org/proj/pkgcore/pkgcheck.git/commit/?id=d837ae22

UnusedInherits: add whitelist for weak usage by another eclass

Came up as example from elisp eclass, which has automagic calling of
functions from readme.gentoo-r1 eclass if they are found in env. While
weird, this is legal so let's add a simple whitelist support for this,
so it would be simple to extend in future.

Reported-by: Ulrich Müller <ulm <AT> gentoo.org>
Signed-off-by: Arthur Zamarin <arthurzam <AT> gentoo.org>

 src/pkgcheck/checks/codingstyle.py                          |  8 +++++++-
 .../InheritsCheck/UnusedInherits/UnusedInherits-2.ebuild    |  8 ++++++++
 testdata/repos/eclass/eclass/elisp.eclass                   | 13 +++++++++++++
 testdata/repos/eclass/eclass/readme.gentoo-r1.eclass        | 11 +++++++++++
 4 files changed, 39 insertions(+), 1 deletion(-)

diff --git a/src/pkgcheck/checks/codingstyle.py 
b/src/pkgcheck/checks/codingstyle.py
index 60f1ce98..90cb03b2 100644
--- a/src/pkgcheck/checks/codingstyle.py
+++ b/src/pkgcheck/checks/codingstyle.py
@@ -848,6 +848,8 @@ class InheritsCheck(Check):
 
         self.unused_eclass_skiplist = 
frozenset(common_mandatory_metadata_keys) - {"IUSE"}
 
+        self.weak_eclass_usage = {"elisp": ("readme.gentoo-r1",)}
+
     def get_eclass(self, export, pkg):
         """Return the eclass related to a given exported variable or function 
name."""
         try:
@@ -920,8 +922,12 @@ class InheritsCheck(Check):
 
         # allowed indirect inherits
         indirect_allowed = set().union(*(self.eclass_cache[x].provides for x 
in pkg.inherit))
+        all_inherits = set().union(pkg.inherit, indirect_allowed, conditional)
         # missing inherits
-        missing = used.keys() - pkg.inherit - indirect_allowed - conditional
+        missing = used.keys() - all_inherits
+
+        for eclass in all_inherits:
+            weak_used_eclasses.update(self.weak_eclass_usage.get(eclass, ()))
 
         unused = set(pkg.inherit) - used.keys() - set(assigned_vars.values()) 
- weak_used_eclasses
         # remove eclasses that use implicit phase functions

diff --git 
a/testdata/repos/eclass/InheritsCheck/UnusedInherits/UnusedInherits-2.ebuild 
b/testdata/repos/eclass/InheritsCheck/UnusedInherits/UnusedInherits-2.ebuild
new file mode 100644
index 00000000..320a61bd
--- /dev/null
+++ b/testdata/repos/eclass/InheritsCheck/UnusedInherits/UnusedInherits-2.ebuild
@@ -0,0 +1,8 @@
+EAPI=8
+
+inherit elisp readme.gentoo-r1
+
+DESCRIPTION="Ebuild with weak usage inheritance"
+HOMEPAGE="https://github.com/pkgcore/pkgcheck";
+SLOT="0"
+LICENSE="BSD"

diff --git a/testdata/repos/eclass/eclass/elisp.eclass 
b/testdata/repos/eclass/eclass/elisp.eclass
new file mode 100644
index 00000000..e72964ea
--- /dev/null
+++ b/testdata/repos/eclass/eclass/elisp.eclass
@@ -0,0 +1,13 @@
+# @ECLASS: elisp.eclass
+# @MAINTAINER:
+# Random Person <maintainer@random.email>
+# @SUPPORTED_EAPIS: 8
+# @BLURB: Stub eclass for testing the UnusedInherit result.
+
+EXPORT_FUNCTIONS src_prepare
+
+# @FUNCTION: elisp_src_prepare
+# @USAGE:
+# @DESCRIPTION:
+# Public src_prepare stub function.
+elisp_src_prepare() { :; }

diff --git a/testdata/repos/eclass/eclass/readme.gentoo-r1.eclass 
b/testdata/repos/eclass/eclass/readme.gentoo-r1.eclass
new file mode 100644
index 00000000..c7f61a09
--- /dev/null
+++ b/testdata/repos/eclass/eclass/readme.gentoo-r1.eclass
@@ -0,0 +1,11 @@
+# @ECLASS: readme.gentoo-r1.eclass
+# @MAINTAINER:
+# Random Person <maintainer@random.email>
+# @SUPPORTED_EAPIS: 8
+# @BLURB: Stub eclass for testing the UnusedInherit result.
+
+# @FUNCTION: readme.gentoo_create_doc
+# @USAGE:
+# @DESCRIPTION:
+# stub function
+readme.gentoo_create_doc() { :; }

Reply via email to