task: Spawn static tasks in separate shell (#8827)

That way one can use environment variables in task definitions.

Fixes: #8660

/cc @SomeoneToIgnore it looks like we don't ever set `separate_shell` to
false anymore, it might be worth streamlining?

Release Notes:

- Fixed static tasks not being run under a separate shell.
- Removed `separate_shell` setting from task definitions. It is now a default for tasks defined in tasks.json file.
This commit is contained in:
Piotr Osiewicz 2024-03-04 15:57:30 +01:00 committed by GitHub
parent 6121c286b7
commit 98a1e87fbe
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 17 additions and 19 deletions

View file

@ -303,23 +303,25 @@ impl TerminalPanel {
args: spawn_in_terminal.args.clone(),
env: spawn_in_terminal.env.clone(),
};
if spawn_in_terminal.separate_shell {
let Some((shell, mut user_args)) = (match TerminalSettings::get_global(cx).shell.clone()
{
Shell::System => std::env::var("SHELL").ok().map(|shell| (shell, vec![])),
Shell::Program(shell) => Some((shell, vec![])),
Shell::WithArguments { program, args } => Some((program, args)),
}) else {
return;
};
// Set up shell args unconditionally, as tasks are always spawned inside of a shell.
let Some((shell, mut user_args)) = (match TerminalSettings::get_global(cx).shell.clone() {
Shell::System => std::env::var("SHELL").ok().map(|shell| (shell, vec![])),
Shell::Program(shell) => Some((shell, vec![])),
Shell::WithArguments { program, args } => Some((program, args)),
}) else {
return;
};
let command = std::mem::take(&mut spawn_task.command);
let args = std::mem::take(&mut spawn_task.args);
spawn_task.command = shell;
user_args.extend(["-i".to_owned(), "-c".to_owned(), command]);
user_args.extend(args);
spawn_task.args = user_args;
let mut command = std::mem::take(&mut spawn_task.command);
let args = std::mem::take(&mut spawn_task.args);
for arg in args {
command.push(' ');
command.push_str(&arg);
}
spawn_task.command = shell;
user_args.extend(["-i".to_owned(), "-c".to_owned(), command]);
spawn_task.args = user_args;
let working_directory = spawn_in_terminal.cwd.clone();
let allow_concurrent_runs = spawn_in_terminal.allow_concurrent_runs;
let use_new_terminal = spawn_in_terminal.use_new_terminal;