public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-commits] proj/pkgcore/pkgcheck:master commit in: testdata/repos/standalone/EbuildReservedCheck/EbuildReservedName/, ...
@ 2022-10-05 16:42 Arthur Zamarin
  0 siblings, 0 replies; only message in thread
From: Arthur Zamarin @ 2022-10-05 16:42 UTC (permalink / raw
  To: gentoo-commits

commit:     189883497abaee3708e9348df93800cc4c24fb07
Author:     Arthur Zamarin <arthurzam <AT> gentoo <DOT> org>
AuthorDate: Wed Oct  5 11:43:57 2022 +0000
Commit:     Arthur Zamarin <arthurzam <AT> gentoo <DOT> org>
CommitDate: Wed Oct  5 11:43:57 2022 +0000
URL:        https://gitweb.gentoo.org/proj/pkgcore/pkgcheck.git/commit/?id=18988349

EbuildReservedCheck: catch declaration of phase hooks

Phase hooks (`{pre,post}_${phase}`) are used by portage to run user's
hooks defined at `bashrc` file. Defining them in ebuilds might cause
unexpected behavior, so we should warn about it.

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

 src/pkgcheck/checks/reserved.py                    | 36 ++++++++++++++++------
 .../EbuildReservedName/expected.json               | 12 +++++---
 .../EbuildReservedName/fix.patch                   | 15 +++++++--
 .../EbuildReservedName/EbuildReservedName-0.ebuild |  8 +++++
 4 files changed, 54 insertions(+), 17 deletions(-)

diff --git a/src/pkgcheck/checks/reserved.py b/src/pkgcheck/checks/reserved.py
index 72b5300f..8448179a 100644
--- a/src/pkgcheck/checks/reserved.py
+++ b/src/pkgcheck/checks/reserved.py
@@ -1,4 +1,7 @@
 import re
+
+from pkgcore.ebuild.eapi import EAPI
+
 from .. import addons, bash, results, sources
 from . import Check
 
@@ -15,19 +18,18 @@ class _ReservedNameCheck(Check):
     variables_usage_whitelist = {"EBUILD_PHASE", "EBUILD_PHASE_FUNC"}
 
     def _check(self, used_type: str, used_names):
-        for used_name, node_start in used_names.items():
+        for used_name, (lineno, _) in used_names.items():
             if used_name in self.special_whitelist:
                 continue
             test_name = used_name.lower()
-            lineno, _ = node_start
             for reserved in self.reserved_prefixes:
                 if test_name.startswith(reserved):
-                    yield used_name, used_type, reserved, 'prefix', lineno
+                    yield used_name, used_type, reserved, 'prefix', lineno+1
             for reserved in self.reserved_substrings:
                 if reserved in test_name:
-                    yield used_name, used_type, reserved, 'substring', lineno
+                    yield used_name, used_type, reserved, 'substring', lineno+1
             if self.reserved_ebuild_regex.match(test_name):
-                yield used_name, used_type, 'ebuild', 'substring', lineno
+                yield used_name, used_type, 'ebuild', 'substring', lineno+1
 
     def _feed(self, item):
         yield from self._check('function', {
@@ -78,16 +80,15 @@ class EclassReservedCheck(_ReservedNameCheck):
 class EbuildReservedName(results.LineResult, results.Warning):
     """Ebuild uses reserved variable or function name for package manager."""
 
-    def __init__(self, used_name: str, used_type: str, reserved_word: str, reserved_type: str, **kwargs):
+    def __init__(self, used_type: str, reserved_word: str, reserved_type: str, **kwargs):
         super().__init__(**kwargs)
-        self.used_name = used_name
         self.used_type = used_type
         self.reserved_word = reserved_word
         self.reserved_type = reserved_type
 
     @property
     def desc(self):
-        return f'line {self.lineno}: {self.used_type} name "{self.used_name}" is disallowed because "{self.reserved_word}" is a reserved {self.reserved_type}'
+        return f'line {self.lineno}: {self.used_type} name "{self.line}" is disallowed because "{self.reserved_word}" is a reserved {self.reserved_type}'
 
 
 class EbuildReservedCheck(_ReservedNameCheck):
@@ -96,6 +97,21 @@ class EbuildReservedCheck(_ReservedNameCheck):
     _source = sources.EbuildParseRepoSource
     known_results = frozenset([EbuildReservedName])
 
+    def __init__(self, options, **kwargs):
+        super().__init__(options, **kwargs)
+        self.phases_hooks = {
+            eapi_name: {
+                f'{prefix}_{phase}' for phase in eapi.phases.values() for prefix in ('pre', 'post')
+            }
+            for eapi_name, eapi in EAPI.known_eapis.items()
+        }
+
     def feed(self, pkg):
-        for *args, lineno in self._feed(pkg):
-            yield EbuildReservedName(*args, lineno=lineno, line='', pkg=pkg)
+        for used_name, *args, lineno in self._feed(pkg):
+            yield EbuildReservedName(*args, lineno=lineno, line=used_name, pkg=pkg)
+
+        for node, _ in bash.func_query.captures(pkg.tree.root_node):
+            used_name = pkg.node_str(node.child_by_field_name('name'))
+            if used_name in self.phases_hooks[str(pkg.eapi)]:
+                lineno, _ = node.start_point
+                yield EbuildReservedName('function', used_name, 'phase hook', lineno=lineno+1, line=used_name, pkg=pkg)

diff --git a/testdata/data/repos/standalone/EbuildReservedCheck/EbuildReservedName/expected.json b/testdata/data/repos/standalone/EbuildReservedCheck/EbuildReservedName/expected.json
index 1dd73cac..9fbd6727 100644
--- a/testdata/data/repos/standalone/EbuildReservedCheck/EbuildReservedName/expected.json
+++ b/testdata/data/repos/standalone/EbuildReservedCheck/EbuildReservedName/expected.json
@@ -1,5 +1,7 @@
-{"__class__": "EbuildReservedName", "category": "EbuildReservedCheck", "package": "EbuildReservedName", "version": "0", "used_name": "prepare_locale", "used_type": "function", "reserved_word": "prep", "reserved_type": "prefix", "lineno": 5, "line": ""}
-{"__class__": "EbuildReservedName", "category": "EbuildReservedCheck", "package": "EbuildReservedName", "version": "0", "used_name": "DYNAMIC_DEPS", "used_type": "variable", "reserved_word": "dyn", "reserved_type": "prefix", "lineno": 6, "line": ""}
-{"__class__": "EbuildReservedName", "category": "EbuildReservedCheck", "package": "EbuildReservedName", "version": "0", "used_name": "_hook_prepare", "used_type": "variable", "reserved_word": "hook", "reserved_type": "substring", "lineno": 7, "line": ""}
-{"__class__": "EbuildReservedName", "category": "EbuildReservedCheck", "package": "EbuildReservedName", "version": "0", "used_name": "__ORIG_CC", "used_type": "variable", "reserved_word": "__", "reserved_type": "prefix", "lineno": 10, "line": ""}
-{"__class__": "EbuildReservedName", "category": "EbuildReservedCheck", "package": "EbuildReservedName", "version": "0", "used_name": "EBUILD_TEST", "used_type": "variable", "reserved_word": "ebuild", "reserved_type": "substring", "lineno": 12, "line": ""}
+{"__class__": "EbuildReservedName", "category": "EbuildReservedCheck", "package": "EbuildReservedName", "version": "0", "line": "prepare_locale", "lineno": 6, "used_type": "function", "reserved_word": "prep", "reserved_type": "prefix"}
+{"__class__": "EbuildReservedName", "category": "EbuildReservedCheck", "package": "EbuildReservedName", "version": "0", "line": "DYNAMIC_DEPS", "lineno": 7, "used_type": "variable", "reserved_word": "dyn", "reserved_type": "prefix"}
+{"__class__": "EbuildReservedName", "category": "EbuildReservedCheck", "package": "EbuildReservedName", "version": "0", "line": "_hook_prepare", "lineno": 8, "used_type": "variable", "reserved_word": "hook", "reserved_type": "substring"}
+{"__class__": "EbuildReservedName", "category": "EbuildReservedCheck", "package": "EbuildReservedName", "version": "0", "line": "__ORIG_CC", "lineno": 11, "used_type": "variable", "reserved_word": "__", "reserved_type": "prefix"}
+{"__class__": "EbuildReservedName", "category": "EbuildReservedCheck", "package": "EbuildReservedName", "version": "0", "line": "EBUILD_TEST", "lineno": 13, "used_type": "variable", "reserved_word": "ebuild", "reserved_type": "substring"}
+{"__class__": "EbuildReservedName", "category": "EbuildReservedCheck", "package": "EbuildReservedName", "version": "0", "line": "post_src_unpack", "lineno": 16, "used_type": "function", "reserved_word": "post_src_unpack", "reserved_type": "phase hook"}
+{"__class__": "EbuildReservedName", "category": "EbuildReservedCheck", "package": "EbuildReservedName", "version": "0", "line": "pre_src_test", "lineno": 20, "used_type": "function", "reserved_word": "pre_src_test", "reserved_type": "phase hook"}

diff --git a/testdata/data/repos/standalone/EbuildReservedCheck/EbuildReservedName/fix.patch b/testdata/data/repos/standalone/EbuildReservedCheck/EbuildReservedName/fix.patch
index 146e025e..3ce2b36a 100644
--- a/testdata/data/repos/standalone/EbuildReservedCheck/EbuildReservedName/fix.patch
+++ b/testdata/data/repos/standalone/EbuildReservedCheck/EbuildReservedName/fix.patch
@@ -1,6 +1,7 @@
+diff -Naur standalone/EbuildReservedCheck/EbuildReservedName/EbuildReservedName-0.ebuild fixed/EbuildReservedCheck/EbuildReservedName/EbuildReservedName-0.ebuild
 --- standalone/EbuildReservedCheck/EbuildReservedName/EbuildReservedName-0.ebuild
-+++ standalone/EbuildReservedCheck/EbuildReservedName/EbuildReservedName-0.ebuild
-@@ -3,12 +3,11 @@ HOMEPAGE="https://github.com/pkgcore/pkgcheck"
++++ fixed/EbuildReservedCheck/EbuildReservedName/EbuildReservedName-0.ebuild
+@@ -3,20 +3,19 @@ HOMEPAGE="https://github.com/pkgcore/pkgcheck"
  SLOT="0"
  LICENSE="BSD"
 
@@ -17,3 +18,13 @@
  EBUILD_SUCCESS_HOOKS="true"
 -EBUILD_TEST="1"
  REBUILD_ALL="1"
+
+-post_src_unpack() {
++my_post_src_unpack() {
+ 	echo "Larry was here"
+ }
+
+-pre_src_test() {
++my_pre_src_test() {
+ 	echo "Larry was even here"
+ }

diff --git a/testdata/repos/standalone/EbuildReservedCheck/EbuildReservedName/EbuildReservedName-0.ebuild b/testdata/repos/standalone/EbuildReservedCheck/EbuildReservedName/EbuildReservedName-0.ebuild
index 420f4dac..a0c8e201 100644
--- a/testdata/repos/standalone/EbuildReservedCheck/EbuildReservedName/EbuildReservedName-0.ebuild
+++ b/testdata/repos/standalone/EbuildReservedCheck/EbuildReservedName/EbuildReservedName-0.ebuild
@@ -12,3 +12,11 @@ __ORIG_CC="STUB"
 EBUILD_SUCCESS_HOOKS="true"
 EBUILD_TEST="1"
 REBUILD_ALL="1"
+
+post_src_unpack() {
+	echo "Larry was here"
+}
+
+pre_src_test() {
+	echo "Larry was even here"
+}


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2022-10-05 16:42 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-10-05 16:42 [gentoo-commits] proj/pkgcore/pkgcheck:master commit in: testdata/repos/standalone/EbuildReservedCheck/EbuildReservedName/, Arthur Zamarin

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