From 910a0fd86b0f35cd71ca46a8959e5573741ab030 Mon Sep 17 00:00:00 2001 From: Jeff Dickey <216188+jdx@users.noreply.github.com> Date: Tue, 24 Sep 2024 21:00:15 +0000 Subject: [PATCH] fix: add node mirror/flavor to cache key --- src/backend/asdf.rs | 28 ++++---- src/backend/cargo.rs | 9 +-- src/backend/external_plugin_cache.rs | 16 +++-- src/backend/go.rs | 9 +-- src/backend/npm.rs | 16 +++-- src/backend/pipx.rs | 16 +++-- src/backend/spm.rs | 9 +-- src/backend/ubi.rs | 9 +-- src/backend/vfox.rs | 14 ++-- src/cache.rs | 96 ++++++++++++++++++---------- src/file.rs | 8 +++ src/plugins/core/java.rs | 16 +++-- src/plugins/core/mod.rs | 12 ++-- src/plugins/core/python.rs | 9 +-- 14 files changed, 162 insertions(+), 105 deletions(-) diff --git a/src/backend/asdf.rs b/src/backend/asdf.rs index f0eae5e9d..ecb17df45 100644 --- a/src/backend/asdf.rs +++ b/src/backend/asdf.rs @@ -13,7 +13,7 @@ use url::Url; use crate::backend::external_plugin_cache::ExternalPluginCache; use crate::backend::{ABackend, Backend, BackendList}; -use crate::cache::CacheManager; +use crate::cache::{CacheManager, CacheManagerBuilder}; use crate::cli::args::BackendArg; use crate::config::{Config, Settings}; use crate::default_shorthands::DEFAULT_SHORTHANDS; @@ -56,26 +56,30 @@ impl AsdfBackend { let toml = MisePluginToml::from_file(&toml_path).unwrap(); Self { cache: ExternalPluginCache::default(), - remote_version_cache: CacheManager::new( - ba.cache_path.join("remote_versions-$KEY.msgpack.z"), + remote_version_cache: CacheManagerBuilder::new( + ba.cache_path.join("remote_versions.msgpack.z"), ) .with_fresh_duration(*env::MISE_FETCH_REMOTE_VERSIONS_CACHE) .with_fresh_file(plugin_path.clone()) - .with_fresh_file(plugin_path.join("bin/list-all")), - latest_stable_cache: CacheManager::new( - ba.cache_path.join("latest_stable-$KEY.msgpack.z"), + .with_fresh_file(plugin_path.join("bin/list-all")) + .build(), + latest_stable_cache: CacheManagerBuilder::new( + ba.cache_path.join("latest_stable.msgpack.z"), ) .with_fresh_duration(*env::MISE_FETCH_REMOTE_VERSIONS_CACHE) .with_fresh_file(plugin_path.clone()) - .with_fresh_file(plugin_path.join("bin/latest-stable")), - alias_cache: CacheManager::new(ba.cache_path.join("aliases-$KEY.msgpack.z")) + .with_fresh_file(plugin_path.join("bin/latest-stable")) + .build(), + alias_cache: CacheManagerBuilder::new(ba.cache_path.join("aliases.msgpack.z")) .with_fresh_file(plugin_path.clone()) - .with_fresh_file(plugin_path.join("bin/list-aliases")), - legacy_filename_cache: CacheManager::new( - ba.cache_path.join("legacy_filenames-$KEY.msgpack.z"), + .with_fresh_file(plugin_path.join("bin/list-aliases")) + .build(), + legacy_filename_cache: CacheManagerBuilder::new( + ba.cache_path.join("legacy_filenames.msgpack.z"), ) .with_fresh_file(plugin_path.clone()) - .with_fresh_file(plugin_path.join("bin/list-legacy-filenames")), + .with_fresh_file(plugin_path.join("bin/list-legacy-filenames")) + .build(), plugin_path, plugin: Box::new(AsdfPlugin::new(name.clone())), repo_url: None, diff --git a/src/backend/cargo.rs b/src/backend/cargo.rs index cf76f4581..324a108de 100644 --- a/src/backend/cargo.rs +++ b/src/backend/cargo.rs @@ -6,7 +6,7 @@ use serde_json::Deserializer; use url::Url; use crate::backend::{Backend, BackendType}; -use crate::cache::CacheManager; +use crate::cache::{CacheManager, CacheManagerBuilder}; use crate::cli::args::BackendArg; use crate::cmd::CmdLineRunner; use crate::config::{Config, Settings}; @@ -113,10 +113,11 @@ impl Backend for CargoBackend { impl CargoBackend { pub fn from_arg(ba: BackendArg) -> Self { Self { - remote_version_cache: CacheManager::new( - ba.cache_path.join("remote_versions-$KEY.msgpack.z"), + remote_version_cache: CacheManagerBuilder::new( + ba.cache_path.join("remote_versions.msgpack.z"), ) - .with_fresh_duration(*env::MISE_FETCH_REMOTE_VERSIONS_CACHE), + .with_fresh_duration(*env::MISE_FETCH_REMOTE_VERSIONS_CACHE) + .build(), ba, } } diff --git a/src/backend/external_plugin_cache.rs b/src/backend/external_plugin_cache.rs index 2fb20e4d4..5a8485097 100644 --- a/src/backend/external_plugin_cache.rs +++ b/src/backend/external_plugin_cache.rs @@ -1,5 +1,5 @@ use crate::backend::asdf::AsdfBackend; -use crate::cache::CacheManager; +use crate::cache::{CacheManager, CacheManagerBuilder}; use crate::config::Config; use crate::dirs; use crate::hash::hash_to_str; @@ -32,15 +32,16 @@ impl ExternalPluginCache { Some(key) => { let config = Config::get(); let key = render_cache_key(&config, tv, key); - let filename = format!("{}-$KEY.msgpack.z", key); + let filename = format!("{}.msgpack.z", key); tv.cache_path().join("list_bin_paths").join(filename) } - None => tv.cache_path().join("list_bin_paths-$KEY.msgpack.z"), + None => tv.cache_path().join("list_bin_paths.msgpack.z"), }; - CacheManager::new(list_bin_paths_filename) + CacheManagerBuilder::new(list_bin_paths_filename) .with_fresh_file(dirs::DATA.to_path_buf()) .with_fresh_file(plugin.plugin_path.clone()) .with_fresh_file(tv.install_path()) + .build() }); cm.get_or_try_init(fetch).cloned() } @@ -60,15 +61,16 @@ impl ExternalPluginCache { let exec_env_filename = match &plugin.toml.exec_env.cache_key { Some(key) => { let key = render_cache_key(config, tv, key); - let filename = format!("{}-$KEY.msgpack.z", key); + let filename = format!("{}.msgpack.z", key); tv.cache_path().join("exec_env").join(filename) } - None => tv.cache_path().join("exec_env-$KEY.msgpack.z"), + None => tv.cache_path().join("exec_env.msgpack.z"), }; - CacheManager::new(exec_env_filename) + CacheManagerBuilder::new(exec_env_filename) .with_fresh_file(dirs::DATA.to_path_buf()) .with_fresh_file(plugin.plugin_path.clone()) .with_fresh_file(tv.install_path()) + .build() }); cm.get_or_try_init(fetch).cloned() } diff --git a/src/backend/go.rs b/src/backend/go.rs index 8ec3ec68f..de1dc4552 100644 --- a/src/backend/go.rs +++ b/src/backend/go.rs @@ -1,7 +1,7 @@ use std::fmt::Debug; use crate::backend::{Backend, BackendType}; -use crate::cache::CacheManager; +use crate::cache::{CacheManager, CacheManagerBuilder}; use crate::cli::args::BackendArg; use crate::cmd::CmdLineRunner; use crate::config::Settings; @@ -92,10 +92,11 @@ impl Backend for GoBackend { impl GoBackend { pub fn from_arg(ba: BackendArg) -> Self { Self { - remote_version_cache: CacheManager::new( - ba.cache_path.join("remote_versions-$KEY.msgpack.z"), + remote_version_cache: CacheManagerBuilder::new( + ba.cache_path.join("remote_versions.msgpack.z"), ) - .with_fresh_duration(*env::MISE_FETCH_REMOTE_VERSIONS_CACHE), + .with_fresh_duration(*env::MISE_FETCH_REMOTE_VERSIONS_CACHE) + .build(), ba, } } diff --git a/src/backend/npm.rs b/src/backend/npm.rs index 388f5197a..badcdb824 100644 --- a/src/backend/npm.rs +++ b/src/backend/npm.rs @@ -2,7 +2,7 @@ use serde_json::Value; use std::fmt::Debug; use crate::backend::{Backend, BackendType}; -use crate::cache::CacheManager; +use crate::cache::{CacheManager, CacheManagerBuilder}; use crate::cli::args::BackendArg; use crate::cmd::CmdLineRunner; use crate::config::Config; @@ -86,14 +86,16 @@ impl Backend for NPMBackend { impl NPMBackend { pub fn from_arg(ba: BackendArg) -> Self { Self { - remote_version_cache: CacheManager::new( - ba.cache_path.join("remote_versions-$KEY.msgpack.z"), + remote_version_cache: CacheManagerBuilder::new( + ba.cache_path.join("remote_versions.msgpack.z"), ) - .with_fresh_duration(*env::MISE_FETCH_REMOTE_VERSIONS_CACHE), - latest_version_cache: CacheManager::new( - ba.cache_path.join("latest_version-$KEY.msgpack.z"), + .with_fresh_duration(*env::MISE_FETCH_REMOTE_VERSIONS_CACHE) + .build(), + latest_version_cache: CacheManagerBuilder::new( + ba.cache_path.join("latest_version.msgpack.z"), ) - .with_fresh_duration(*env::MISE_FETCH_REMOTE_VERSIONS_CACHE), + .with_fresh_duration(*env::MISE_FETCH_REMOTE_VERSIONS_CACHE) + .build(), ba, } } diff --git a/src/backend/pipx.rs b/src/backend/pipx.rs index d1b53df6a..592cd6813 100644 --- a/src/backend/pipx.rs +++ b/src/backend/pipx.rs @@ -5,7 +5,7 @@ use std::str::FromStr; use versions::Versioning; use crate::backend::{Backend, BackendType}; -use crate::cache::CacheManager; +use crate::cache::{CacheManager, CacheManagerBuilder}; use crate::cli::args::BackendArg; use crate::cmd::CmdLineRunner; use crate::config::{Config, Settings}; @@ -119,14 +119,16 @@ impl Backend for PIPXBackend { impl PIPXBackend { pub fn from_arg(ba: BackendArg) -> Self { Self { - remote_version_cache: CacheManager::new( - ba.cache_path.join("remote_versions-$KEY.msgpack.z"), + remote_version_cache: CacheManagerBuilder::new( + ba.cache_path.join("remote_versions.msgpack.z"), ) - .with_fresh_duration(*env::MISE_FETCH_REMOTE_VERSIONS_CACHE), - latest_version_cache: CacheManager::new( - ba.cache_path.join("latest_version-$KEY.msgpack.z"), + .with_fresh_duration(*env::MISE_FETCH_REMOTE_VERSIONS_CACHE) + .build(), + latest_version_cache: CacheManagerBuilder::new( + ba.cache_path.join("latest_version.msgpack.z"), ) - .with_fresh_duration(*env::MISE_FETCH_REMOTE_VERSIONS_CACHE), + .with_fresh_duration(*env::MISE_FETCH_REMOTE_VERSIONS_CACHE) + .build(), ba, } } diff --git a/src/backend/spm.rs b/src/backend/spm.rs index a7ecf17b3..e546c8a39 100644 --- a/src/backend/spm.rs +++ b/src/backend/spm.rs @@ -10,7 +10,7 @@ use url::Url; use walkdir::WalkDir; use crate::backend::{Backend, BackendType}; -use crate::cache::CacheManager; +use crate::cache::{CacheManager, CacheManagerBuilder}; use crate::cli::args::BackendArg; use crate::cmd::CmdLineRunner; use crate::config::Settings; @@ -87,10 +87,11 @@ impl Backend for SPMBackend { impl SPMBackend { pub fn from_arg(ba: BackendArg) -> Self { Self { - remote_version_cache: CacheManager::new( - ba.cache_path.join("remote_versions-$KEY.msgpack.z"), + remote_version_cache: CacheManagerBuilder::new( + ba.cache_path.join("remote_versions.msgpack.z"), ) - .with_fresh_duration(*env::MISE_FETCH_REMOTE_VERSIONS_CACHE), + .with_fresh_duration(*env::MISE_FETCH_REMOTE_VERSIONS_CACHE) + .build(), ba, } } diff --git a/src/backend/ubi.rs b/src/backend/ubi.rs index 291374c76..102920ae4 100644 --- a/src/backend/ubi.rs +++ b/src/backend/ubi.rs @@ -1,7 +1,7 @@ use std::fmt::Debug; use crate::backend::{Backend, BackendType}; -use crate::cache::CacheManager; +use crate::cache::{CacheManager, CacheManagerBuilder}; use crate::cli::args::BackendArg; use crate::cmd::CmdLineRunner; use crate::config::{Config, Settings}; @@ -81,10 +81,11 @@ impl Backend for UbiBackend { impl UbiBackend { pub fn from_arg(ba: BackendArg) -> Self { Self { - remote_version_cache: CacheManager::new( - ba.cache_path.join("remote_versions-$KEY.msgpack.z"), + remote_version_cache: CacheManagerBuilder::new( + ba.cache_path.join("remote_versions.msgpack.z"), ) - .with_fresh_duration(*env::MISE_FETCH_REMOTE_VERSIONS_CACHE), + .with_fresh_duration(*env::MISE_FETCH_REMOTE_VERSIONS_CACHE) + .build(), ba, } } diff --git a/src/backend/vfox.rs b/src/backend/vfox.rs index 53748962d..93b12f1ea 100644 --- a/src/backend/vfox.rs +++ b/src/backend/vfox.rs @@ -10,7 +10,7 @@ use tokio::runtime::Runtime; use url::Url; use crate::backend::{ABackend, Backend, BackendList, BackendType}; -use crate::cache::CacheManager; +use crate::cache::{CacheManager, CacheManagerBuilder}; use crate::cli::args::BackendArg; use crate::config::{Config, Settings}; use crate::git::Git; @@ -121,17 +121,19 @@ impl VfoxBackend { let pathname = ba.short.to_kebab_case(); let plugin_path = dirs::PLUGINS.join(&pathname); Self { - remote_version_cache: CacheManager::new( - ba.cache_path.join("remote_versions-$KEY.msgpack.z"), + remote_version_cache: CacheManagerBuilder::new( + ba.cache_path.join("remote_versions.msgpack.z"), ) .with_fresh_duration(*env::MISE_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()), - exec_env_cache: CacheManager::new(ba.cache_path.join("exec_env-$KEY.msgpack.z")) + .with_fresh_file(ba.installs_path.to_path_buf()) + .build(), + exec_env_cache: CacheManagerBuilder::new(ba.cache_path.join("exec_env.msgpack.z")) .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()), + .with_fresh_file(ba.installs_path.to_path_buf()) + .build(), repo: OnceLock::new(), ba, vfox, diff --git a/src/cache.rs b/src/cache.rs index d42434de6..efef82a32 100644 --- a/src/cache.rs +++ b/src/cache.rs @@ -19,34 +19,33 @@ use crate::hash::hash_to_str; use crate::rand::random_string; use crate::{dirs, file}; -#[derive(Debug, Clone)] -pub struct CacheManager -where - T: Serialize + DeserializeOwned, -{ +#[derive(Debug)] +pub struct CacheManagerBuilder { cache_file_path: PathBuf, + cache_keys: Vec, fresh_duration: Option, fresh_files: Vec, - cache: Box>, - no_cache: bool, } -impl CacheManager -where - T: Serialize + DeserializeOwned, -{ +pub static BASE_CACHE_KEYS: Lazy> = Lazy::new(|| { + [ + built_info::FEATURES_STR, + built_info::PKG_VERSION, + built_info::PROFILE, + built_info::TARGET, + ] + .into_iter() + .map(|s| s.to_string()) + .collect() +}); + +impl CacheManagerBuilder { pub fn new(cache_file_path: impl AsRef) -> Self { - // "replace $KEY in path with key() - let cache_file_path = regex!(r#"\$KEY"#) - .replace_all(cache_file_path.as_ref().to_str().unwrap(), &*KEY) - .to_string() - .into(); Self { - cache_file_path, - cache: Box::new(OnceCell::new()), + cache_file_path: cache_file_path.as_ref().to_path_buf(), + cache_keys: BASE_CACHE_KEYS.clone(), fresh_files: Vec::new(), fresh_duration: None, - no_cache: false, } } @@ -60,13 +59,54 @@ where self } + pub fn with_cache_key(mut self, key: String) -> Self { + self.cache_keys.push(key); + self + } + + fn cache_key(&self) -> String { + hash_to_str(&self.cache_keys).chars().take(5).collect() + } + + pub fn build(self) -> CacheManager + where + T: Serialize + DeserializeOwned, + { + let key = self.cache_key(); + let (base, ext) = file::split_file_name(&self.cache_file_path); + let mut cache_file_path = self.cache_file_path; + cache_file_path.set_file_name(format!("{base}-{key}.{ext}")); + CacheManager { + cache_file_path, + cache: Box::new(OnceCell::new()), + fresh_files: self.fresh_files, + fresh_duration: self.fresh_duration, + } + } +} + +#[derive(Debug, Clone)] +pub struct CacheManager +where + T: Serialize + DeserializeOwned, +{ + cache_file_path: PathBuf, + fresh_duration: Option, + fresh_files: Vec, + cache: Box>, +} + +impl CacheManager +where + T: Serialize + DeserializeOwned, +{ pub fn get_or_try_init(&self, fetch: F) -> Result<&T> where F: FnOnce() -> Result, { let val = self.cache.get_or_try_init(|| { let path = &self.cache_file_path; - if !self.no_cache && self.is_fresh() { + if self.is_fresh() { match self.parse() { Ok(val) => return Ok::<_, color_eyre::Report>(val), Err(err) => { @@ -144,19 +184,6 @@ where } } -static KEY: Lazy = Lazy::new(|| { - let mut parts = vec![ - built_info::FEATURES_STR, - //built_info::PKG_VERSION, # TODO: put this in for non-debug when we autoclean cache (#2139) - built_info::PROFILE, - built_info::TARGET, - ]; - if cfg!(debug_assertions) { - parts.push(built_info::PKG_VERSION); - } - hash_to_str(&parts).chars().take(5).collect() -}); - pub(crate) struct PruneResults { pub(crate) size: u64, pub(crate) count: u64, @@ -251,8 +278,7 @@ mod tests { #[test] fn test_cache() { reset(); - // does not fail with invalid path - let cache = CacheManager::new("/invalid:path/to/cache"); + let cache = CacheManagerBuilder::new(dirs::CACHE.join("test-cache")).build(); cache.clear().unwrap(); let val = cache.get_or_try_init(|| Ok(1)).unwrap(); assert_eq!(val, &1); diff --git a/src/file.rs b/src/file.rs index 923bc25b9..31b5d2bf8 100644 --- a/src/file.rs +++ b/src/file.rs @@ -501,6 +501,14 @@ pub fn un7z(archive: &Path, dest: &Path) -> Result<()> { .wrap_err_with(|| format!("failed to extract 7z archive: {}", display_path(archive))) } +pub fn split_file_name(path: &Path) -> (String, String) { + let file_name = path.file_name().unwrap().to_string_lossy(); + let (file_name_base, ext) = file_name + .split_once('.') + .unwrap_or((file_name.as_ref(), "")); + (file_name_base.to_string(), ext.to_string()) +} + #[cfg(test)] mod tests { use std::ops::Deref; diff --git a/src/plugins/core/java.rs b/src/plugins/core/java.rs index 2c3223613..68435c091 100644 --- a/src/plugins/core/java.rs +++ b/src/plugins/core/java.rs @@ -13,7 +13,7 @@ use serde_derive::{Deserialize, Serialize}; use versions::Versioning; use crate::backend::Backend; -use crate::cache::CacheManager; +use crate::cache::{CacheManager, CacheManagerBuilder}; use crate::cli::args::BackendArg; use crate::cli::version::{ARCH, OS}; use crate::cmd::CmdLineRunner; @@ -37,18 +37,20 @@ impl JavaPlugin { pub fn new() -> Self { let core = CorePlugin::new(BackendArg::new("java", "java")); let java_metadata_ga_cache_filename = - format!("java_metadata_ga_{}_{}-$KEY.msgpack.z", os(), arch()); + format!("java_metadata_ga_{}_{}.msgpack.z", os(), arch()); let java_metadata_ea_cache_filename = - format!("java_metadata_ea_{}_{}-$KEY.msgpack.z", os(), arch()); + format!("java_metadata_ea_{}_{}.msgpack.z", os(), arch()); Self { - java_metadata_ea_cache: CacheManager::new( + java_metadata_ea_cache: CacheManagerBuilder::new( core.fa.cache_path.join(java_metadata_ea_cache_filename), ) - .with_fresh_duration(*env::MISE_FETCH_REMOTE_VERSIONS_CACHE), - java_metadata_ga_cache: CacheManager::new( + .with_fresh_duration(*env::MISE_FETCH_REMOTE_VERSIONS_CACHE) + .build(), + java_metadata_ga_cache: CacheManagerBuilder::new( core.fa.cache_path.join(java_metadata_ga_cache_filename), ) - .with_fresh_duration(*env::MISE_FETCH_REMOTE_VERSIONS_CACHE), + .with_fresh_duration(*env::MISE_FETCH_REMOTE_VERSIONS_CACHE) + .build(), core, } } diff --git a/src/plugins/core/mod.rs b/src/plugins/core/mod.rs index 36ec787c6..f8f357584 100644 --- a/src/plugins/core/mod.rs +++ b/src/plugins/core/mod.rs @@ -7,8 +7,9 @@ use std::sync::Arc; pub use python::PythonPlugin; use crate::backend::{Backend, BackendMap}; -use crate::cache::CacheManager; +use crate::cache::{CacheManager, CacheManagerBuilder}; use crate::cli::args::BackendArg; +use crate::config::settings::SETTINGS; use crate::config::Settings; use crate::env; use crate::env::PATH_KEY; @@ -107,10 +108,13 @@ impl CorePlugin { pub fn new(fa: BackendArg) -> Self { Self { - remote_version_cache: CacheManager::new( - fa.cache_path.join("remote_versions-$KEY.msgpack.z"), + remote_version_cache: CacheManagerBuilder::new( + fa.cache_path.join("remote_versions.msgpack.z"), ) - .with_fresh_duration(*env::MISE_FETCH_REMOTE_VERSIONS_CACHE), + .with_fresh_duration(*env::MISE_FETCH_REMOTE_VERSIONS_CACHE) + .with_cache_key(SETTINGS.node.mirror_url.clone().unwrap_or_default()) + .with_cache_key(SETTINGS.node.flavor.clone().unwrap_or_default()) + .build(), fa, } } diff --git a/src/plugins/core/python.rs b/src/plugins/core/python.rs index d716df138..27dcf7727 100644 --- a/src/plugins/core/python.rs +++ b/src/plugins/core/python.rs @@ -6,7 +6,7 @@ use itertools::Itertools; use crate::backend::Backend; use crate::build_time::built_info; -use crate::cache::CacheManager; +use crate::cache::{CacheManager, CacheManagerBuilder}; use crate::cli::args::BackendArg; use crate::cmd::CmdLineRunner; use crate::config::{Config, Settings}; @@ -29,10 +29,11 @@ impl PythonPlugin { pub fn new() -> Self { let core = CorePlugin::new(BackendArg::new("python", "python")); Self { - precompiled_cache: CacheManager::new( - core.fa.cache_path.join("precompiled-$KEY.msgpack.z"), + precompiled_cache: CacheManagerBuilder::new( + core.fa.cache_path.join("precompiled.msgpack.z"), ) - .with_fresh_duration(*env::MISE_FETCH_REMOTE_VERSIONS_CACHE), + .with_fresh_duration(*env::MISE_FETCH_REMOTE_VERSIONS_CACHE) + .build(), core, } }