public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-commits] proj/pkgcore/pkgcheck:master commit in: testdata/data/repos/standalone/MetadataVarCheck/SelfAssignment/, ...
@ 2023-09-23 15:10 Arthur Zamarin
  0 siblings, 0 replies; 2+ messages in thread
From: Arthur Zamarin @ 2023-09-23 15:10 UTC (permalink / raw
  To: gentoo-commits

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


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* [gentoo-commits] proj/pkgcore/pkgcheck:master commit in: testdata/data/repos/standalone/MetadataVarCheck/SelfAssignment/, ...
@ 2023-10-02 18:39 Arthur Zamarin
  0 siblings, 0 replies; 2+ messages in thread
From: Arthur Zamarin @ 2023-10-02 18:39 UTC (permalink / raw
  To: gentoo-commits

commit:     9e7637d22b0ddb1b701073dae2a7a47c0d6ec74b
Author:     Arthur Zamarin <arthurzam <AT> gentoo <DOT> org>
AuthorDate: Mon Oct  2 17:52:36 2023 +0000
Commit:     Arthur Zamarin <arthurzam <AT> gentoo <DOT> org>
CommitDate: Mon Oct  2 18:38:53 2023 +0000
URL:        https://gitweb.gentoo.org/proj/pkgcore/pkgcheck.git/commit/?id=9e7637d2

SelfAssignment: fix with new tree-sitter-bash

Signed-off-by: Arthur Zamarin <arthurzam <AT> gentoo.org>

 src/pkgcheck/checks/codingstyle.py                                 | 7 +++++--
 .../repos/standalone/MetadataVarCheck/SelfAssignment/expected.json | 2 ++
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/src/pkgcheck/checks/codingstyle.py b/src/pkgcheck/checks/codingstyle.py
index 317841bc..20d668f8 100644
--- a/src/pkgcheck/checks/codingstyle.py
+++ b/src/pkgcheck/checks/codingstyle.py
@@ -682,12 +682,15 @@ class MetadataVarCheck(Check):
         for static_str, replacement in static_urls.items():
             yield StaticSrcUri(static_str, replacement=replacement, pkg=pkg)
 
+    def canonicalize_assign(self, value: str):
+        return value.strip("\"'").replace("\n", "").replace("\t", " ")
+
     def feed(self, pkg):
         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 = node.child_by_field_name("value")
-            value_str = pkg.node_str(value_node).strip("\"'") if value_node else ""
+            value_str = self.canonicalize_assign(pkg.node_str(value_node)) if value_node else ""
             if name in pkg.eapi.eclass_keys:
                 if not value_str:
                     lineno, _ = node.start_point
@@ -696,7 +699,7 @@ class MetadataVarCheck(Check):
                     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 self.canonicalize_assign(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", " ")

diff --git a/testdata/data/repos/standalone/MetadataVarCheck/SelfAssignment/expected.json b/testdata/data/repos/standalone/MetadataVarCheck/SelfAssignment/expected.json
index 314daa7f..e7717502 100644
--- a/testdata/data/repos/standalone/MetadataVarCheck/SelfAssignment/expected.json
+++ b/testdata/data/repos/standalone/MetadataVarCheck/SelfAssignment/expected.json
@@ -2,4 +2,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": 10}
 {"__class__": "SelfAssignment", "category": "MetadataVarCheck", "package": "SelfAssignment", "version": "0", "line": "RDEPEND=\" ${RDEPEND}\"", "lineno": 12}
+{"__class__": "SelfAssignment", "category": "MetadataVarCheck", "package": "SelfAssignment", "version": "0", "line": "RDEPEND=\" ${RDEPEND}\"", "lineno": 14}


^ permalink raw reply related	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2023-10-02 18:39 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-10-02 18:39 [gentoo-commits] proj/pkgcore/pkgcheck:master commit in: testdata/data/repos/standalone/MetadataVarCheck/SelfAssignment/, Arthur Zamarin
  -- strict thread matches above, loose matches on Subject: below --
2023-09-23 15:10 Arthur Zamarin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox