diff --git a/crates/remote/src/transport/wsl.rs b/crates/remote/src/transport/wsl.rs index 702b2dd0601ab94969d1c88de6b6eaae8951c9b2..3e14fcfc8b7b8a7f74b1de2a10107a143461108b 100644 --- a/crates/remote/src/transport/wsl.rs +++ b/crates/remote/src/transport/wsl.rs @@ -19,6 +19,7 @@ use std::{ time::Instant, }; use util::{ + ResultExt as _, paths::{PathStyle, RemotePathBuf}, rel_path::RelPath, shell::ShellKind, @@ -79,20 +80,27 @@ impl WslRemoteConnection { can_exec: true, }; delegate.set_status(Some("Detecting WSL environment"), cx); - this.shell = this.detect_shell().await?; + this.shell = this + .detect_shell() + .await + .context("failed detecting shell")?; this.shell_kind = ShellKind::new(&this.shell, false); - this.can_exec = this.detect_can_exec().await?; - this.platform = this.detect_platform().await?; + this.can_exec = this.detect_can_exec().await; + this.platform = this + .detect_platform() + .await + .context("failed detecting platform")?; this.remote_binary_path = Some( this.ensure_server_binary(&delegate, release_channel, version, commit, cx) - .await?, + .await + .context("failed ensuring server binary")?, ); log::debug!("Detected WSL environment: {this:#?}"); Ok(this) } - async fn detect_can_exec(&self) -> Result { + async fn detect_can_exec(&self) -> bool { let options = &self.connection_options; let program = self.shell_kind.prepend_command_prefix("uname"); let args = &["-m"]; @@ -101,10 +109,13 @@ impl WslRemoteConnection { .await; if !output.is_ok_and(|output| output.status.success()) { - run_wsl_command_impl(options, &program, args, false).await?; - Ok(false) + run_wsl_command_impl(options, &program, args, false) + .await + .context("failed detecting exec status") + .log_err(); + false } else { - Ok(true) + true } } async fn detect_platform(&self) -> Result { @@ -504,7 +515,9 @@ impl RemoteConnection for WslRemoteConnection { /// `wslpath` is a executable available in WSL, it's a linux binary. /// So it doesn't support Windows style paths. async fn sanitize_path(path: &Path) -> Result { - let path = smol::fs::canonicalize(path).await?; + let path = smol::fs::canonicalize(path) + .await + .with_context(|| format!("Failed to canonicalize path {}", path.display()))?; let path_str = path.to_string_lossy(); let sanitized = path_str.strip_prefix(r"\\?\").unwrap_or(&path_str); @@ -526,14 +539,16 @@ async fn run_wsl_command_impl( args: &[&str], exec: bool, ) -> Result { - let output = wsl_command_impl(options, program, args, exec) + let mut command = wsl_command_impl(options, program, args, exec); + let output = command .output() - .await?; + .await + .with_context(|| format!("Failed to run command '{:?}'", command))?; if !output.status.success() { return Err(anyhow!( - "Command '{}' failed: {}", - program, + "Command '{:?}' failed: {}", + command, String::from_utf8_lossy(&output.stderr).trim() )); }