From f75e7582e68236629b44999b3031fee3b0d991f4 Mon Sep 17 00:00:00 2001 From: Julia Ryan Date: Mon, 24 Nov 2025 13:46:13 -0800 Subject: [PATCH] Fix zed cli in NixOS WSL instances (#43433) This fixes running `zed ` inside nixos wsl instances. We're copying the approach used elsewhere which is to try using `--exec` first, and if that fails use an actual shell which should cover the nixos case because it only puts binaries on your PATH inside the `/etc/profile` script which is sourced on shell startup. Release Notes: - N/A --------- Co-authored-by: John Tur --- crates/cli/src/main.rs | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index 7dd8a3253c9a0c8440d9342e5c0b3fd19e7f9828..7988f001dab37858d36f791fa8a184fe329c4be5 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -12,7 +12,9 @@ use clap::Parser; use cli::{CliRequest, CliResponse, IpcHandshake, ipc::IpcOneShotServer}; use parking_lot::Mutex; use std::{ - env, fs, io, + env, + ffi::OsStr, + fs, io, path::{Path, PathBuf}, process::ExitStatus, sync::Arc, @@ -300,7 +302,6 @@ mod tests { fn parse_path_in_wsl(source: &str, wsl: &str) -> Result { let mut source = PathWithPosition::parse_str(source); - let mut command = util::command::new_std_command("wsl.exe"); let (user, distro_name) = if let Some((user, distro)) = wsl.split_once('@') { if user.is_empty() { @@ -311,20 +312,34 @@ fn parse_path_in_wsl(source: &str, wsl: &str) -> Result { (None, wsl) }; + let mut args = vec!["--distribution", distro_name]; if let Some(user) = user { - command.arg("--user").arg(user); + args.push("--user"); + args.push(user); } - let output = command - .arg("--distribution") - .arg(distro_name) + let command = [ + OsStr::new("realpath"), + OsStr::new("-s"), + source.path.as_ref(), + ]; + + let output = util::command::new_std_command("wsl.exe") + .args(&args) .arg("--exec") - .arg("realpath") - .arg("-s") - .arg(&source.path) + .args(&command) .output()?; + let result = if output.status.success() { + String::from_utf8_lossy(&output.stdout).to_string() + } else { + let fallback = util::command::new_std_command("wsl.exe") + .args(&args) + .arg("--") + .args(&command) + .output()?; + String::from_utf8_lossy(&fallback.stdout).to_string() + }; - let result = String::from_utf8_lossy(&output.stdout); source.path = Path::new(result.trim()).to_owned(); Ok(source.to_string(|path| path.to_string_lossy().into_owned()))