From 4c3d625816c31f5982b1b4bdc95680eb359fcb5f Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 11 Jul 2023 07:06:48 +0530 Subject: [PATCH] Remote control launch: Fix --env not implemented when using --cwd=current with the SSH kitten Fixes #6438 --- docs/changelog.rst | 2 ++ kittens/ssh/utils.py | 22 +++++++++++++++++++--- kitty/child.py | 2 +- kitty/window.py | 6 ++++-- 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 0bfc0004f29..7c089c22eda 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -40,6 +40,8 @@ Detailed list of changes - macOS: Fix a regression that caused rendering to hang when transitioning to full screen with :opt:`macos_colorspace` set to ``default`` (:iss:`6435`) +- Remote control launch: Fix ``--env`` not implemented when using ``--cwd=current`` with the SSH kitten (:iss:`6438`) + 0.29.0 [2023-07-10] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/kittens/ssh/utils.py b/kittens/ssh/utils.py index 66b58242d89..56ddf8bd778 100644 --- a/kittens/ssh/utils.py +++ b/kittens/ssh/utils.py @@ -148,9 +148,25 @@ def get_ssh_data(msg: str, request_id: str) -> Iterator[bytes]: yield b'KITTY_DATA_END\n' -def set_env_in_cmdline(env: Dict[str, str], argv: List[str]) -> None: - patch_cmdline('clone_env', create_shared_memory(env, 'ksse-'), argv) - +def set_env_in_cmdline(env: Dict[str, str], argv: List[str], clone: bool = True) -> None: + from kitty.options.utils import DELETE_ENV_VAR + if clone: + patch_cmdline('clone_env', create_shared_memory(env, 'ksse-'), argv) + return + idx = argv.index('ssh') + for i in range(idx, len(argv)): + if argv[i] == '--kitten': + idx = i + 1 + elif argv[i].startswith('--kitten='): + idx = i + env_dirs = [] + for k, v in env.items(): + if v is DELETE_ENV_VAR: + x = f'--kitten=env={k}' + else: + x = f'--kitten=env={k}={v}' + env_dirs.append(x) + argv[idx+1:idx+1] = env_dirs def get_ssh_cli() -> Tuple[Set[str], Set[str]]: diff --git a/kitty/child.py b/kitty/child.py index 3138d7af51b..0996f5658a5 100644 --- a/kitty/child.py +++ b/kitty/child.py @@ -206,7 +206,7 @@ def __init__( self.argv = list(argv) if cwd_from: try: - cwd = cwd_from.modify_argv_for_launch_with_cwd(self.argv) or cwd + cwd = cwd_from.modify_argv_for_launch_with_cwd(self.argv, env) or cwd except Exception as err: log_error(f'Failed to read cwd of {cwd_from} with error: {err}') else: diff --git a/kitty/window.py b/kitty/window.py index d5e4840f18f..825a9854e03 100644 --- a/kitty/window.py +++ b/kitty/window.py @@ -144,7 +144,7 @@ def cwd_of_child(self) -> str: return window.get_cwd_of_root_child() or '' return window.get_cwd_of_child(oldest=self.request_type is CwdRequestType.oldest) or '' - def modify_argv_for_launch_with_cwd(self, argv: List[str]) -> str: + def modify_argv_for_launch_with_cwd(self, argv: List[str], env: Optional[Dict[str, str]]=None) -> str: window = self.window if not window: return '' @@ -154,12 +154,14 @@ def modify_argv_for_launch_with_cwd(self, argv: List[str]) -> str: if ssh_kitten_cmdline: run_shell = argv[0] == resolved_shell(get_options())[0] server_args = [] if run_shell else list(argv) - from kittens.ssh.utils import set_cwd_in_cmdline, set_server_args_in_cmdline + from kittens.ssh.utils import set_cwd_in_cmdline, set_env_in_cmdline, set_server_args_in_cmdline argv[:] = ssh_kitten_cmdline if argv and argv[0] == 'kitten': argv[0] = kitten_exe() set_cwd_in_cmdline(reported_cwd, argv) set_server_args_in_cmdline(server_args, argv, allocate_tty=not run_shell) + if env is not None: + set_env_in_cmdline(env, argv, clone=False) return '' if not window.child_is_remote and (self.request_type is CwdRequestType.last_reported or window.at_prompt): return reported_cwd