Skip to content

Commit

Permalink
Use corepack to run package managers so its possible to use interacti…
Browse files Browse the repository at this point in the history
…ve processes
  • Loading branch information
SvenW committed Nov 6, 2024
1 parent 92ea576 commit de72643
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 8 deletions.
7 changes: 4 additions & 3 deletions src/python/pants/backend/javascript/subsystems/nodejs_tool.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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,
Expand Down
18 changes: 13 additions & 5 deletions src/python/pants/backend/javascript/subsystems/nodejs_tool_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand Down Expand Up @@ -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])

Expand All @@ -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(
Expand Down

0 comments on commit de72643

Please sign in to comment.