From 2a03b6b80c864e5a10fe3a23ef6b98cc287aac38 Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Fri, 12 Sep 2025 15:13:23 +0200 Subject: [PATCH] terminal: Fix `test_basic_terminal` test (#38059) `echo` isn't a program on windows, so we need to spawn a shell that executes it for the test Release Notes: - N/A --- Cargo.lock | 1 + crates/terminal/Cargo.toml | 1 + crates/terminal/src/terminal.rs | 67 ++++++++++++++++----------------- 3 files changed, 35 insertions(+), 34 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 227e4127b6ad25501c0af1161d790caf7db0425e..0667a62f8eb25fd1c7f1149dbc190c4fddb5cecc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -16441,6 +16441,7 @@ dependencies = [ "collections", "futures 0.3.31", "gpui", + "itertools 0.14.0", "libc", "rand 0.9.1", "regex", diff --git a/crates/terminal/Cargo.toml b/crates/terminal/Cargo.toml index 6c8c785915bba86586205e630eac02c3fd784d27..de27b5e11746576c5923b8a2fca584b39161234d 100644 --- a/crates/terminal/Cargo.toml +++ b/crates/terminal/Cargo.toml @@ -40,6 +40,7 @@ util.workspace = true regex.workspace = true urlencoding.workspace = true workspace-hack.workspace = true +itertools.workspace = true [target.'cfg(windows)'.dependencies] windows.workspace = true diff --git a/crates/terminal/src/terminal.rs b/crates/terminal/src/terminal.rs index b66c85b0979453d5e25747efdce9e5793fa90aaf..bec91a787d66dcd1d5c881df794bbb71cfc792ea 100644 --- a/crates/terminal/src/terminal.rs +++ b/crates/terminal/src/terminal.rs @@ -32,6 +32,7 @@ use futures::{ channel::mpsc::{UnboundedReceiver, UnboundedSender, unbounded}, }; +use itertools::Itertools as _; use mappings::mouse::{ alt_scroll, grid_point, grid_point_and_side, mouse_button_report, mouse_moved_report, scroll_report, @@ -48,10 +49,7 @@ use terminal_hyperlinks::RegexSearches; use terminal_settings::{AlternateScroll, CursorShape, TerminalSettings}; use theme::{ActiveTheme, Theme}; use urlencoding; -use util::{ - paths::{self, home_dir}, - truncate_and_trailoff, -}; +use util::truncate_and_trailoff; use std::{ borrow::Cow, @@ -276,7 +274,9 @@ impl Dimensions for TerminalBounds { #[derive(Error, Debug)] pub struct TerminalError { pub directory: Option, - pub shell: Shell, + pub program: Option, + pub args: Option>, + pub title_override: Option, pub source: std::io::Error, } @@ -294,29 +294,23 @@ impl TerminalError { Err(s) => s, } }) - .unwrap_or_else(|| { - format!( - " {}", - paths::home_dir().to_string_lossy() - ) - }) + .unwrap_or_else(|| "".to_string()) } pub fn fmt_shell(&self) -> String { - match &self.shell { - Shell::System => "".to_string(), - Shell::Program(s) => s.to_string(), - Shell::WithArguments { - program, - args, - title_override, - } => { - if let Some(title_override) = title_override { - format!("{} {} ({})", program, args.join(" "), title_override) - } else { - format!("{} {}", program, args.join(" ")) - } - } + if let Some(title_override) = &self.title_override { + format!( + "{} {} ({})", + self.program.as_deref().unwrap_or(""), + self.args.as_ref().into_iter().flatten().format(" "), + title_override + ) + } else { + format!( + "{} {}", + self.program.as_deref().unwrap_or(""), + self.args.as_ref().into_iter().flatten().format(" ") + ) } } } @@ -420,15 +414,16 @@ impl TerminalBuilder { }); let pty_options = { - let alac_shell = shell_params.map(|params| { - alacritty_terminal::tty::Shell::new(params.program, params.args.unwrap_or_default()) + let alac_shell = shell_params.as_ref().map(|params| { + alacritty_terminal::tty::Shell::new( + params.program.clone(), + params.args.clone().unwrap_or_default(), + ) }); alacritty_terminal::tty::Options { shell: alac_shell, - working_directory: working_directory - .clone() - .or_else(|| Some(home_dir().to_path_buf())), + working_directory: working_directory.clone(), drain_on_exit: true, env: env.clone().into_iter().collect(), } @@ -474,7 +469,9 @@ impl TerminalBuilder { Err(error) => { bail!(TerminalError { directory: working_directory, - shell, + program: shell_params.as_ref().map(|params| params.program.clone()), + args: shell_params.as_ref().and_then(|params| params.args.clone()), + title_override: terminal_title_override, source: error, }); } @@ -2205,20 +2202,22 @@ mod tests { use collections::HashMap; use gpui::{Pixels, Point, TestAppContext, bounds, point, size}; use rand::{Rng, distr, rngs::ThreadRng}; + use task::ShellBuilder; - #[ignore = "Test is flaky on macOS, and doesn't run on Windows"] #[gpui::test] async fn test_basic_terminal(cx: &mut TestAppContext) { cx.executor().allow_parking(); let (completion_tx, completion_rx) = smol::channel::unbounded(); + let (program, args) = ShellBuilder::new(None, &Shell::System) + .build(Some("echo".to_owned()), &["hello".to_owned()]); let terminal = cx.new(|cx| { TerminalBuilder::new( None, None, task::Shell::WithArguments { - program: "echo".into(), - args: vec!["hello".into()], + program, + args, title_override: None, }, HashMap::default(),