From df99123d2054bc7656728557b8e256d281c0495d Mon Sep 17 00:00:00 2001 From: Tom Dyas Date: Fri, 12 Nov 2021 15:41:10 -0500 Subject: [PATCH 1/2] repl: pass digest thru + append_only_caches / run_in_workspace [ci skip-build-wheels] --- src/python/pants/backend/python/goals/repl.py | 4 ++-- src/python/pants/core/goals/repl.py | 12 +++++++++++- src/python/pants/core/goals/repl_test.py | 6 +++++- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/python/pants/backend/python/goals/repl.py b/src/python/pants/backend/python/goals/repl.py index 4bbd5727491..9bc8c2479bf 100644 --- a/src/python/pants/backend/python/goals/repl.py +++ b/src/python/pants/backend/python/goals/repl.py @@ -71,7 +71,7 @@ async def create_python_repl_request(repl: PythonRepl, pex_env: PexEnvironment) "PEX_PATH": repl.in_chroot(local_dists.pex.name), } - return ReplRequest(digest=merged_digest, args=args, extra_env=extra_env) + return ReplRequest(digest=merged_digest, args=args, extra_env=extra_env, run_in_workspace=False) class IPythonRepl(ReplImplementation): @@ -148,7 +148,7 @@ async def create_ipython_repl_request( "PEX_EXTRA_SYS_PATH": os.pathsep.join(chrooted_source_roots), } - return ReplRequest(digest=merged_digest, args=args, extra_env=extra_env) + return ReplRequest(digest=merged_digest, args=args, extra_env=extra_env, run_in_workspace=False) def rules(): diff --git a/src/python/pants/core/goals/repl.py b/src/python/pants/core/goals/repl.py index 365e9297f79..058f0a9f324 100644 --- a/src/python/pants/core/goals/repl.py +++ b/src/python/pants/core/goals/repl.py @@ -1,5 +1,7 @@ # Copyright 2020 Pants project contributors (see CONTRIBUTORS.md). # Licensed under the Apache License, Version 2.0 (see LICENSE). +from __future__ import annotations + import os from abc import ABC from dataclasses import dataclass @@ -79,6 +81,8 @@ class ReplRequest: digest: Digest args: Tuple[str, ...] extra_env: FrozenDict[str, str] + append_only_caches: FrozenDict[str, str] + run_in_workspace: bool def __init__( self, @@ -86,10 +90,14 @@ def __init__( digest: Digest, args: Iterable[str], extra_env: Optional[Mapping[str, str]] = None, + append_only_caches: Mapping[str, str] | None = None, + run_in_workspace: bool = True, ) -> None: self.digest = digest self.args = tuple(args) self.extra_env = FrozenDict(extra_env or {}) + self.append_only_caches = FrozenDict(append_only_caches or {}) + self.run_in_workspace = run_in_workspace @goal_rule @@ -139,8 +147,10 @@ async def run_repl( InteractiveProcess( argv=request.args, env=env, - run_in_workspace=True, + input_digest=request.digest, + run_in_workspace=request.run_in_workspace, restartable=repl_subsystem.restartable, + append_only_caches=request.append_only_caches, ), ) return Repl(result.exit_code) diff --git a/src/python/pants/core/goals/repl_test.py b/src/python/pants/core/goals/repl_test.py index 364b1662b51..a00bc67908d 100644 --- a/src/python/pants/core/goals/repl_test.py +++ b/src/python/pants/core/goals/repl_test.py @@ -18,7 +18,11 @@ class MockRepl(ReplImplementation): @rule async def create_mock_repl_request(repl: MockRepl) -> ReplRequest: digest = await Get(Digest, CreateDigest([FileContent("repl.sh", b"exit 0")])) - return ReplRequest(digest=digest, args=("/bin/bash", repl.in_chroot("repl.sh"))) + return ReplRequest( + digest=digest, + args=("/bin/bash", "repl.sh"), + run_in_workspace=False, + ) @pytest.fixture From 4c33cb836519e591162cad56c3e1e88ca6d4ddb8 Mon Sep 17 00:00:00 2001 From: Tom Dyas Date: Fri, 19 Nov 2021 23:04:34 -0500 Subject: [PATCH 2/2] don't pass input_digest to InteractiveProcess if run_in_workspace=True [ci skip-rust] [ci skip-build-wheels] --- src/python/pants/backend/python/goals/repl.py | 4 ++-- src/python/pants/core/goals/repl.py | 21 ++++++++++++------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/python/pants/backend/python/goals/repl.py b/src/python/pants/backend/python/goals/repl.py index 9bc8c2479bf..4bbd5727491 100644 --- a/src/python/pants/backend/python/goals/repl.py +++ b/src/python/pants/backend/python/goals/repl.py @@ -71,7 +71,7 @@ async def create_python_repl_request(repl: PythonRepl, pex_env: PexEnvironment) "PEX_PATH": repl.in_chroot(local_dists.pex.name), } - return ReplRequest(digest=merged_digest, args=args, extra_env=extra_env, run_in_workspace=False) + return ReplRequest(digest=merged_digest, args=args, extra_env=extra_env) class IPythonRepl(ReplImplementation): @@ -148,7 +148,7 @@ async def create_ipython_repl_request( "PEX_EXTRA_SYS_PATH": os.pathsep.join(chrooted_source_roots), } - return ReplRequest(digest=merged_digest, args=args, extra_env=extra_env, run_in_workspace=False) + return ReplRequest(digest=merged_digest, args=args, extra_env=extra_env) def rules(): diff --git a/src/python/pants/core/goals/repl.py b/src/python/pants/core/goals/repl.py index 058f0a9f324..62b92dd1e23 100644 --- a/src/python/pants/core/goals/repl.py +++ b/src/python/pants/core/goals/repl.py @@ -14,6 +14,7 @@ from pants.engine.environment import CompleteEnvironment from pants.engine.fs import Digest, Workspace from pants.engine.goal import Goal, GoalSubsystem +from pants.engine.internals.native_engine import EMPTY_DIGEST from pants.engine.process import InteractiveProcess, InteractiveProcessResult from pants.engine.rules import Effect, Get, collect_rules, goal_rule from pants.engine.target import Targets, TransitiveTargets, TransitiveTargetsRequest @@ -134,20 +135,24 @@ async def run_repl( ) request = await Get(ReplRequest, ReplImplementation, repl_impl) - workspace.write_digest( - request.digest, - path_prefix=PurePath(tmpdir).relative_to(build_root.path).as_posix(), - # We don't want to influence whether the InteractiveProcess is able to restart. Because - # we're writing into a temp directory, we can safely mark this side_effecting=False. - side_effecting=False, - ) + input_digest = request.digest + if request.run_in_workspace: + workspace.write_digest( + request.digest, + path_prefix=PurePath(tmpdir).relative_to(build_root.path).as_posix(), + # We don't want to influence whether the InteractiveProcess is able to restart. Because + # we're writing into a temp directory, we can safely mark this side_effecting=False. + side_effecting=False, + ) + input_digest = EMPTY_DIGEST + env = {**complete_env, **request.extra_env} result = await Effect( InteractiveProcessResult, InteractiveProcess( argv=request.args, env=env, - input_digest=request.digest, + input_digest=input_digest, run_in_workspace=request.run_in_workspace, restartable=repl_subsystem.restartable, append_only_caches=request.append_only_caches,