Skip to content

Commit ecaf9a2

Browse files
committed
UnusedInherits: fix false positives with indirect usage
Resolves: #355 Resolves: #527 Signed-off-by: Arthur Zamarin <arthurzam@gentoo.org>
1 parent 0e22d6f commit ecaf9a2

2 files changed

Lines changed: 25 additions & 1 deletion

File tree

src/pkgcheck/checks/codingstyle.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -796,6 +796,8 @@ def feed(self, pkg):
796796
if eclass := self.get_eclass(name, pkg):
797797
assigned_vars[name] = eclass
798798

799+
# eclasses which might be used indirectly, so we won't trigger UnusedInherits
800+
weak_used_eclasses = set()
799801
# match captured commands with eclasses
800802
used = defaultdict(list)
801803
for node, _ in bash.cmd_query.captures(pkg.tree.root_node):
@@ -806,13 +808,19 @@ def feed(self, pkg):
806808
eclasses = call.split()[1:]
807809
if not pkg.inherited.intersection(eclasses):
808810
conditional.update(eclasses)
811+
continue
809812
# Also ignore vars since any used in arithmetic expansions, i.e.
810813
# $((...)), are captured as commands.
811814
elif name not in self.eapi_funcs[pkg.eapi] | assigned_vars.keys() | defined_funcs:
812815
lineno, _colno = node.start_point
813816
if eclass := self.get_eclass(name, pkg):
814817
used[eclass].append((lineno + 1, name, call.split("\n", 1)[0]))
815818

819+
for arg in node.children[1:]:
820+
arg_name = pkg.node_str(arg).strip("'\"")
821+
if eclass := self.get_eclass(arg_name, pkg):
822+
weak_used_eclasses.add(eclass)
823+
816824
# match captured variables with eclasses
817825
for node, _ in bash.var_query.captures(pkg.tree.root_node):
818826
name = pkg.node_str(node)
@@ -828,7 +836,7 @@ def feed(self, pkg):
828836
# missing inherits
829837
missing = used.keys() - pkg.inherit - indirect_allowed - conditional
830838

831-
unused = set(pkg.inherit) - used.keys() - set(assigned_vars.values())
839+
unused = set(pkg.inherit) - used.keys() - set(assigned_vars.values()) - weak_used_eclasses
832840
# remove eclasses that use implicit phase functions
833841
if unused and pkg.defined_phases:
834842
phases = [pkg.eapi.phases[x] for x in pkg.defined_phases]
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
EAPI=7
2+
3+
inherit inherit unused
4+
5+
DESCRIPTION="Ebuild using inherited function indirectly"
6+
HOMEPAGE="https://github.com/pkgcore/pkgcheck"
7+
SLOT="0"
8+
LICENSE="BSD"
9+
10+
src_prepare() {
11+
inherit_public_func
12+
}
13+
14+
src_test() {
15+
edo unused_function
16+
}

0 commit comments

Comments
 (0)