diff --git a/src/subcommand/clean.rs b/src/subcommand/clean.rs index 5b843fe77..78ef3a3ad 100644 --- a/src/subcommand/clean.rs +++ b/src/subcommand/clean.rs @@ -63,66 +63,16 @@ impl CliExecuter for Clean { let apt = OmaApt::new(vec![], oma_apt_args, false, apt_config)?; let download_dir = apt.get_archive_dir(); - let dir = fs::read_dir(download_dir).map_err(|e| OutputError { - description: format!("Failed to read dir: {}", download_dir.display()), - source: Some(Box::new(e)), - })?; let pb = create_progress_spinner(no_progress, fl!("cleaning")); - let mut total_clean_size = 0; - - remove(&download_dir.join("partial"), &mut total_clean_size); - - for i in dir - .flatten() - .filter(|x| x.path().extension().is_some_and(|name| name == "deb")) - { - if !keep_downloadable && !keep_downloadable_and_installed && !keep_installed { - remove(&i.path(), &mut total_clean_size); - continue; - } - - let file_name = i.file_name(); - let file_name = file_name.to_string_lossy(); - let mut file_name = file_name.splitn(3, '_'); - - let Some((pkg, version)) = Some(()).and_then(|_| { - let package = file_name.next()?; - let version = file_name.next()?; - - Some((package, version)) - }) else { - debug!( - "Failed to get package name or version: {}, will delete this file", - i.path().display() - ); - remove(&i.path(), &mut total_clean_size); - continue; - }; - - let version = version.replace("%3a", ":"); - - let Some(version) = apt.cache.get(pkg).and_then(|pkg| pkg.get_version(&version)) else { - remove(&i.path(), &mut total_clean_size); - continue; - }; - - if !version.is_installed() - && !version.is_downloadable() - && keep_downloadable_and_installed - { - remove(&i.path(), &mut total_clean_size); - continue; - } - - if (!version.is_downloadable() && keep_downloadable) - || (!version.is_installed() && keep_installed) - { - remove(&i.path(), &mut total_clean_size); - continue; - } - } + let total_clean_size = clean_download_packages_cache( + keep_downloadable, + keep_downloadable_and_installed, + keep_installed, + &apt, + download_dir, + )?; if let Some(pb) = pb { pb.inner.finish_and_clear(); @@ -139,6 +89,73 @@ impl CliExecuter for Clean { } } +pub fn clean_download_packages_cache( + keep_downloadable: bool, + keep_downloadable_and_installed: bool, + keep_installed: bool, + apt: &OmaApt, + download_dir: &Path, +) -> Result { + let mut total_clean_size = 0; + + remove(&download_dir.join("partial"), &mut total_clean_size); + + let dir = fs::read_dir(download_dir).map_err(|e| OutputError { + description: format!("Failed to read dir: {}", download_dir.display()), + source: Some(Box::new(e)), + })?; + + for i in dir + .flatten() + .filter(|x| x.path().extension().is_some_and(|name| name == "deb")) + { + if !keep_downloadable && !keep_downloadable_and_installed && !keep_installed { + remove(&i.path(), &mut total_clean_size); + continue; + } + + let file_name = i.file_name(); + let file_name = file_name.to_string_lossy(); + let mut file_name = file_name.splitn(3, '_'); + + let Some((pkg, version)) = Some(()).and_then(|_| { + let package = file_name.next()?; + let version = file_name.next()?; + + Some((package, version)) + }) else { + debug!( + "Failed to get package name or version: {}, will delete this file", + i.path().display() + ); + remove(&i.path(), &mut total_clean_size); + continue; + }; + + let version = version.replace("%3a", ":"); + + let Some(version) = apt.cache.get(pkg).and_then(|pkg| pkg.get_version(&version)) else { + remove(&i.path(), &mut total_clean_size); + continue; + }; + + if !version.is_installed() && !version.is_downloadable() && keep_downloadable_and_installed + { + remove(&i.path(), &mut total_clean_size); + continue; + } + + if (!version.is_downloadable() && keep_downloadable) + || (!version.is_installed() && keep_installed) + { + remove(&i.path(), &mut total_clean_size); + continue; + } + } + + Ok(total_clean_size) +} + fn remove(i: &Path, total_size: &mut u64) { let size = get_size(i); diff --git a/src/subcommand/utils.rs b/src/subcommand/utils.rs index c9d5ce675..32ca97283 100644 --- a/src/subcommand/utils.rs +++ b/src/subcommand/utils.rs @@ -34,6 +34,7 @@ use crate::pb::OmaMultiProgressBar; use crate::pb::OmaProgressBar; use crate::pb::RenderPackagesDownloadProgress; use crate::pb::RenderRefreshProgress; +use crate::subcommand::clean::clean_download_packages_cache; use crate::success; use crate::table::table_for_install_pending; use ahash::HashSet; @@ -488,6 +489,14 @@ impl CommitChanges<'_> { history_success_tips(dry_run); display_suggest_tips(suggest, recommend); + + let download_dir = apt.get_archive_dir(); + if let Err(e) = + clean_download_packages_cache(false, false, false, &apt, download_dir) + { + warn!("Failed to clean download packages cache: {}", e); + } + space_tips(&apt, sysroot); Ok(0)