From adeeb75ba6564882a322fc5073aa523f83e31d2a Mon Sep 17 00:00:00 2001 From: trivernis Date: Sat, 27 Aug 2022 19:48:35 +0200 Subject: [PATCH] Add wrapper for pacman install Signed-off-by: trivernis --- src/internal/mod.rs | 1 + src/internal/pacman_db.rs | 14 +++++++++++ src/internal/resolve.rs | 1 + src/main.rs | 6 ++--- src/operations/install.rs | 23 +++++------------ src/wrapper/mod.rs | 1 + src/wrapper/pacman.rs | 53 +++++++++++++++++++++++++++++++++++++++ 7 files changed, 79 insertions(+), 20 deletions(-) create mode 100644 src/internal/pacman_db.rs create mode 100644 src/internal/resolve.rs create mode 100644 src/wrapper/mod.rs create mode 100644 src/wrapper/pacman.rs diff --git a/src/internal/mod.rs b/src/internal/mod.rs index f387d26..a7f801a 100644 --- a/src/internal/mod.rs +++ b/src/internal/mod.rs @@ -11,6 +11,7 @@ pub mod error; pub mod exit_code; pub mod fs_utils; mod initialise; +pub mod resolve; pub mod rpc; mod sort; pub mod structs; diff --git a/src/internal/pacman_db.rs b/src/internal/pacman_db.rs new file mode 100644 index 0000000..a3f318f --- /dev/null +++ b/src/internal/pacman_db.rs @@ -0,0 +1,14 @@ +use alpm::Alpm; +use lazy_static::lazy_static; +use pacmanconf::Config; + +fn get_alpm() -> Alpm { + alpm_utils::alpm_with_conf(get_pacman_config()).unwrap() +} + +fn get_pacman_config() -> &'static Config { + lazy_static! { + static ref PACMAN_CONF: Config = Config::new().unwrap(); + } + &PACMAN_CONF +} diff --git a/src/internal/resolve.rs b/src/internal/resolve.rs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/internal/resolve.rs @@ -0,0 +1 @@ + diff --git a/src/main.rs b/src/main.rs index e492a80..37dcac3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,9 +7,9 @@ use crate::args::{InstallArgs, Operation, QueryArgs, RemoveArgs, SearchArgs}; use crate::internal::detect; use crate::internal::exit_code::AppExitCode; use crate::internal::{init, sort, start_sudoloop, structs::Options}; +use std::str::FromStr; use tracing_subscriber::fmt::format::FmtSpan; use tracing_subscriber::EnvFilter; -use std::str::FromStr; #[global_allocator] static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc; @@ -17,6 +17,7 @@ static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc; mod args; mod internal; mod operations; +mod wrapper; #[tokio::main(flavor = "current_thread")] async fn main() { @@ -64,8 +65,7 @@ async fn main() { /// Can be used for debug purposes _or_ verbose output fn init_logger() { const DEFAULT_ENV_FILTER: &str = "warn"; - let filter_string = - std::env::var("AME_LOG").unwrap_or_else(|_| DEFAULT_ENV_FILTER.to_string()); + let filter_string = std::env::var("AME_LOG").unwrap_or_else(|_| DEFAULT_ENV_FILTER.to_string()); let env_filter = EnvFilter::from_str(&*filter_string).expect("failed to parse env filter string"); tracing_subscriber::fmt::SubscriberBuilder::default() diff --git a/src/operations/install.rs b/src/operations/install.rs index 989a22d..be7408c 100644 --- a/src/operations/install.rs +++ b/src/operations/install.rs @@ -1,17 +1,9 @@ -use crate::internal::commands::ShellCommand; -use crate::internal::error::SilentUnwrap; use crate::internal::exit_code::AppExitCode; +use crate::wrapper::pacman::{PacmanInstallArgs, PacmanWrapper}; use crate::{crash, info, log, Options}; pub async fn install(packages: Vec, options: Options) { info!("Installing packages {} from repos", &packages.join(", ")); - let mut opers = vec!["-S", "--needed"]; - if options.noconfirm { - opers.push("--noconfirm"); - } - if options.asdeps { - opers.push("--asdeps"); - } let verbosity = options.verbosity; if !packages.is_empty() { @@ -19,14 +11,11 @@ pub async fn install(packages: Vec, options: Options) { log!("Installing from repos: {:?}", &packages); } - let status = ShellCommand::pacman() - .elevated() - .args(opers) - .args(&packages) - .wait() - .await - .silent_unwrap(AppExitCode::PacmanError); - if !status.success() { + let result = PacmanWrapper::install( + PacmanInstallArgs::from_options(options).packages(packages.clone()), + ) + .await; + if result.is_err() { crash!( AppExitCode::PacmanError, "An error occured while installing packages: {}, aborting", diff --git a/src/wrapper/mod.rs b/src/wrapper/mod.rs new file mode 100644 index 0000000..f4da7e8 --- /dev/null +++ b/src/wrapper/mod.rs @@ -0,0 +1 @@ +pub mod pacman; diff --git a/src/wrapper/pacman.rs b/src/wrapper/pacman.rs new file mode 100644 index 0000000..2339b67 --- /dev/null +++ b/src/wrapper/pacman.rs @@ -0,0 +1,53 @@ +use crate::internal::{commands::ShellCommand, error::AppResult, structs::Options}; + +pub struct PacmanWrapper; + +impl PacmanWrapper { + pub async fn install(args: PacmanInstallArgs) -> AppResult<()> { + let mut command = ShellCommand::pacman().elevated().arg("-S").arg("--needed"); + + if args.no_confirm { + command = command.arg("--noconfirm") + } + + if args.as_deps { + command = command.arg("--asdeps") + } + + command.args(args.packages).wait_success().await + } +} + +#[derive(Debug, Default)] +pub struct PacmanInstallArgs { + packages: Vec, + as_deps: bool, + no_confirm: bool, +} + +impl PacmanInstallArgs { + pub fn from_options(options: Options) -> Self { + Self::default() + .as_deps(options.asdeps) + .no_confirm(options.noconfirm) + } + + pub fn packages>(mut self, packages: I) -> Self { + let mut packages = packages.into_iter().collect(); + self.packages.append(&mut packages); + + self + } + + pub fn no_confirm(mut self, no_confirm: bool) -> Self { + self.no_confirm = no_confirm; + + self + } + + pub fn as_deps(mut self, as_deps: bool) -> Self { + self.as_deps = as_deps; + + self + } +}