Skip to content

Commit

Permalink
poetry shell: fix nushell (#8478)
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
dead10ck authored Oct 6, 2023
1 parent 47a3a19 commit ebb91e2
Showing 1 changed file with 12 additions and 5 deletions.
17 changes: 12 additions & 5 deletions src/poetry/utils/shell.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,23 +97,30 @@ 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():
args = ["-e", cmd] if self._name == "nu" else ["-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":
# Under ZSH the source command should be invoked in zsh's bash emulator
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":
# If this is nu, we don't want to send the activation command to the
# command line since we already ran it via the shell's invocation.
pass
else:
cmd = f"{self._get_source_command()} {shlex.quote(str(activate_path))}"
if self._name in ["fish", "nu"]:
# Under fish and nu "\r" should be sent explicitly
if self._name in ["fish"]:
# Under fish, "\r" should be sent explicitly
cmd += "\r"
c.sendline(cmd)

Expand Down

0 comments on commit ebb91e2

Please sign in to comment.