From 8c3bdd78c5c12be2b1a42def2e16128536b81350 Mon Sep 17 00:00:00 2001 From: Frank <97429702+tsubasakong@users.noreply.github.com> Date: Sat, 7 Mar 2026 16:45:14 -0800 Subject: [PATCH] fix(cli): respect BROWSER when opening dashboard on Linux Signed-off-by: Frank <97429702+tsubasakong@users.noreply.github.com> --- crates/openfang-cli/src/main.rs | 82 +++++++++++++++++++++++++++++++-- 1 file changed, 78 insertions(+), 4 deletions(-) diff --git a/crates/openfang-cli/src/main.rs b/crates/openfang-cli/src/main.rs index cefa3db46..7b0cf0a87 100644 --- a/crates/openfang-cli/src/main.rs +++ b/crates/openfang-cli/src/main.rs @@ -2954,10 +2954,9 @@ pub(crate) fn open_in_browser(url: &str) -> bool { } #[cfg(target_os = "linux")] { - std::process::Command::new("xdg-open") - .arg(url) - .spawn() - .is_ok() + linux_browser_command(url) + .map(|mut command| command.spawn().is_ok()) + .unwrap_or(false) } #[cfg(not(any(target_os = "windows", target_os = "macos", target_os = "linux")))] { @@ -2966,6 +2965,44 @@ pub(crate) fn open_in_browser(url: &str) -> bool { } } +#[cfg(target_os = "linux")] +fn linux_browser_command(url: &str) -> Option { + if let Some(command) = browser_command_from_env(url) { + return Some(command); + } + + let mut command = std::process::Command::new("xdg-open"); + command.arg(url); + Some(command) +} + +#[cfg(target_os = "linux")] +fn browser_command_from_env(url: &str) -> Option { + let browser = std::env::var("BROWSER").ok()?; + browser_command_from_str(&browser, url) +} + +#[cfg(target_os = "linux")] +fn browser_command_from_str(browser: &str, url: &str) -> Option { + let mut parts = browser.split_whitespace(); + let program = parts.next()?; + + let mut command = std::process::Command::new(program); + let mut inserted_url = false; + for part in parts { + if part.contains("%s") { + command.arg(part.replace("%s", url)); + inserted_url = true; + } else { + command.arg(part); + } + } + if !inserted_url { + command.arg(url); + } + Some(command) +} + // --------------------------------------------------------------------------- // Shell completion command // --------------------------------------------------------------------------- @@ -6584,4 +6621,41 @@ args = ["-y", "@modelcontextprotocol/server-github"] assert!(!is_openfang_path_line("# openfang config", dir)); assert!(!is_openfang_path_line("alias of=openfang", dir)); } + + #[cfg(target_os = "linux")] + #[test] + fn test_browser_command_from_str_appends_url() { + use super::browser_command_from_str; + + let command = browser_command_from_str("firefox --new-tab", "http://127.0.0.1:4200/") + .unwrap(); + assert_eq!(command.get_program(), "firefox"); + assert_eq!( + command + .get_args() + .map(|arg| arg.to_string_lossy().into_owned()) + .collect::>(), + vec!["--new-tab", "http://127.0.0.1:4200/"] + ); + } + + #[cfg(target_os = "linux")] + #[test] + fn test_browser_command_from_str_replaces_placeholder() { + use super::browser_command_from_str; + + let command = browser_command_from_str( + "chromium --app=%s --no-sandbox", + "http://127.0.0.1:4200/", + ) + .unwrap(); + assert_eq!(command.get_program(), "chromium"); + assert_eq!( + command + .get_args() + .map(|arg| arg.to_string_lossy().into_owned()) + .collect::>(), + vec!["--app=http://127.0.0.1:4200/", "--no-sandbox"] + ); + } }