use crate::cache;
use crate::cache::{PruneOptions, PruneResults};
use crate::config::Settings;
use crate::dirs::CACHE;
use crate::toolset::env_cache::CachedEnv;
use eyre::Result;
use number_prefix::NumberPrefix;
use std::time::Duration;
#[derive(Debug, clap::Args)]
#[clap(verbatim_doc_comment, visible_alias = "p")]
pub struct CachePrune {
plugin: Option<Vec<String>>,
#[clap(long, short, action = clap::ArgAction::Count)]
verbose: u8,
#[clap(long)]
dry_run: bool,
}
impl CachePrune {
pub fn run(self) -> Result<()> {
let settings = Settings::get();
let opts = PruneOptions {
dry_run: self.dry_run,
verbose: self.verbose > 0,
age: settings
.cache_prune_age_duration()
.unwrap_or(Duration::from_secs(30 * 24 * 60 * 60)),
};
let mut results = PruneResults { size: 0, count: 0 };
let r = cache::prune(&CACHE.to_path_buf(), &opts)?;
results.size += r.size;
results.count += r.count;
let env_cache_dir = CachedEnv::cache_dir();
if env_cache_dir.exists() {
let env_opts = PruneOptions {
dry_run: self.dry_run,
verbose: self.verbose > 0,
age: settings.env_cache_ttl(),
};
let r = cache::prune(&env_cache_dir, &env_opts)?;
results.size += r.size;
results.count += r.count;
}
let count = results.count;
let size = bytes_str(results.size);
info!("cache pruned {count} files, {size}");
Ok(())
}
}
fn bytes_str(bytes: u64) -> String {
match NumberPrefix::binary(bytes as f64) {
NumberPrefix::Standalone(bytes) => format!("{bytes} bytes"),
NumberPrefix::Prefixed(prefix, n) => format!("{n:.1} {prefix}B"),
}
}