From 018b8aeb55f7e6f8ad8b2fda17dd918f531d2978 Mon Sep 17 00:00:00 2001 From: 0xrsydn Date: Tue, 17 Mar 2026 08:52:11 +0700 Subject: [PATCH] fix: stabilize cache behavior and local xdg paths --- src/cache.rs | 14 ++++++++++++-- src/config.rs | 5 +++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/cache.rs b/src/cache.rs index db35df6..2dd19e0 100644 --- a/src/cache.rs +++ b/src/cache.rs @@ -53,7 +53,7 @@ impl Cache { }; let age = Utc::now().signed_duration_since(entry.fetched_at); if age - > chrono::Duration::from_std(Duration::from_secs(entry.ttl_secs)) + >= chrono::Duration::from_std(Duration::from_secs(entry.ttl_secs)) .map_err(|e| IdxError::CacheMiss(e.to_string()))? { return Ok(None); @@ -204,6 +204,11 @@ impl Cache { } pub fn cache_dir() -> Result { + if let Ok(dir) = std::env::var("XDG_CACHE_HOME") + && !dir.is_empty() + { + return Ok(PathBuf::from(dir).join("idx")); + } ProjectDirs::from("", "", "idx") .map(|d| d.cache_dir().to_path_buf()) .ok_or_else(|| IdxError::ConfigError("unable to resolve cache dir".to_string())) @@ -212,18 +217,23 @@ pub fn cache_dir() -> Result { #[cfg(test)] mod tests { use std::fs; + use std::sync::atomic::{AtomicUsize, Ordering}; use serde::{Deserialize, Serialize}; use super::{Cache, CacheEntry}; + static TMP_COUNTER: AtomicUsize = AtomicUsize::new(0); + #[derive(Debug, Serialize, Deserialize, PartialEq)] struct T { v: i32, } fn tmp() -> std::path::PathBuf { - let p = std::env::temp_dir().join(format!("idx-cache-test-{}", std::process::id())); + let suffix = TMP_COUNTER.fetch_add(1, Ordering::Relaxed); + let p = + std::env::temp_dir().join(format!("idx-cache-test-{}-{suffix}", std::process::id())); let _ = fs::remove_dir_all(&p); fs::create_dir_all(&p).expect("create tmp cache dir"); p diff --git a/src/config.rs b/src/config.rs index 6339d49..75b029a 100644 --- a/src/config.rs +++ b/src/config.rs @@ -197,6 +197,11 @@ pub fn default_config_toml() -> String { } pub fn config_path() -> Result { + if let Ok(dir) = std::env::var("XDG_CONFIG_HOME") + && !dir.is_empty() + { + return Ok(PathBuf::from(dir).join("idx").join("config.toml")); + } ProjectDirs::from("", "", "idx") .map(|d| d.config_dir().join("config.toml")) .ok_or_else(|| IdxError::ConfigError("unable to resolve config dir".to_string()))