Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 36 additions & 1 deletion src/pkgcheck/checks/eclass.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,18 @@ def desc(self):
return f"uses deprecated variable on line {self.lineno}: {self.variable} ({replacement})"


class EclassUserVariableUsage(results.LineResult, results.Warning):
"""Package uses a user variable from an eclass."""

def __init__(self, eclass, **kwargs):
super().__init__(**kwargs)
self.eclass = eclass

@property
def desc(self):
return f"line {self.lineno}: uses user variable {self.line!r} from eclass {self.eclass!r}"


class DeprecatedEclassFunction(results.LineResult, results.Warning):
"""Package uses a deprecated function from an eclass."""

Expand Down Expand Up @@ -125,6 +137,7 @@ class EclassUsageCheck(Check):
DeprecatedEclassVariable,
DeprecatedEclassFunction,
DuplicateEclassInherit,
EclassUserVariableUsage,
MisplacedEclassVar,
ProvidedEclassInherit,
}
Expand Down Expand Up @@ -156,6 +169,27 @@ def check_pre_inherits(self, pkg, inherits: list[tuple[list[str], int]]):
line = pkg.node_str(node)
yield MisplacedEclassVar(var_name, line=line, lineno=lineno + 1, pkg=pkg)

def check_user_variables(self, pkg: bash.ParseTree, inherits: list[tuple[list[str], int]]):
"""Check for usage of @USER_VARIABLE variables."""
# determine if any inherited eclasses have @USER_VARIABLE variables
user_variables = {
var.name: eclass
for eclasses, _ in inherits
for eclass in eclasses
for var in self.eclass_cache[eclass].variables
if var.user_variable
}

# scan for usage of @USER_VARIABLE variables
if user_variables:
for node, _ in bash.var_assign_query.captures(pkg.tree.root_node):
var_name = pkg.node_str(node.child_by_field_name("name"))
if var_name in user_variables:
lineno, _colno = node.start_point
yield EclassUserVariableUsage(
user_variables[var_name], line=var_name, lineno=lineno + 1, pkg=pkg
)

def check_deprecated_variables(self, pkg, inherits: list[tuple[list[str], int]]):
"""Check for usage of @DEPRECATED variables."""
# determine if any inherited eclasses have @DEPRECATED variables
Expand Down Expand Up @@ -220,7 +254,7 @@ def check_provided_eclasses(self, pkg, inherits: list[tuple[list[str], int]]):

def feed(self, pkg):
if pkg.inherit:
inherited = set()
inherited: set[str] = set()
inherits: list[tuple[list[str], int]] = []
for node, _ in bash.cmd_query.captures(pkg.tree.root_node):
name = pkg.node_str(node.child_by_field_name("name"))
Expand All @@ -241,6 +275,7 @@ def feed(self, pkg):
)

yield from self.check_provided_eclasses(pkg, inherits)
yield from self.check_user_variables(pkg, inherits)
# verify @PRE_INHERIT variable placement
yield from self.check_pre_inherits(pkg, inherits)
# verify @DEPRECATED variables or functions
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"__class__": "EclassUserVariableUsage", "category": "EclassUsageCheck", "package": "EclassUserVariableUsage", "version": "0", "line": "EBZR_STORE_DIR", "lineno": 8, "eclass": "unquotedvariable"}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
EAPI=8
inherit unquotedvariable
DESCRIPTION="Ebuild with user variable override"
HOMEPAGE="https://github.com/pkgcore/pkgcheck"
SLOT="0"
LICENSE="BSD"

EBZR_STORE_DIR="/var/tmp/portage" # FAIL

src_prepare() {
echo "${EBZR_STORE_DIR}" # ok
}