commit: c46c56e0a28742e6a530503ea839c7a4546e3e16 Author: Arthur Zamarin <arthurzam <AT> gentoo <DOT> org> AuthorDate: Sat Sep 23 11:31:36 2023 +0000 Commit: Arthur Zamarin <arthurzam <AT> gentoo <DOT> org> CommitDate: Sat Sep 23 11:31:36 2023 +0000 URL: https://gitweb.gentoo.org/proj/pkgcore/pkgcheck.git/commit/?id=c46c56e0
SelfAssignment: check for global scope self assignments Resolves: https://github.com/pkgcore/pkgcheck/issues/626 Signed-off-by: Arthur Zamarin <arthurzam <AT> gentoo.org> src/pkgcheck/checks/codingstyle.py | 29 +++++++++++++++++----- .../MetadataVarCheck/SelfAssignment/expected.json | 5 ++++ .../SelfAssignment/SelfAssignment-0.ebuild | 21 ++++++++++++++++ 3 files changed, 49 insertions(+), 6 deletions(-) diff --git a/src/pkgcheck/checks/codingstyle.py b/src/pkgcheck/checks/codingstyle.py index 6f1e3b7f..ad75436b 100644 --- a/src/pkgcheck/checks/codingstyle.py +++ b/src/pkgcheck/checks/codingstyle.py @@ -555,6 +555,14 @@ class EmptyGlobalAssignment(results.LineResult, results.Style): return f"line {self.lineno}: empty global assignment: {self.line}" +class SelfAssignment(results.LineResult, results.Warning): + """Global scope useless empty assignment.""" + + @property + def desc(self): + return f"line {self.lineno}: self assignment: {self.line}" + + def verify_vars(*variables): """Decorator to register raw variable verification methods.""" @@ -583,6 +591,7 @@ class MetadataVarCheck(Check): ReferenceInMetadataVar, MultipleKeywordsLines, EmptyGlobalAssignment, + SelfAssignment, } ) @@ -658,19 +667,27 @@ class MetadataVarCheck(Check): keywords_lines = set() for node in pkg.global_query(bash.var_assign_query): name = pkg.node_str(node.child_by_field_name("name")) - value = node.child_by_field_name("value") + value_node = node.child_by_field_name("value") + value_str = pkg.node_str(value_node).strip("\"'") if value_node else "" if name in pkg.eapi.eclass_keys: - if not value or not pkg.node_str(value).strip("\"'"): + if not value_str: lineno, _ = node.start_point yield EmptyGlobalAssignment(line=pkg.node_str(node), lineno=lineno + 1, pkg=pkg) + elif pkg.node_str(value_node.prev_sibling) == "=": + for var_node, _ in bash.var_query.captures(value_node): + if ( + pkg.node_str(var_node) == name + and pkg.node_str(var_node.parent) == value_str + and var_node.next_named_sibling is None + ): + node_str = pkg.node_str(node).replace("\n", "").replace("\t", " ") + lineno, _ = node.start_point + yield SelfAssignment(line=node_str, lineno=lineno + 1, pkg=pkg) if name in self.known_variables: - # RHS value node should be last - val_node = node.children[-1] - val_str = pkg.node_str(val_node) if name == "KEYWORDS": keywords_lines.add(node.start_point[0] + 1) keywords_lines.add(node.end_point[0] + 1) - yield from self.known_variables[name](self, name, val_node, val_str, pkg) + yield from self.known_variables[name](self, name, value_node, value_str, pkg) if len(keywords_lines) > 1: yield MultipleKeywordsLines(sorted(keywords_lines), pkg=pkg) diff --git a/testdata/data/repos/standalone/MetadataVarCheck/SelfAssignment/expected.json b/testdata/data/repos/standalone/MetadataVarCheck/SelfAssignment/expected.json new file mode 100644 index 00000000..314daa7f --- /dev/null +++ b/testdata/data/repos/standalone/MetadataVarCheck/SelfAssignment/expected.json @@ -0,0 +1,5 @@ +{"__class__": "SelfAssignment", "category": "MetadataVarCheck", "package": "SelfAssignment", "version": "0", "line": "RDEPEND=\"${RDEPEND}\"", "lineno": 6} +{"__class__": "SelfAssignment", "category": "MetadataVarCheck", "package": "SelfAssignment", "version": "0", "line": "RDEPEND=\"$RDEPEND\"", "lineno": 7} +{"__class__": "SelfAssignment", "category": "MetadataVarCheck", "package": "SelfAssignment", "version": "0", "line": "RDEPEND=${RDEPEND}", "lineno": 8} +{"__class__": "SelfAssignment", "category": "MetadataVarCheck", "package": "SelfAssignment", "version": "0", "line": "RDEPEND=$RDEPEND", "lineno": 9} +{"__class__": "SelfAssignment", "category": "MetadataVarCheck", "package": "SelfAssignment", "version": "0", "line": "RDEPEND=\" ${RDEPEND}\"", "lineno": 12} diff --git a/testdata/repos/standalone/MetadataVarCheck/SelfAssignment/SelfAssignment-0.ebuild b/testdata/repos/standalone/MetadataVarCheck/SelfAssignment/SelfAssignment-0.ebuild new file mode 100644 index 00000000..1abcf8b0 --- /dev/null +++ b/testdata/repos/standalone/MetadataVarCheck/SelfAssignment/SelfAssignment-0.ebuild @@ -0,0 +1,21 @@ +DESCRIPTION="Ebuild with various self assignments" +HOMEPAGE="https://github.com/pkgcore/pkgcheck" +SLOT="0" +LICENSE="BSD" + +RDEPEND="${RDEPEND}" # FAIL +RDEPEND="$RDEPEND" # FAIL +RDEPEND=${RDEPEND} # FAIL +RDEPEND=$RDEPEND # FAIL +RDEPEND="${RDEPEND} +" # FAIL +RDEPEND=" + ${RDEPEND}" # FAIL +RDEPEND=" + ${RDEPEND} +" # FAIL + +RDEPEND+=" ${RDEPEND}" # OK (+=) +RDEPEND="${RDEPEND} stub/stub1" # OK (something else) +RDEPEND="stub/stub1 ${RDEPEND}" # OK (something else) +RDEPEND="${RDEPEND:=stub/stub1}" # OK (:=)
