diff --git a/crates/collab/src/tests.rs b/crates/collab/src/tests.rs index b31feaa9b0b5069cb621fdd91bd9bfd44f8811ef..91af40dc5a688077422d4e892aad59b5ad237c10 100644 --- a/crates/collab/src/tests.rs +++ b/crates/collab/src/tests.rs @@ -13,9 +13,7 @@ use client::{ use collections::{HashMap, HashSet}; use fs::FakeFs; use futures::{channel::oneshot, StreamExt as _}; -use gpui::{ - executor::Deterministic, test::EmptyView, ModelHandle, Task, TestAppContext, ViewHandle, -}; +use gpui::{executor::Deterministic, test::EmptyView, ModelHandle, TestAppContext, ViewHandle}; use language::LanguageRegistry; use parking_lot::Mutex; use project::{Project, WorktreeId}; diff --git a/crates/zed/src/languages/html.rs b/crates/zed/src/languages/html.rs index 2fcf3b26997f359190a62cd5df1bd3900da379a5..f7ade20dfbaf9eb2d4c0662f67216c5cb692634d 100644 --- a/crates/zed/src/languages/html.rs +++ b/crates/zed/src/languages/html.rs @@ -32,15 +32,18 @@ impl LspAdapter for HtmlLspAdapter { async fn fetch_latest_server_version( &self, - _: Arc, + http: Arc, ) -> Result> { - Ok(Box::new(npm_package_latest_version("vscode-langservers-extracted").await?) as Box<_>) + Ok( + Box::new(npm_package_latest_version(http, "vscode-langservers-extracted").await?) + as Box<_>, + ) } async fn fetch_server_binary( &self, version: Box, - _: Arc, + http: Arc, container_dir: PathBuf, ) -> Result { let version = version.downcast::().unwrap(); @@ -52,6 +55,7 @@ impl LspAdapter for HtmlLspAdapter { if fs::metadata(&binary_path).await.is_err() { npm_install_packages( + http, [("vscode-langservers-extracted", version.as_str())], &version_dir, ) diff --git a/crates/zed/src/languages/installation.rs b/crates/zed/src/languages/installation.rs index 54fd6ddff95bdf9503c4f5feea8291acdad5e1c8..852b8f0de0b9f47083e7dfbc97939c4abc231922 100644 --- a/crates/zed/src/languages/installation.rs +++ b/crates/zed/src/languages/installation.rs @@ -2,9 +2,9 @@ use anyhow::{anyhow, Context, Result}; use async_compression::futures::bufread::GzipDecoder; use async_tar::Archive; use client::http::HttpClient; -use futures::{io::BufReader, StreamExt}; +use futures::io::BufReader; use serde::Deserialize; -use smol::fs::{self, File}; +use smol::fs::{self}; use smol::io::AsyncReadExt; use std::{ path::{Path, PathBuf}, @@ -75,10 +75,16 @@ pub async fn ensure_node_installation_dir(http: Arc) -> Result

Result { - let output = smol::process::Command::new("npm") +pub async fn npm_package_latest_version(http: Arc, name: &str) -> Result { + let node_dir = ensure_node_installation_dir(http).await?; + let node_binary = node_dir.join("bin/npm"); + let npm_file = node_dir.join("bin/npm"); + + let output = smol::process::Command::new(node_binary) + .arg(npm_file) .args(["-fetch-retry-mintimeout", "2000"]) .args(["-fetch-retry-maxtimeout", "5000"]) + .args(["-fetch-timeout", "5000"]) .args(["info", name, "--json"]) .output() .await @@ -98,12 +104,19 @@ pub async fn npm_package_latest_version(name: &str) -> Result { } pub async fn npm_install_packages( + http: Arc, packages: impl IntoIterator, directory: &Path, ) -> Result<()> { - let output = smol::process::Command::new("npm") + let node_dir = ensure_node_installation_dir(http).await?; + let node_binary = node_dir.join("bin/npm"); + let npm_file = node_dir.join("bin/npm"); + + let output = smol::process::Command::new(node_binary) + .arg(npm_file) .args(["-fetch-retry-mintimeout", "2000"]) .args(["-fetch-retry-maxtimeout", "5000"]) + .args(["-fetch-timeout", "5000"]) .arg("install") .arg("--prefix") .arg(directory) diff --git a/crates/zed/src/languages/python.rs b/crates/zed/src/languages/python.rs index a980e2ad75b0a8bf238b7fdbacc9ffaf134c8d55..4495b9e4d8e9ae15e4c16e3326d51ae9a6110f9c 100644 --- a/crates/zed/src/languages/python.rs +++ b/crates/zed/src/languages/python.rs @@ -30,15 +30,15 @@ impl LspAdapter for PythonLspAdapter { async fn fetch_latest_server_version( &self, - _: Arc, + http: Arc, ) -> Result> { - Ok(Box::new(npm_package_latest_version("pyright").await?) as Box<_>) + Ok(Box::new(npm_package_latest_version(http, "pyright").await?) as Box<_>) } async fn fetch_server_binary( &self, version: Box, - _: Arc, + http: Arc, container_dir: PathBuf, ) -> Result { let version = version.downcast::().unwrap(); @@ -49,7 +49,7 @@ impl LspAdapter for PythonLspAdapter { let binary_path = version_dir.join(Self::BIN_PATH); if fs::metadata(&binary_path).await.is_err() { - npm_install_packages([("pyright", version.as_str())], &version_dir).await?; + npm_install_packages(http, [("pyright", version.as_str())], &version_dir).await?; if let Some(mut entries) = fs::read_dir(&container_dir).await.log_err() { while let Some(entry) = entries.next().await { diff --git a/crates/zed/src/languages/typescript.rs b/crates/zed/src/languages/typescript.rs index 3f2e25d9e62280807804626b918cc4d01fa43381..7775da6067045bcd0feb77193da8e1809d36e3aa 100644 --- a/crates/zed/src/languages/typescript.rs +++ b/crates/zed/src/languages/typescript.rs @@ -40,18 +40,18 @@ impl LspAdapter for TypeScriptLspAdapter { async fn fetch_latest_server_version( &self, - _: Arc, + http: Arc, ) -> Result> { Ok(Box::new(Versions { - typescript_version: npm_package_latest_version("typescript").await?, - server_version: npm_package_latest_version("typescript-language-server").await?, + typescript_version: npm_package_latest_version(http.clone(), "typescript").await?, + server_version: npm_package_latest_version(http, "typescript-language-server").await?, }) as Box<_>) } async fn fetch_server_binary( &self, versions: Box, - _: Arc, + http: Arc, container_dir: PathBuf, ) -> Result { let versions = versions.downcast::().unwrap(); @@ -66,6 +66,7 @@ impl LspAdapter for TypeScriptLspAdapter { if fs::metadata(&binary_path).await.is_err() { npm_install_packages( + http, [ ("typescript", versions.typescript_version.as_str()), ( diff --git a/crates/zed/src/languages/yaml.rs b/crates/zed/src/languages/yaml.rs index c179ec5b2da78d3aff92398504e7b64ec2b10483..da03e6d5cfd215df5747203fc1f2564fb69468a4 100644 --- a/crates/zed/src/languages/yaml.rs +++ b/crates/zed/src/languages/yaml.rs @@ -34,15 +34,15 @@ impl LspAdapter for YamlLspAdapter { async fn fetch_latest_server_version( &self, - _: Arc, + http: Arc, ) -> Result> { - Ok(Box::new(npm_package_latest_version("yaml-language-server").await?) as Box<_>) + Ok(Box::new(npm_package_latest_version(http, "yaml-language-server").await?) as Box<_>) } async fn fetch_server_binary( &self, version: Box, - _: Arc, + http: Arc, container_dir: PathBuf, ) -> Result { let version = version.downcast::().unwrap(); @@ -53,8 +53,12 @@ impl LspAdapter for YamlLspAdapter { let binary_path = version_dir.join(Self::BIN_PATH); if fs::metadata(&binary_path).await.is_err() { - npm_install_packages([("yaml-language-server", version.as_str())], &version_dir) - .await?; + npm_install_packages( + http, + [("yaml-language-server", version.as_str())], + &version_dir, + ) + .await?; if let Some(mut entries) = fs::read_dir(&container_dir).await.log_err() { while let Some(entry) = entries.next().await { diff --git a/crates/zed/src/zed.rs b/crates/zed/src/zed.rs index a28b407328f001530c708e10cdc9b5bb36dc107d..fd6b56027279be1b4579551c4cfbbe6375afa3fb 100644 --- a/crates/zed/src/zed.rs +++ b/crates/zed/src/zed.rs @@ -654,7 +654,7 @@ mod tests { use assets::Assets; use editor::{scroll::autoscroll::Autoscroll, DisplayPoint, Editor}; use gpui::{ - executor::Deterministic, AssetSource, MutableAppContext, Task, TestAppContext, ViewHandle, + executor::Deterministic, AssetSource, MutableAppContext, TestAppContext, ViewHandle, }; use language::LanguageRegistry; use project::{Project, ProjectPath};