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 (:=)

Reply via email to