From 160ad7f1e20a169acf77dca0a77357458773a4a9 Mon Sep 17 00:00:00 2001 From: Luke Harding Date: Sun, 28 Apr 2024 12:48:57 -0400 Subject: [PATCH] Add ability to remove unused packages --- src/main.rs | 18 +++++++++++++++++- src/pacman_api.rs | 42 +++++++++++++++++++++++++++++++++++++----- src/shell_commands.rs | 4 ++-- 3 files changed, 56 insertions(+), 8 deletions(-) diff --git a/src/main.rs b/src/main.rs index b0b1b9c..7fb8085 100644 --- a/src/main.rs +++ b/src/main.rs @@ -32,7 +32,23 @@ fn main() { return; } - notice_println("Move onto something else"); + notice_println("Getting orphaned packages"); + let result = match pacman_api::get_unused() { + Ok(result) => result, + Err(e) => { + error_println(e.to_string()); + return; + } + }; + + if result.is_empty() { + println!("No Orphaned Packages Found.") + } else if let Err(e) = pacman_api::remove_unused(result) { + error_println(e.to_string()); + return; + } + + notice_println("Do Something Else"); } fn copyright_notice() -> ColoredString { diff --git a/src/pacman_api.rs b/src/pacman_api.rs index aa400f7..cec405e 100644 --- a/src/pacman_api.rs +++ b/src/pacman_api.rs @@ -11,17 +11,18 @@ This module provides an api to make working with Pacman much easier. */ -use std::{error, fmt}; +use std::{error, fmt, io}; use std::fmt::Formatter; use std::io::Read; use std::path::Path; use crate::shell_commands; -#[derive(Debug, Clone)] +#[derive(Debug)] pub enum PacmanError { InsufficientPrivilege, NotInstalled, + IoError(io::Error), Other(String), } @@ -31,6 +32,7 @@ impl fmt::Display for PacmanError { PacmanError::InsufficientPrivilege => "Failed to run pacman. Maybe try sudo?", PacmanError::NotInstalled => "Unable to find pacman. Is this system arch based?", PacmanError::Other(msg) => msg, + _ => "Unexpected Error Occurred", }; write!(f, "{}", output) @@ -42,7 +44,7 @@ impl error::Error for PacmanError {} pub fn check() -> Result<(), PacmanError> { let out = match shell_commands::execute_quiet("which", ["pacman"]) { Ok(out) => out, - Err(e) => return Err(PacmanError::Other(e.to_string())), + Err(e) => return Err(PacmanError::IoError(e)), }; let path = if out.status.success() { @@ -67,9 +69,9 @@ pub fn check() -> Result<(), PacmanError> { } pub fn update_all() -> Result<(), PacmanError> { - let out = match shell_commands::execute_in_sh("pacman -Syu") { + let out = match shell_commands::execute_in_sh("sudo pacman -Syu") { Ok(out) => out, - Err(e) => return Err(PacmanError::Other(e.to_string())), + Err(e) => return Err(PacmanError::IoError(e)), }; let mut child_stderr = match out.stderr { @@ -90,3 +92,33 @@ pub fn update_all() -> Result<(), PacmanError> { Err(PacmanError::Other(stderr_out)) } } + +#[derive(Debug)] +struct GetUnusedStatus {} + +pub fn get_unused() -> Result { + let out = match shell_commands::execute_quiet("pacman", ["-Qtdq"]) { + Ok(out) => out, + Err(e) => return Err(PacmanError::IoError(e)), + }; + + let result = match String::from_utf8(out.stdout) { + Ok(out) => out, + Err(e) => return Err(PacmanError::Other(e.to_string())), + }; + + Ok(result) +} + +pub fn remove_unused(packages: String) -> Result<(), PacmanError> { + let command = format!("sudo pacman -Rns {}", packages); + + let out = match shell_commands::execute_in_sh(command) { + Ok(out) => out, + Err(e) => return Err(PacmanError::IoError(e)), + }; + + dbg!(&out); + + Ok(()) +} diff --git a/src/shell_commands.rs b/src/shell_commands.rs index c414fef..472055b 100644 --- a/src/shell_commands.rs +++ b/src/shell_commands.rs @@ -30,8 +30,8 @@ where Ok(child) } -pub fn execute_in_sh(cmd: &'static str) -> io::Result { - execute_and_display("sh", ["-c", cmd]) +pub fn execute_in_sh(cmd: impl Into) -> io::Result { + execute_and_display("sh", ["-c", &cmd.into()]) } pub fn execute_quiet, I>(cmd: S, args: I) -> io::Result