diff --git a/crates/pacdef_core/src/backend/actual/fedora.rs b/crates/pacdef_core/src/backend/actual/fedora.rs index 195032e..e0e37a0 100644 --- a/crates/pacdef_core/src/backend/actual/fedora.rs +++ b/crates/pacdef_core/src/backend/actual/fedora.rs @@ -3,7 +3,6 @@ use std::collections::HashSet; use std::process::{Command, ExitStatus}; use anyhow::{Context, Result}; -use regex::Regex; use crate::backend::backend_trait::{Backend, Switches, Text}; use crate::backend::macros::impl_backend_constants; @@ -17,7 +16,12 @@ pub struct Fedora { const BINARY: Text = "dnf"; const SECTION: Text = "fedora"; -const SWITCHES_INFO: Switches = &["list", "--installed"]; +const SWITCHES_INFO: Switches = &[ + "repoquery", + "--installed", + "--queryformat", + "%{reponame}/%{name}", +]; const SWITCHES_INSTALL: Switches = &["install"]; const SWITCHES_MAKE_DEPENDENCY: Switches = &[]; const SWITCHES_NOCONFIRM: Switches = &["--assumeyes"]; @@ -29,63 +33,26 @@ impl Backend for Fedora { impl_backend_constants!(); fn get_all_installed_packages(&self) -> Result> { - let re_str = r"^[0-9A-Za-z_-]*."; - let re = Regex::new(re_str)?; - let mut cmd = Command::new(self.get_binary()); cmd.args(self.get_switches_info()); let output = String::from_utf8(cmd.output()?.stdout)?; - let packages: HashSet = output - .lines() - .map(|line| { - let result = re - .find( - line.split_whitespace() - .next() - .expect("First word cannot be empty!"), - ) - .expect("Not a valid package name!"); - let mut result = result.as_str().to_string(); - result.pop(); - result.into() - }) - .collect(); + let packages: HashSet = output.lines().map(|package| package.into()).collect(); Ok(packages) } fn get_explicitly_installed_packages(&self) -> Result> { - let re_str = r"^(([A-Za-z_]*[0-9]*)-)*"; - let re = Regex::new(re_str)?; - let mut cmd = Command::new(self.get_binary()); - cmd.args(&["history", "userinstalled"]); + cmd.args([ + "repoquery", + "--userinstalled", + "--queryformat", + "%{reponame}/%{name}", + ]); + let output = String::from_utf8(cmd.output()?.stdout)?; - let packages: HashSet = output - .lines() - .skip(1) - .map(|line| { - let word = re.find(line).expect("Not a valid package name"); - let mut word = word.as_str().to_string(); - word.pop(); - let pack = word.rsplit_once('-').map_or(word.clone(), |(pack, term)| { - let mut value = true; - for i in term.chars() { - if !i.is_numeric() { - value = false; - break; - } - } - if !value { - pack.to_string() + "-" + term - } else { - pack.to_string() - } - }); - pack.into() - }) - .collect(); + let packages: HashSet = output.lines().map(|package| package.into()).collect(); Ok(packages) } @@ -131,7 +98,7 @@ impl Backend for Fedora { impl Fedora { pub fn new() -> Self { - Fedora { + Self { packages: HashSet::new(), } }