From de72643aa82ca11b7fe5bcf6d03553ccc58ae275 Mon Sep 17 00:00:00 2001 From: Sven Date: Fri, 18 Oct 2024 07:58:33 +0200 Subject: [PATCH] Use corepack to run package managers so its possible to use interactive processes --- .../javascript/subsystems/nodejs_tool.py | 7 ++++--- .../javascript/subsystems/nodejs_tool_test.py | 18 +++++++++++++----- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/python/pants/backend/javascript/subsystems/nodejs_tool.py b/src/python/pants/backend/javascript/subsystems/nodejs_tool.py index b984f721bb2..f6a10eb51c1 100644 --- a/src/python/pants/backend/javascript/subsystems/nodejs_tool.py +++ b/src/python/pants/backend/javascript/subsystems/nodejs_tool.py @@ -14,7 +14,7 @@ from pants.backend.javascript.nodejs_project_environment import NodeJsProjectEnvironmentProcess from pants.backend.javascript.package_manager import PackageManager from pants.backend.javascript.resolve import FirstPartyNodePackageResolves, NodeJSProjectResolves -from pants.backend.javascript.subsystems.nodejs import NodeJS, NodeJSToolProcess +from pants.backend.javascript.subsystems.nodejs import NodeJS, NodeJSProcessEnvironment, NodeJSToolProcess from pants.engine.internals.native_engine import Digest, MergeDigests from pants.engine.internals.selectors import Get from pants.engine.process import Process @@ -98,6 +98,7 @@ class NodeJSToolRequest: async def _run_tool_without_resolve(request: NodeJSToolRequest) -> Process: nodejs = await Get(NodeJS) + env = await Get(NodeJSProcessEnvironment) pkg_manager_version = nodejs.package_managers.get(nodejs.package_manager) pkg_manager_and_version = nodejs.default_package_manager @@ -118,9 +119,9 @@ async def _run_tool_without_resolve(request: NodeJSToolRequest) -> Process: return await Get( Process, NodeJSToolProcess( - pkg_manager.name, + env.binaries.binary_dir + "/corepack", pkg_manager.version, - args=(*pkg_manager.download_and_execute_args, request.tool, *request.args), + args=(pkg_manager.name, *pkg_manager.download_and_execute_args, request.tool, *request.args), description=request.description, input_digest=request.input_digest, output_files=request.output_files, diff --git a/src/python/pants/backend/javascript/subsystems/nodejs_tool_test.py b/src/python/pants/backend/javascript/subsystems/nodejs_tool_test.py index 7d48994925f..403439de538 100644 --- a/src/python/pants/backend/javascript/subsystems/nodejs_tool_test.py +++ b/src/python/pants/backend/javascript/subsystems/nodejs_tool_test.py @@ -13,8 +13,8 @@ from pants.backend.javascript.subsystems import nodejs_tool from pants.backend.javascript.subsystems.nodejs_tool import NodeJSToolBase, NodeJSToolRequest from pants.engine.internals.native_engine import EMPTY_DIGEST -from pants.engine.process import Process, ProcessResult -from pants.testutil.rule_runner import QueryRule, RuleRunner +from pants.engine.process import InteractiveProcess, InteractiveProcessResult, Process, ProcessResult +from pants.testutil.rule_runner import QueryRule, RuleRunner, mock_console from pants.util.logging import LogLevel @@ -74,7 +74,15 @@ def test_execute_process_with_package_manager( to_run = rule_runner.request(Process, [request]) - assert to_run.argv == expected_argv + ("cowsay@1.6.0", "--version") + ip = InteractiveProcess.from_process(to_run) + with mock_console(rule_runner.options_bootstrapper) as mocked_console: + interactive_result = rule_runner.run_interactive_process(ip) + assert interactive_result.exit_code == 0, mocked_console[ + 1 + ].get_stderr() + + # Remove the corepack binary path from argv. + assert to_run.argv[1:] == expected_argv + ("cowsay@1.6.0", "--version") result = rule_runner.request(ProcessResult, [request]) @@ -85,8 +93,8 @@ def test_execute_process_with_package_manager( "package_manager, version", [ pytest.param("yarn", "1.22.22", id="yarn"), - pytest.param("npm", "10.8.2", id="npm"), - pytest.param("pnpm", "9.5.0", id="pnpm"), + pytest.param("npm", "10.9.0", id="npm"), + pytest.param("pnpm", "9.12.1", id="pnpm"), ], ) def test_execute_process_with_package_manager_version_from_configuration(