From 0e86ba0983bfa186030996c62e0163778665bfef Mon Sep 17 00:00:00 2001 From: Conrad Irwin Date: Tue, 24 Sep 2024 10:13:53 -0600 Subject: [PATCH] Fix get_cached_binary for eslint (#18286) Release Notes: - Fixed running ESLint offline. --- crates/language/src/language.rs | 3 +- crates/languages/src/typescript.rs | 46 +++++++++++++----------------- 2 files changed, 22 insertions(+), 27 deletions(-) diff --git a/crates/language/src/language.rs b/crates/language/src/language.rs index 166d846f86e8bcb4d487332a8363ae544405b12b..d70650cf44935607bb62aac7407aaf0f36486322 100644 --- a/crates/language/src/language.rs +++ b/crates/language/src/language.rs @@ -384,8 +384,9 @@ pub trait LspAdapter: 'static + Send + Sync { .await { log::info!( - "failed to fetch newest version of language server {:?}. falling back to using {:?}", + "failed to fetch newest version of language server {:?}. error: {:?}, falling back to using {:?}", self.name(), + error, prev_downloaded_binary.path ); binary = Ok(prev_downloaded_binary); diff --git a/crates/languages/src/typescript.rs b/crates/languages/src/typescript.rs index 25a97c8014d0a1cb77b7a5273e291e3e6a5daaf6..b7eb21132d52c4e6ef37a693d7def45b87e6f5cb 100644 --- a/crates/languages/src/typescript.rs +++ b/crates/languages/src/typescript.rs @@ -297,7 +297,8 @@ pub struct EsLintLspAdapter { } impl EsLintLspAdapter { - const CURRENT_VERSION: &'static str = "release/2.4.4"; + const CURRENT_VERSION: &'static str = "2.4.4"; + const CURRENT_VERSION_TAG_NAME: &'static str = "release/2.4.4"; #[cfg(not(windows))] const GITHUB_ASSET_KIND: AssetKind = AssetKind::TarGz; @@ -313,6 +314,10 @@ impl EsLintLspAdapter { pub fn new(node: NodeRuntime) -> Self { EsLintLspAdapter { node } } + + fn build_destination_path(container_dir: &Path) -> PathBuf { + container_dir.join(format!("vscode-eslint-{}", Self::CURRENT_VERSION)) + } } #[async_trait(?Send)] @@ -413,7 +418,7 @@ impl LspAdapter for EsLintLspAdapter { ) -> Result> { let url = build_asset_url( "microsoft/vscode-eslint", - Self::CURRENT_VERSION, + Self::CURRENT_VERSION_TAG_NAME, Self::GITHUB_ASSET_KIND, )?; @@ -430,7 +435,7 @@ impl LspAdapter for EsLintLspAdapter { delegate: &dyn LspAdapterDelegate, ) -> Result { let version = version.downcast::().unwrap(); - let destination_path = container_dir.join(format!("vscode-eslint-{}", version.name)); + let destination_path = Self::build_destination_path(&container_dir); let server_path = destination_path.join(Self::SERVER_PATH); if fs::metadata(&server_path).await.is_err() { @@ -496,38 +501,27 @@ impl LspAdapter for EsLintLspAdapter { container_dir: PathBuf, _: &dyn LspAdapterDelegate, ) -> Option { - get_cached_eslint_server_binary(container_dir, &self.node).await + let server_path = + Self::build_destination_path(&container_dir).join(EsLintLspAdapter::SERVER_PATH); + Some(LanguageServerBinary { + path: self.node.binary_path().await.ok()?, + env: None, + arguments: eslint_server_binary_arguments(&server_path), + }) } async fn installation_test_binary( &self, container_dir: PathBuf, ) -> Option { - get_cached_eslint_server_binary(container_dir, &self.node).await - } -} - -async fn get_cached_eslint_server_binary( - container_dir: PathBuf, - node: &NodeRuntime, -) -> Option { - maybe!(async { - // This is unfortunate but we don't know what the version is to build a path directly - let mut dir = fs::read_dir(&container_dir).await?; - let first = dir.next().await.ok_or(anyhow!("missing first file"))??; - if !first.file_type().await?.is_dir() { - return Err(anyhow!("First entry is not a directory")); - } - let server_path = first.path().join(EsLintLspAdapter::SERVER_PATH); - - Ok(LanguageServerBinary { - path: node.binary_path().await?, + let server_path = + Self::build_destination_path(&container_dir).join(EsLintLspAdapter::SERVER_PATH); + Some(LanguageServerBinary { + path: self.node.binary_path().await.ok()?, env: None, arguments: eslint_server_binary_arguments(&server_path), }) - }) - .await - .log_err() + } } #[cfg(target_os = "windows")]