diff --git a/config.example.toml b/config.example.toml index b4bcb905..231a6e60 100644 --- a/config.example.toml +++ b/config.example.toml @@ -66,13 +66,14 @@ #greedy_cask = true [linux] -# Arch Package Manager to use. Allowed values: autodetect, trizen, paru, yay, pikaur, pacman. +# Arch Package Manager to use. Allowed values: autodetect, trizen, paru, yay, pikaur, pacman, pamac. #arch_package_manager = "pacman" # Arguments to pass yay (or paru) when updating packages #yay_arguments = "--nodevel" #show_arch_news = true #trizen_arguments = "--devel" #pikaur_arguments = "" +#pamac_arguments = "--no-devel" #enable_tlmgr = true #emerge_sync_flags = "-q" #emerge_update_flags = "-uDNa --with-bdeps=y world" diff --git a/src/config.rs b/src/config.rs index 46b51fcd..9eec74c7 100644 --- a/src/config.rs +++ b/src/config.rs @@ -202,6 +202,7 @@ pub enum ArchPackageManager { Yay, Pacman, Pikaur, + Pamac, } #[derive(Deserialize, Default, Debug)] @@ -212,6 +213,7 @@ pub struct Linux { show_arch_news: Option, trizen_arguments: Option, pikaur_arguments: Option, + pamac_arguments: Option, dnf_arguments: Option, apt_arguments: Option, enable_tlmgr: Option, @@ -696,6 +698,15 @@ impl Config { .unwrap_or("") } + /// Extra Pamac arguments + pub fn pamac_arguments(&self) -> &str { + self.config_file + .linux + .as_ref() + .and_then(|s| s.pamac_arguments.as_deref()) + .unwrap_or("") + } + /// Show news on Arch Linux pub fn show_arch_news(&self) -> bool { self.config_file diff --git a/src/steps/os/archlinux.rs b/src/steps/os/archlinux.rs index e7fde106..60e8138e 100644 --- a/src/steps/os/archlinux.rs +++ b/src/steps/os/archlinux.rs @@ -190,6 +190,45 @@ impl ArchPackageManager for Pikaur { } } +pub struct Pamac { + executable: PathBuf, +} + +impl Pamac { + fn get() -> Option { + Some(Self { + executable: which("pamac")?, + }) + } +} +impl ArchPackageManager for Pamac { + fn upgrade(&self, ctx: &ExecutionContext) -> Result<()> { + let mut command = ctx.run_type().execute(&self.executable); + + command + .arg("upgrade") + .args(ctx.config().pamac_arguments().split_whitespace()) + .env("PATH", get_execution_path()); + + if ctx.config().yes(Step::System) { + command.arg("--no-confirm"); + } + + command.check_run()?; + + if ctx.config().cleanup() { + let mut command = ctx.run_type().execute(&self.executable); + command.arg("clean"); + if ctx.config().yes(Step::System) { + command.arg("--no-confirm"); + } + command.check_run()?; + } + + Ok(()) + } +} + fn box_package_manager(package_manager: P) -> Box { Box::new(package_manager) as Box } @@ -203,12 +242,14 @@ pub fn get_arch_package_manager(ctx: &ExecutionContext) -> Option Trizen::get().map(box_package_manager), config::ArchPackageManager::Paru => YayParu::get("paru", &pacman).map(box_package_manager), config::ArchPackageManager::Yay => YayParu::get("yay", &pacman).map(box_package_manager), config::ArchPackageManager::Pacman => Pacman::get(ctx).map(box_package_manager), config::ArchPackageManager::Pikaur => Pikaur::get().map(box_package_manager), + config::ArchPackageManager::Pamac => Pamac::get().map(box_package_manager), } }