From 10ae76b187222d3fc12b434530e8a8f1b57a8525 Mon Sep 17 00:00:00 2001 From: Skyler Hawthorne Date: Wed, 27 Sep 2023 10:08:16 -0400 Subject: [PATCH] poetry shell: fix nushell Presently, there are two bugs with `poetry shell` on nushell: 1. The `overlay use` command that poetry sends to the subshell does not get run, but merely appears on the command line as if the user had typed it themselves. Hitting the enter key is still necessary to activate the virtualenv. 2. In the subshell, whenever the user uses a tool that requires interactive keyboard input, the input is not echoed on the screen. This is because the current code specifically and explicitly turns off the terminal echo mode. It is unclear why. This change fixes both of these problems by changing the invocation of `nu` to run the `overlay use` command with the `-e` flag, which runs the given command and then starts an interactive shell. Disabling echo mode is also removed. --- src/poetry/utils/shell.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/poetry/utils/shell.py b/src/poetry/utils/shell.py index 290a62c09c1..0d7da584865 100644 --- a/src/poetry/utils/shell.py +++ b/src/poetry/utils/shell.py @@ -97,12 +97,19 @@ def activate(self, env: VirtualEnv) -> int | None: import shlex terminal = shutil.get_terminal_size() + cmd = f"{self._get_source_command()} {shlex.quote(str(activate_path))}" + with env.temp_environ(): + if self._name == "nu": + args = ["-e", cmd] + else: + args = ["-i"] + c = pexpect.spawn( - self._path, ["-i"], dimensions=(terminal.lines, terminal.columns) + self._path, args, dimensions=(terminal.lines, terminal.columns) ) - if self._name in ["zsh", "nu"]: + if self._name in ["zsh"]: c.setecho(False) if self._name == "zsh": @@ -110,9 +117,10 @@ def activate(self, env: VirtualEnv) -> int | None: c.sendline(f"emulate bash -c '. {shlex.quote(str(activate_path))}'") elif self._name == "xonsh": c.sendline(f"vox activate {shlex.quote(str(env.path))}") + elif self._name == "nu": + pass else: - cmd = f"{self._get_source_command()} {shlex.quote(str(activate_path))}" - if self._name in ["fish", "nu"]: + if self._name in ["fish"]: # Under fish and nu "\r" should be sent explicitly cmd += "\r" c.sendline(cmd)