diff --git a/src/cli/aliases.rs b/src/cli/aliases.rs index 2786f80..9afc150 100644 --- a/src/cli/aliases.rs +++ b/src/cli/aliases.rs @@ -304,16 +304,22 @@ fn cmd_rename(names: &[String], robot: bool, start: Instant) -> Result<(), Swagg )) })?; - // Update meta.json alias field + // Update meta.json alias field -- propagate errors so the cache + // doesn't end up with a stale alias name in metadata. let meta_path = new_dir.join("meta.json"); - if let Ok(bytes) = std::fs::read(&meta_path) - && let Ok(mut meta) = serde_json::from_slice::(&bytes) - { - meta.alias = new.clone(); - if let Ok(updated_bytes) = serde_json::to_vec_pretty(&meta) { - let _ = std::fs::write(&meta_path, updated_bytes); - } - } + let meta_bytes = std::fs::read(&meta_path).map_err(|e| { + SwaggerCliError::Cache(format!("failed to read meta.json after rename: {e}")) + })?; + let mut meta: CacheMetadata = serde_json::from_slice(&meta_bytes).map_err(|e| { + SwaggerCliError::Cache(format!("failed to parse meta.json after rename: {e}")) + })?; + meta.alias = new.clone(); + let updated_bytes = serde_json::to_vec_pretty(&meta).map_err(|e| { + SwaggerCliError::Cache(format!("failed to serialize meta.json after rename: {e}")) + })?; + std::fs::write(&meta_path, updated_bytes).map_err(|e| { + SwaggerCliError::Cache(format!("failed to write meta.json after rename: {e}")) + })?; // Update config if old was the default let cfg_path = config_path(None); diff --git a/src/cli/cache_cmd.rs b/src/cli/cache_cmd.rs index 19ec77b..5c6fc61 100644 --- a/src/cli/cache_cmd.rs +++ b/src/cli/cache_cmd.rs @@ -32,8 +32,8 @@ pub struct Args { #[arg(long)] pub prune_stale: bool, - /// Days before an alias is considered stale (default: 90) - #[arg(long, default_value_t = 90)] + /// Days before an alias is considered stale (default: 30, matching config) + #[arg(long, default_value_t = 30)] pub prune_threshold: u32, /// Evict least-recently-used aliases until total size is under this limit (MB) @@ -290,13 +290,13 @@ fn execute_prune(args: &Args, robot: bool, start: Instant) -> Result<(), Swagger "cache", start.elapsed(), ); - } else if stale.is_empty() { + } else if pruned.is_empty() { println!( "No stale aliases (threshold: {} days).", args.prune_threshold ); } else { - println!("Pruned {} stale alias(es).", stale.len()); + println!("Pruned {} stale alias(es).", pruned.len()); } Ok(()) } diff --git a/src/cli/doctor.rs b/src/cli/doctor.rs index 00be3e0..6fc99c2 100644 --- a/src/cli/doctor.rs +++ b/src/cli/doctor.rs @@ -344,12 +344,19 @@ fn try_fix_alias(cm: &CacheManager, alias: &str) -> Result, Vec Result<(), SwaggerCliError> { let start = Instant::now(); - // Load config + // Load config -- doctor should work even when config is missing or + // corrupt, so fall back to defaults and report a warning. let cfg_path = config_path(None); - let config = Config::load(&cfg_path)?; + let mut warnings: Vec = Vec::new(); + let config = match Config::load(&cfg_path) { + Ok(cfg) => cfg, + Err(e) => { + warnings.push(format!("could not load config (using defaults): {e}")); + Config::default() + } + }; // Check config dir exists - let mut warnings: Vec = Vec::new(); if let Some(parent) = cfg_path.parent() && !parent.exists() {