commit: 3fcc1f919251c10c1f1ea105f776d7e9c6f5e18e Author: Arthur Zamarin <arthurzam <AT> gentoo <DOT> org> AuthorDate: Fri Sep 22 09:12:27 2023 +0000 Commit: Arthur Zamarin <arthurzam <AT> gentoo <DOT> org> CommitDate: Sat Sep 23 15:12:43 2023 +0000 URL: https://gitweb.gentoo.org/proj/pkgcore/pkgcheck.git/commit/?id=3fcc1f91
BannedPhaseCall: detect calls of phase functions directly Resolves: https://github.com/pkgcore/pkgcheck/issues/625 Closes: https://bugs.gentoo.org/596616 Signed-off-by: Arthur Zamarin <arthurzam <AT> gentoo.org> src/pkgcheck/checks/codingstyle.py | 12 +++++++++++- .../BadCommandsCheck/BannedPhaseCall/expected.json | 1 + .../BannedPhaseCall/BannedPhaseCall-0.ebuild | 14 ++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/pkgcheck/checks/codingstyle.py b/src/pkgcheck/checks/codingstyle.py index ad75436b..1838be28 100644 --- a/src/pkgcheck/checks/codingstyle.py +++ b/src/pkgcheck/checks/codingstyle.py @@ -61,11 +61,19 @@ class BannedEapiCommand(_EapiCommandResult, results.Error): _status = "banned" +class BannedPhaseCall(results.Error, results.LineResult): + """Ebuild calls a phase function directly.""" + + @property + def desc(self): + return f"line {self.lineno}: calling phase function {self.line!r} directly is invalid" + + class BadCommandsCheck(Check): """Scan ebuild for various deprecated and banned command usage.""" _source = sources.EbuildParseRepoSource - known_results = frozenset([DeprecatedEapiCommand, BannedEapiCommand]) + known_results = frozenset({DeprecatedEapiCommand, BannedEapiCommand, BannedPhaseCall}) def feed(self, pkg): for func_node, _ in bash.func_query.captures(pkg.tree.root_node): @@ -81,6 +89,8 @@ class BadCommandsCheck(Check): yield DeprecatedEapiCommand( name, line=call, lineno=lineno + 1, eapi=pkg.eapi, pkg=pkg ) + elif name in pkg.eapi.phases.values(): + yield BannedPhaseCall(line=name, lineno=lineno + 1, pkg=pkg) class EendMissingArg(results.LineResult, results.Warning): diff --git a/testdata/data/repos/standalone/BadCommandsCheck/BannedPhaseCall/expected.json b/testdata/data/repos/standalone/BadCommandsCheck/BannedPhaseCall/expected.json new file mode 100644 index 00000000..cf55baad --- /dev/null +++ b/testdata/data/repos/standalone/BadCommandsCheck/BannedPhaseCall/expected.json @@ -0,0 +1 @@ +{"__class__": "BannedPhaseCall", "category": "BadCommandsCheck", "package": "BannedPhaseCall", "version": "0", "line": "pkg_postinst", "lineno": 13} diff --git a/testdata/repos/standalone/BadCommandsCheck/BannedPhaseCall/BannedPhaseCall-0.ebuild b/testdata/repos/standalone/BadCommandsCheck/BannedPhaseCall/BannedPhaseCall-0.ebuild new file mode 100644 index 00000000..c7177c07 --- /dev/null +++ b/testdata/repos/standalone/BadCommandsCheck/BannedPhaseCall/BannedPhaseCall-0.ebuild @@ -0,0 +1,14 @@ +EAPI=8 + +DESCRIPTION="Ebuild calls phase function directly" +HOMEPAGE="https://github.com/pkgcore/pkgcheck" +SLOT="0" +LICENSE="BSD" + +pkg_postinst() { + echo "something" +} + +pkg_postrm() { + pkg_postinst +}
