Better handle shell for remote ssh projects (#19297)
Release Notes: - N/A Co-authored-by: Conrad Irwin <conrad@zed.dev>
This commit is contained in:
parent
d35b646dbb
commit
3dcc638537
2 changed files with 20 additions and 8 deletions
|
@ -6,6 +6,7 @@ use itertools::Itertools;
|
||||||
use settings::{Settings, SettingsLocation};
|
use settings::{Settings, SettingsLocation};
|
||||||
use smol::channel::bounded;
|
use smol::channel::bounded;
|
||||||
use std::{
|
use std::{
|
||||||
|
borrow::Cow,
|
||||||
env::{self},
|
env::{self},
|
||||||
iter,
|
iter,
|
||||||
path::{Path, PathBuf},
|
path::{Path, PathBuf},
|
||||||
|
@ -341,10 +342,9 @@ pub fn wrap_for_ssh(
|
||||||
venv_directory: Option<PathBuf>,
|
venv_directory: Option<PathBuf>,
|
||||||
) -> (String, Vec<String>) {
|
) -> (String, Vec<String>) {
|
||||||
let to_run = if let Some((command, args)) = command {
|
let to_run = if let Some((command, args)) = command {
|
||||||
iter::once(command)
|
let command = Cow::Borrowed(command.as_str());
|
||||||
.chain(args)
|
let args = args.iter().filter_map(|arg| shlex::try_quote(arg).ok());
|
||||||
.filter_map(|arg| shlex::try_quote(arg).ok())
|
iter::once(command).chain(args).join(" ")
|
||||||
.join(" ")
|
|
||||||
} else {
|
} else {
|
||||||
"exec ${SHELL:-sh} -l".to_string()
|
"exec ${SHELL:-sh} -l".to_string()
|
||||||
};
|
};
|
||||||
|
@ -390,9 +390,7 @@ pub fn wrap_for_ssh(
|
||||||
SshCommand::Direct(ssh_args) => ("ssh".to_string(), ssh_args.clone()),
|
SshCommand::Direct(ssh_args) => ("ssh".to_string(), ssh_args.clone()),
|
||||||
};
|
};
|
||||||
|
|
||||||
if command.is_none() {
|
args.push("-t".to_string());
|
||||||
args.push("-t".to_string())
|
|
||||||
}
|
|
||||||
args.push(shell_invocation);
|
args.push(shell_invocation);
|
||||||
(program, args)
|
(program, args)
|
||||||
}
|
}
|
||||||
|
|
|
@ -395,7 +395,21 @@ impl TerminalPanel {
|
||||||
let mut spawn_task = spawn_in_terminal.clone();
|
let mut spawn_task = spawn_in_terminal.clone();
|
||||||
// Set up shell args unconditionally, as tasks are always spawned inside of a shell.
|
// Set up shell args unconditionally, as tasks are always spawned inside of a shell.
|
||||||
let Some((shell, mut user_args)) = (match spawn_in_terminal.shell.clone() {
|
let Some((shell, mut user_args)) = (match spawn_in_terminal.shell.clone() {
|
||||||
Shell::System => retrieve_system_shell().map(|shell| (shell, Vec::new())),
|
Shell::System => {
|
||||||
|
match self
|
||||||
|
.workspace
|
||||||
|
.update(cx, |workspace, cx| workspace.project().read(cx).is_local())
|
||||||
|
{
|
||||||
|
Ok(local) => {
|
||||||
|
if local {
|
||||||
|
retrieve_system_shell().map(|shell| (shell, Vec::new()))
|
||||||
|
} else {
|
||||||
|
Some(("\"${SHELL:-sh}\"".to_string(), Vec::new()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(_no_window_e) => return,
|
||||||
|
}
|
||||||
|
}
|
||||||
Shell::Program(shell) => Some((shell, Vec::new())),
|
Shell::Program(shell) => Some((shell, Vec::new())),
|
||||||
Shell::WithArguments { program, args } => Some((program, args)),
|
Shell::WithArguments { program, args } => Some((program, args)),
|
||||||
}) else {
|
}) else {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue