From 3e05261d08a8d2f17de5346ff65937c71b77ed91 Mon Sep 17 00:00:00 2001 From: steven-omaha <35634100+steven-omaha@users.noreply.github.com> Date: Tue, 10 Jan 2023 14:48:18 +0100 Subject: [PATCH] implement clean_packages --- src/core.rs | 64 +++++++++++++++++++++++++++++++---------------------- src/ui.rs | 1 + 2 files changed, 38 insertions(+), 27 deletions(-) diff --git a/src/core.rs b/src/core.rs index 4d967cb..edc61cd 100644 --- a/src/core.rs +++ b/src/core.rs @@ -56,13 +56,14 @@ impl Pacdef { #[allow(clippy::unit_arg)] pub fn run_action_from_arg(self) -> Result<()> { match self.args.subcommand() { - // Some((action::CLEAN, _)) => Ok(self.clean_packages()), + Some((action::CLEAN, _)) => Ok(self.clean_packages()), Some((action::EDIT, groups)) => self.edit_group_files(groups).context("editing"), Some((action::GROUPS, _)) => Ok(self.show_groups()), Some((action::SYNC, _)) => Ok(self.install_packages()), Some((action::UNMANAGED, _)) => Ok(self.show_unmanaged_packages()), Some((action::VERSION, _)) => Ok(self.show_version()), - _ => todo!(), + Some((_, _)) => todo!(), + None => unreachable!(), } } @@ -116,18 +117,6 @@ impl Pacdef { result } - // /// Returns a `Vec` of alphabetically sorted unmanaged packages. - // pub(crate) fn get_unmanaged_packages(&mut self) -> Vec { - // let managed = self.take_packages_as_set(); - // let explicitly_installed = Pacman::get_explicitly_installed_packages(); - // let mut result: Vec<_> = explicitly_installed - // .into_iter() - // .filter(|p| !managed.contains(p)) - // .collect(); - // result.sort_unstable(); - // result - // } - fn show_groups(self) { let mut vec: Vec<_> = self.groups.iter().collect(); vec.sort_unstable(); @@ -136,20 +125,33 @@ impl Pacdef { } } - // fn clean_packages(mut self) { - // let unmanaged = self.get_unmanaged_packages(); - // if unmanaged.is_empty() { - // println!("nothing to do"); - // return; - // } + fn clean_packages(self) { + let to_remove = self.get_unmanaged_packages(); + if to_remove.is_empty() { + println!("nothing to do"); + return; + } - // println!("Would remove the following packages and their dependencies:"); - // for p in &unmanaged { - // println!(" {p}"); - // } - // get_user_confirmation(); - // Pacman::remove_packages(unmanaged); - // } + println!("Would remove the following packages and their dependencies:"); + for (backend, packages) in to_remove.iter() { + if packages.is_empty() { + continue; + } + + println!(" {}", backend.get_section()); + for package in packages { + println!(" {}", package); + } + } + + if !get_user_confirmation() { + return; + }; + + for (backend, packages) in to_remove.into_iter() { + backend.remove_packages(packages); + } + } } struct ToDoPerBackend(Vec<(Box, Vec)>); @@ -163,6 +165,10 @@ impl ToDoPerBackend { self.0.push(item); } + fn into_iter(self) -> impl Iterator, Vec)> { + self.0.into_iter() + } + fn iter(&self) -> impl Iterator, Vec)> { self.0.iter() } @@ -176,4 +182,8 @@ impl ToDoPerBackend { .iter() .for_each(|(backend, diff)| backend.install_packages(diff)); } + + fn is_empty(&self) -> bool { + self.0.iter().all(|(_, packages)| packages.is_empty()) + } } diff --git a/src/ui.rs b/src/ui.rs index 08a6a6e..766a531 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -1,5 +1,6 @@ use std::io::{BufRead, Write}; +#[must_use] pub(crate) fn get_user_confirmation() -> bool { print!("Continue? [Y/n] "); std::io::stdout().flush().unwrap();