diff --git a/crates/recent_projects/src/dev_container.rs b/crates/recent_projects/src/dev_container.rs index 0e6b8b381df32d688e062948460707a5f8cfb552..c4d6158188abc8bf6b8bbd0a02673d4493a89914 100644 --- a/crates/recent_projects/src/dev_container.rs +++ b/crates/recent_projects/src/dev_container.rs @@ -53,7 +53,9 @@ async fn check_for_docker() -> Result<(), DevContainerError> { } } -async fn ensure_devcontainer_cli(node_runtime: NodeRuntime) -> Result { +async fn ensure_devcontainer_cli( + node_runtime: &NodeRuntime, +) -> Result<(PathBuf, bool), DevContainerError> { let mut command = util::command::new_smol_command(&dev_container_cli()); command.arg("--version"); @@ -63,23 +65,42 @@ async fn ensure_devcontainer_cli(node_runtime: NodeRuntime) -> Result log::error!( "Unable to find devcontainer CLI in Data dir. Will try to install. Error: {:?}", e - ); - } else { - log::info!("Found devcontainer CLI in Data dir"); - return Ok(datadir_cli_path.clone()); + ), + Ok(output) => { + if output.status.success() { + log::info!("Found devcontainer CLI in Data dir"); + return Ok((datadir_cli_path.clone(), false)); + } else { + log::error!( + "Could not run devcontainer CLI from data_dir. Will try once more to install. Output: {:?}", + output + ); + } + } } if let Err(e) = fs::create_dir_all(paths::devcontainer_dir()).await { @@ -101,7 +122,9 @@ async fn ensure_devcontainer_cli(node_runtime: NodeRuntime) -> Result Result, ) -> Result { - let mut command = util::command::new_smol_command(path_to_cli.display().to_string()); - command.arg("up"); - command.arg("--workspace-folder"); - command.arg(path.display().to_string()); + let Ok(node_runtime_path) = node_runtime.binary_path().await else { + log::error!("Unable to find node runtime path"); + return Err(DevContainerError::NodeRuntimeNotAvailable); + }; + + let mut command = if found_in_path { + let mut command = util::command::new_smol_command(path_to_cli.display().to_string()); + command.arg("up"); + command.arg("--workspace-folder"); + command.arg(path.display().to_string()); + command + } else { + let mut command = + util::command::new_smol_command(node_runtime_path.as_os_str().display().to_string()); + command.arg(path_to_cli.display().to_string()); + command.arg("up"); + command.arg("--workspace-folder"); + command.arg(path.display().to_string()); + command + }; + + log::debug!("Running full devcontainer up command: {:?}", command); match command.output().await { Ok(output) => { @@ -235,7 +278,7 @@ pub(crate) async fn start_dev_container( ) -> Result<(Connection, String), DevContainerError> { check_for_docker().await?; - let path_to_devcontainer_cli = ensure_devcontainer_cli(node_runtime).await?; + let (path_to_devcontainer_cli, found_in_path) = ensure_devcontainer_cli(&node_runtime).await?; let Some(directory) = project_directory(cx) else { return Err(DevContainerError::DevContainerNotFound); @@ -245,7 +288,13 @@ pub(crate) async fn start_dev_container( container_id, remote_workspace_folder, .. - }) = devcontainer_up(&path_to_devcontainer_cli, directory.clone()).await + }) = devcontainer_up( + &path_to_devcontainer_cli, + found_in_path, + &node_runtime, + directory.clone(), + ) + .await { let project_name = get_project_name( &path_to_devcontainer_cli, @@ -273,6 +322,7 @@ pub(crate) enum DevContainerError { DevContainerUpFailed, DevContainerNotFound, DevContainerParseFailed, + NodeRuntimeNotAvailable, } #[cfg(test)]