From c4849b1f4c54221f748d4e2d6f88e52060cef150 Mon Sep 17 00:00:00 2001 From: "Dr. Matthias Ratajczak" Date: Thu, 5 Jan 2023 15:53:50 +0100 Subject: [PATCH] add pacdef clean --- src/action.rs | 1 + src/args.rs | 1 + src/cmd.rs | 9 +++++++++ src/core.rs | 20 +++++++++++++++++++- src/group.rs | 4 +++- src/main.rs | 2 +- 6 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/action.rs b/src/action.rs index 31634fe..d399bd2 100644 --- a/src/action.rs +++ b/src/action.rs @@ -1,3 +1,4 @@ +pub(crate) const CLEAN: &str = "clean"; pub(crate) const EDIT: &str = "edit"; pub(crate) const GROUPS: &str = "groups"; pub(crate) const SYNC: &str = "sync"; diff --git a/src/args.rs b/src/args.rs index c38c151..5de32b1 100644 --- a/src/args.rs +++ b/src/args.rs @@ -8,6 +8,7 @@ fn get_arg_parser() -> Command<'static> { .version("1.0.0-alpha") .subcommand_required(true) .arg_required_else_help(true) + .subcommand(Command::new(CLEAN).about("remove unmanaged packages")) .subcommand( Command::new(EDIT) .about("edit one or more existing group files") diff --git a/src/cmd.rs b/src/cmd.rs index 46fad3c..2b1f76e 100644 --- a/src/cmd.rs +++ b/src/cmd.rs @@ -23,3 +23,12 @@ pub fn run_install_command(diff: Vec) { } cmd.exec(); } + +pub fn run_remove_command(unmanaged: Vec) { + let mut cmd = Command::new("paru"); + cmd.arg("-Rsn"); + for p in unmanaged { + cmd.arg(format!("{p}")); + } + cmd.exec(); +} diff --git a/src/core.rs b/src/core.rs index 7001cc7..5fb0d97 100644 --- a/src/core.rs +++ b/src/core.rs @@ -5,8 +5,9 @@ use anyhow::{bail, Context, Result}; use clap::ArgMatches; use crate::action; -use crate::cmd::{run_edit_command, run_install_command}; +use crate::cmd::{run_edit_command, run_install_command, run_remove_command}; use crate::db::{get_all_installed_packages, get_explicitly_installed_packages}; +use crate::ui::get_user_confirmation; use crate::Group; use crate::Package; @@ -61,8 +62,10 @@ impl Pacdef { run_install_command(diff); } + #[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::EDIT, groups)) => self.edit_group_files(groups).context("editing"), Some((action::GROUPS, _)) => Ok(self.show_groups()), Some((action::SYNC, _)) => Ok(self.install_packages()), @@ -122,4 +125,19 @@ impl Pacdef { println!("{}", g.name); } } + + fn clean_packages(mut self) { + let unmanaged = self.get_unmanaged_packages(); + if unmanaged.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(); + run_remove_command(unmanaged); + } } diff --git a/src/group.rs b/src/group.rs index 74df465..3e0d7e2 100644 --- a/src/group.rs +++ b/src/group.rs @@ -25,7 +25,9 @@ impl Group { let packages = Package::from_lines(reader.lines()); result.insert(Group { - name: name.into_string().map_err(|e| anyhow!(e))?, + name: name + .into_string() + .map_err(|e| anyhow!("could not get group name, {e:?}"))?, packages, }); } diff --git a/src/main.rs b/src/main.rs index 959b2e5..c0b753c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,7 +4,7 @@ use pacdef::{args, Group, Pacdef}; fn main() -> Result<()> { let args = args::get_args(); - let groups = Group::load_from_dir(); + let groups = Group::load_from_dir()?; let pacdef = Pacdef::new(args, groups); pacdef.run_action_from_arg().context("running action") }