From 1d04a5ddf26b31ae2c41e08b5f134644308f09c2 Mon Sep 17 00:00:00 2001 From: jdx <216188+jdx@users.noreply.github.com> Date: Tue, 26 Nov 2024 15:06:35 -0600 Subject: [PATCH] refactor: remove duplicate remote_versions_caches --- .github/workflows/release.yml | 2 +- src/backend/aqua.rs | 89 +++++++++++++++-------------------- src/backend/asdf.rs | 18 +------ src/backend/cargo.rs | 35 +++++--------- src/backend/npm.rs | 20 ++------ src/backend/pipx.rs | 46 ++++++++---------- src/backend/spm.rs | 27 +++-------- src/backend/ubi.rs | 65 ++++++++++--------------- src/backend/vfox.rs | 31 ++++-------- 9 files changed, 117 insertions(+), 216 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2b025da010..eb17cf06a3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -158,7 +158,7 @@ jobs: - name: Run e2e tests uses: nick-fields/retry@v3 env: - GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_API_TOKEN: ${{ secrets.RTX_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} TEST_TRANCHE: ${{matrix.tranche}} TEST_TRANCHE_COUNT: 8 TEST_ALL: 1 diff --git a/src/backend/aqua.rs b/src/backend/aqua.rs index 3458d0deea..a9e1768d8f 100644 --- a/src/backend/aqua.rs +++ b/src/backend/aqua.rs @@ -1,7 +1,6 @@ use crate::aqua::aqua_registry::{AquaChecksumType, AquaPackage, AquaPackageType, AQUA_REGISTRY}; use crate::backend::backend_type::BackendType; use crate::backend::Backend; -use crate::cache::{CacheManager, CacheManagerBuilder}; use crate::cli::args::BackendArg; use crate::cli::version::{ARCH, OS}; use crate::cmd::CmdLineRunner; @@ -12,7 +11,7 @@ use crate::install_context::InstallContext; use crate::plugins::VERSION_REGEX; use crate::registry::REGISTRY; use crate::toolset::ToolVersion; -use crate::{dirs, file, github}; +use crate::{file, github}; use eyre::{bail, ContextCompat, Result}; use indexmap::IndexSet; use itertools::Itertools; @@ -25,7 +24,6 @@ use std::path::{Path, PathBuf}; pub struct AquaBackend { ba: BackendArg, id: String, - remote_version_cache: CacheManager>, } impl Backend for AquaBackend { @@ -42,47 +40,43 @@ impl Backend for AquaBackend { } fn _list_remote_versions(&self) -> eyre::Result> { - self.remote_version_cache - .get_or_try_init(|| { - let pkg = AQUA_REGISTRY.package(&self.id)?; - if !pkg.repo_owner.is_empty() && !pkg.repo_name.is_empty() { - let versions = if let Some("github_tag") = pkg.version_source.as_deref() { - github::list_tags(&format!("{}/{}", pkg.repo_owner, pkg.repo_name))? - } else { - github::list_releases(&format!("{}/{}", pkg.repo_owner, pkg.repo_name))? - .into_iter() - .map(|r| r.tag_name) - .collect_vec() - }; - Ok(versions - .into_iter() - .filter_map(|v| { - let mut v = v.as_str(); - match pkg.version_filter_ok(v) { - Ok(true) => {} - Ok(false) => return None, - Err(e) => { - warn!("[{}] aqua version filter error: {e}", self.ba); - } - } - if let Some(prefix) = &pkg.version_prefix { - if let Some(_v) = v.strip_prefix(prefix) { - v = _v - } else { - return None; - } - } - v = v.strip_prefix('v').unwrap_or(v); - Some(v.to_string()) - }) - .rev() - .collect()) - } else { - warn!("no aqua registry found for {}", self.ba); - Ok(vec![]) - } - }) - .cloned() + let pkg = AQUA_REGISTRY.package(&self.id)?; + if !pkg.repo_owner.is_empty() && !pkg.repo_name.is_empty() { + let versions = if let Some("github_tag") = pkg.version_source.as_deref() { + github::list_tags(&format!("{}/{}", pkg.repo_owner, pkg.repo_name))? + } else { + github::list_releases(&format!("{}/{}", pkg.repo_owner, pkg.repo_name))? + .into_iter() + .map(|r| r.tag_name) + .collect_vec() + }; + Ok(versions + .into_iter() + .filter_map(|v| { + let mut v = v.as_str(); + match pkg.version_filter_ok(v) { + Ok(true) => {} + Ok(false) => return None, + Err(e) => { + warn!("[{}] aqua version filter error: {e}", self.ba); + } + } + if let Some(prefix) = &pkg.version_prefix { + if let Some(_v) = v.strip_prefix(prefix) { + v = _v + } else { + return None; + } + } + v = v.strip_prefix('v').unwrap_or(v); + Some(v.to_string()) + }) + .rev() + .collect()) + } else { + warn!("no aqua registry found for {}", self.ba); + Ok(vec![]) + } } fn install_version_impl( @@ -168,13 +162,6 @@ impl AquaBackend { }); } Self { - remote_version_cache: CacheManagerBuilder::new( - ba.cache_path.join("remote_versions.msgpack.z"), - ) - .with_fresh_duration(SETTINGS.fetch_remote_versions_cache()) - .with_fresh_file(dirs::DATA.to_path_buf()) - .with_fresh_file(ba.installs_path.to_path_buf()) - .build(), id: id.to_string(), ba, } diff --git a/src/backend/asdf.rs b/src/backend/asdf.rs index 4fab577b80..30deb3911f 100644 --- a/src/backend/asdf.rs +++ b/src/backend/asdf.rs @@ -33,7 +33,6 @@ pub struct AsdfBackend { pub toml: MisePluginToml, plugin: Box, cache: ExternalPluginCache, - remote_version_cache: CacheManager>, latest_stable_cache: CacheManager>, alias_cache: CacheManager>, legacy_filename_cache: CacheManager>, @@ -51,13 +50,6 @@ impl AsdfBackend { let toml = MisePluginToml::from_file(&toml_path).unwrap(); Self { cache: ExternalPluginCache::default(), - remote_version_cache: CacheManagerBuilder::new( - ba.cache_path.join("remote_versions.msgpack.z"), - ) - .with_fresh_duration(SETTINGS.fetch_remote_versions_cache()) - .with_fresh_file(plugin_path.clone()) - .with_fresh_file(plugin_path.join("bin/list-all")) - .build(), latest_stable_cache: CacheManagerBuilder::new( ba.cache_path.join("latest_stable.msgpack.z"), ) @@ -240,15 +232,7 @@ impl Backend for AsdfBackend { } fn _list_remote_versions(&self) -> Result> { - self.remote_version_cache - .get_or_try_init(|| self.plugin.fetch_remote_versions()) - .wrap_err_with(|| { - eyre!( - "Failed listing remote versions for asdf tool {}", - style(&self.name).blue().for_stderr(), - ) - }) - .cloned() + self.plugin.fetch_remote_versions() } fn latest_stable_version(&self) -> Result> { diff --git a/src/backend/cargo.rs b/src/backend/cargo.rs index 2a9897784e..964cbfecdb 100644 --- a/src/backend/cargo.rs +++ b/src/backend/cargo.rs @@ -7,7 +7,6 @@ use url::Url; use crate::backend::backend_type::BackendType; use crate::backend::Backend; -use crate::cache::{CacheManager, CacheManagerBuilder}; use crate::cli::args::BackendArg; use crate::cmd::CmdLineRunner; use crate::config::{Config, SETTINGS}; @@ -20,7 +19,6 @@ use crate::{env, file}; #[derive(Debug)] pub struct CargoBackend { ba: BackendArg, - remote_version_cache: CacheManager>, } impl Backend for CargoBackend { @@ -45,20 +43,16 @@ impl Backend for CargoBackend { // TODO: maybe fetch tags/branches from git? return Ok(vec!["HEAD".into()]); } - self.remote_version_cache - .get_or_try_init(|| { - let raw = HTTP_FETCH.get_text(get_crate_url(&self.tool_name())?)?; - let stream = Deserializer::from_str(&raw).into_iter::(); - let mut versions = vec![]; - for v in stream { - let v = v?; - if !v.yanked { - versions.push(v.vers); - } - } - Ok(versions) - }) - .cloned() + let raw = HTTP_FETCH.get_text(get_crate_url(&self.tool_name())?)?; + let stream = Deserializer::from_str(&raw).into_iter::(); + let mut versions = vec![]; + for v in stream { + let v = v?; + if !v.yanked { + versions.push(v.vers); + } + } + Ok(versions) } fn install_version_impl( @@ -134,14 +128,7 @@ impl Backend for CargoBackend { impl CargoBackend { pub fn from_arg(ba: BackendArg) -> Self { - Self { - remote_version_cache: CacheManagerBuilder::new( - ba.cache_path.join("remote_versions.msgpack.z"), - ) - .with_fresh_duration(SETTINGS.fetch_remote_versions_cache()) - .build(), - ba, - } + Self { ba } } fn is_binstall_enabled(&self, tv: &ToolVersion) -> bool { diff --git a/src/backend/npm.rs b/src/backend/npm.rs index fed03aaac7..d90e2a2363 100644 --- a/src/backend/npm.rs +++ b/src/backend/npm.rs @@ -13,7 +13,6 @@ use crate::toolset::ToolVersion; #[derive(Debug)] pub struct NPMBackend { ba: BackendArg, - remote_version_cache: CacheManager>, latest_version_cache: CacheManager>, } @@ -33,15 +32,11 @@ impl Backend for NPMBackend { } fn _list_remote_versions(&self) -> eyre::Result> { - self.remote_version_cache - .get_or_try_init(|| { - let raw = cmd!(NPM_PROGRAM, "view", self.tool_name(), "versions", "--json") - .full_env(self.dependency_env()?) - .read()?; - let versions: Vec = serde_json::from_str(&raw)?; - Ok(versions) - }) - .cloned() + let raw = cmd!(NPM_PROGRAM, "view", self.tool_name(), "versions", "--json") + .full_env(self.dependency_env()?) + .read()?; + let versions: Vec = serde_json::from_str(&raw)?; + Ok(versions) } fn latest_stable_version(&self) -> eyre::Result> { @@ -110,11 +105,6 @@ impl Backend for NPMBackend { impl NPMBackend { pub fn from_arg(ba: BackendArg) -> Self { Self { - remote_version_cache: CacheManagerBuilder::new( - ba.cache_path.join("remote_versions.msgpack.z"), - ) - .with_fresh_duration(SETTINGS.fetch_remote_versions_cache()) - .build(), latest_version_cache: CacheManagerBuilder::new( ba.cache_path.join("latest_version.msgpack.z"), ) diff --git a/src/backend/pipx.rs b/src/backend/pipx.rs index 381d32a712..613431ecde 100644 --- a/src/backend/pipx.rs +++ b/src/backend/pipx.rs @@ -21,7 +21,6 @@ use xx::regex; #[derive(Debug)] pub struct PIPXBackend { ba: BackendArg, - remote_version_cache: CacheManager>, latest_version_cache: CacheManager>, } @@ -47,27 +46,25 @@ impl Backend for PIPXBackend { * we return a single version. */ fn _list_remote_versions(&self) -> eyre::Result> { - self.remote_version_cache - .get_or_try_init(|| match self.tool_name().parse()? { - PipxRequest::Pypi(package) => { - let url = format!("https://pypi.org/pypi/{}/json", package); - let data: PypiPackage = HTTP_FETCH.json(url)?; - let versions = data - .releases - .keys() - .map(|v| v.to_string()) - .sorted_by_cached_key(|v| Versioning::new(v)) - .collect(); - Ok(versions) - } - PipxRequest::Git(url) if url.starts_with("https://github.com/") => { - let repo = url.strip_prefix("https://github.com/").unwrap(); - let data = github::list_releases(repo)?; - Ok(data.into_iter().rev().map(|r| r.tag_name).collect()) - } - PipxRequest::Git { .. } => Ok(vec!["latest".to_string()]), - }) - .cloned() + match self.tool_name().parse()? { + PipxRequest::Pypi(package) => { + let url = format!("https://pypi.org/pypi/{}/json", package); + let data: PypiPackage = HTTP_FETCH.json(url)?; + let versions = data + .releases + .keys() + .map(|v| v.to_string()) + .sorted_by_cached_key(|v| Versioning::new(v)) + .collect(); + Ok(versions) + } + PipxRequest::Git(url) if url.starts_with("https://github.com/") => { + let repo = url.strip_prefix("https://github.com/").unwrap(); + let data = github::list_releases(repo)?; + Ok(data.into_iter().rev().map(|r| r.tag_name).collect()) + } + PipxRequest::Git { .. } => Ok(vec!["latest".to_string()]), + } } fn latest_stable_version(&self) -> eyre::Result> { @@ -132,11 +129,6 @@ impl Backend for PIPXBackend { impl PIPXBackend { pub fn from_arg(ba: BackendArg) -> Self { Self { - remote_version_cache: CacheManagerBuilder::new( - ba.cache_path.join("remote_versions.msgpack.z"), - ) - .with_fresh_duration(SETTINGS.fetch_remote_versions_cache()) - .build(), latest_version_cache: CacheManagerBuilder::new( ba.cache_path.join("latest_version.msgpack.z"), ) diff --git a/src/backend/spm.rs b/src/backend/spm.rs index 0205338786..ee8df6c742 100644 --- a/src/backend/spm.rs +++ b/src/backend/spm.rs @@ -1,9 +1,8 @@ use crate::backend::backend_type::BackendType; use crate::backend::Backend; -use crate::cache::{CacheManager, CacheManagerBuilder}; use crate::cli::args::BackendArg; use crate::cmd::CmdLineRunner; -use crate::config::{Settings, SETTINGS}; +use crate::config::Settings; use crate::install_context::InstallContext; use crate::toolset::ToolVersion; use crate::{file, github}; @@ -22,7 +21,6 @@ use xx::regex; #[derive(Debug)] pub struct SPMBackend { ba: BackendArg, - remote_version_cache: CacheManager>, } // https://github.com/apple/swift-package-manager @@ -42,15 +40,11 @@ impl Backend for SPMBackend { fn _list_remote_versions(&self) -> eyre::Result> { let repo = SwiftPackageRepo::new(&self.tool_name())?; - self.remote_version_cache - .get_or_try_init(|| { - Ok(github::list_releases(repo.shorthand.as_str())? - .into_iter() - .map(|r| r.tag_name) - .rev() - .collect()) - }) - .cloned() + Ok(github::list_releases(repo.shorthand.as_str())? + .into_iter() + .map(|r| r.tag_name) + .rev() + .collect()) } fn install_version_impl( @@ -89,14 +83,7 @@ impl Backend for SPMBackend { impl SPMBackend { pub fn from_arg(ba: BackendArg) -> Self { - Self { - remote_version_cache: CacheManagerBuilder::new( - ba.cache_path.join("remote_versions.msgpack.z"), - ) - .with_fresh_duration(SETTINGS.fetch_remote_versions_cache()) - .build(), - ba, - } + Self { ba } } fn clone_package_repo( diff --git a/src/backend/ubi.rs b/src/backend/ubi.rs index 28d72e33f0..315c2e4103 100644 --- a/src/backend/ubi.rs +++ b/src/backend/ubi.rs @@ -1,6 +1,5 @@ use crate::backend::backend_type::BackendType; use crate::backend::Backend; -use crate::cache::{CacheManager, CacheManagerBuilder}; use crate::cli::args::BackendArg; use crate::config::SETTINGS; use crate::env::GITHUB_TOKEN; @@ -23,7 +22,6 @@ use xx::regex; #[derive(Debug)] pub struct UbiBackend { ba: BackendArg, - remote_version_cache: CacheManager>, } // Uses ubi for installations https://github.com/houseabsolute/ubi @@ -40,37 +38,33 @@ impl Backend for UbiBackend { if name_is_url(&self.tool_name()) { Ok(vec!["latest".to_string()]) } else { - self.remote_version_cache - .get_or_try_init(|| { - let opts = self.ba.opts(); - let tag_regex = OnceLock::new(); - let mut versions = github::list_releases(&self.tool_name())? - .into_iter() - .map(|r| r.tag_name) - .collect::>(); - if versions.is_empty() { - versions = github::list_tags(&self.tool_name())?.into_iter().collect(); + let opts = self.ba.opts(); + let tag_regex = OnceLock::new(); + let mut versions = github::list_releases(&self.tool_name())? + .into_iter() + .map(|r| r.tag_name) + .collect::>(); + if versions.is_empty() { + versions = github::list_tags(&self.tool_name())?.into_iter().collect(); + } + Ok(versions + .into_iter() + // trim 'v' prefixes if they exist + .map(|t| match regex!(r"^v[0-9]").is_match(&t) { + true => t[1..].to_string(), + false => t, + }) + .sorted_by_cached_key(|v| !regex!(r"^[0-9]").is_match(v)) + .filter(|v| { + if let Some(re) = opts.get("tag_regex") { + let re = tag_regex.get_or_init(|| Regex::new(re).unwrap()); + re.is_match(v) + } else { + true } - Ok(versions - .into_iter() - // trim 'v' prefixes if they exist - .map(|t| match regex!(r"^v[0-9]").is_match(&t) { - true => t[1..].to_string(), - false => t, - }) - .sorted_by_cached_key(|v| !regex!(r"^[0-9]").is_match(v)) - .filter(|v| { - if let Some(re) = opts.get("tag_regex") { - let re = tag_regex.get_or_init(|| Regex::new(re).unwrap()); - re.is_match(v) - } else { - true - } - }) - .rev() - .collect()) }) - .cloned() + .rev() + .collect()) } } @@ -221,14 +215,7 @@ impl Backend for UbiBackend { impl UbiBackend { pub fn from_arg(ba: BackendArg) -> Self { - Self { - remote_version_cache: CacheManagerBuilder::new( - ba.cache_path.join("remote_versions.msgpack.z"), - ) - .with_fresh_duration(SETTINGS.fetch_remote_versions_cache()) - .build(), - ba, - } + Self { ba } } } diff --git a/src/backend/vfox.rs b/src/backend/vfox.rs index 9d2bd9edf3..2815036b49 100644 --- a/src/backend/vfox.rs +++ b/src/backend/vfox.rs @@ -10,7 +10,7 @@ use crate::backend::backend_type::BackendType; use crate::backend::Backend; use crate::cache::{CacheManager, CacheManagerBuilder}; use crate::cli::args::BackendArg; -use crate::config::{Config, SETTINGS}; +use crate::config::Config; use crate::dirs; use crate::install_context::InstallContext; use crate::plugins::vfox_plugin::VfoxPlugin; @@ -23,7 +23,6 @@ use crate::ui::multi_progress_report::MultiProgressReport; pub struct VfoxBackend { ba: BackendArg, plugin: Box, - remote_version_cache: CacheManager>, exec_env_cache: RwLock>>>, pathname: String, } @@ -42,18 +41,14 @@ impl Backend for VfoxBackend { } fn _list_remote_versions(&self) -> eyre::Result> { - self.remote_version_cache - .get_or_try_init(|| { - let (vfox, _log_rx) = self.plugin.vfox(); - self.ensure_plugin_installed()?; - let versions = RUNTIME.block_on(vfox.list_available_versions(&self.pathname))?; - Ok(versions - .into_iter() - .rev() - .map(|v| v.version) - .collect::>()) - }) - .cloned() + let (vfox, _log_rx) = self.plugin.vfox(); + self.ensure_plugin_installed()?; + let versions = RUNTIME.block_on(vfox.list_available_versions(&self.pathname))?; + Ok(versions + .into_iter() + .rev() + .map(|v| v.version) + .collect::>()) } fn install_version_impl( @@ -108,14 +103,6 @@ impl VfoxBackend { let mut plugin = VfoxPlugin::new(pathname.clone(), plugin_path.clone()); plugin.full = Some(ba.full()); Self { - remote_version_cache: CacheManagerBuilder::new( - ba.cache_path.join("remote_versions.msgpack.z"), - ) - .with_fresh_duration(SETTINGS.fetch_remote_versions_cache()) - .with_fresh_file(dirs::DATA.to_path_buf()) - .with_fresh_file(plugin_path.to_path_buf()) - .with_fresh_file(ba.installs_path.to_path_buf()) - .build(), exec_env_cache: Default::default(), plugin: Box::new(plugin), ba,