diff --git a/config.example.toml b/config.example.toml index f499d093..b4bcb905 100644 --- a/config.example.toml +++ b/config.example.toml @@ -66,12 +66,13 @@ #greedy_cask = true [linux] -# Arch Package Manager to use. Allowed values: autodetect, trizen, paru, yay, pacman. +# Arch Package Manager to use. Allowed values: autodetect, trizen, paru, yay, pikaur, pacman. #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 = "" #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 6e4e0a27..cf78fdb2 100644 --- a/src/config.rs +++ b/src/config.rs @@ -199,6 +199,7 @@ pub enum ArchPackageManager { Paru, Yay, Pacman, + Pikaur, } #[derive(Deserialize, Default, Debug)] @@ -208,6 +209,7 @@ pub struct Linux { arch_package_manager: Option, show_arch_news: Option, trizen_arguments: Option, + pikaur_arguments: Option, dnf_arguments: Option, apt_arguments: Option, enable_tlmgr: Option, @@ -677,6 +679,16 @@ impl Config { .unwrap_or("") } + /// Extra Pikaur arguments + #[allow(dead_code)] + pub fn pikaur_arguments(&self) -> &str { + self.config_file + .linux + .as_ref() + .and_then(|s| s.pikaur_arguments.as_deref()) + .unwrap_or("") + } + /// Show news on Arch Linux #[allow(dead_code)] pub fn show_arch_news(&self) -> bool { diff --git a/src/steps/os/archlinux.rs b/src/steps/os/archlinux.rs index bb74c86a..e7fde106 100644 --- a/src/steps/os/archlinux.rs +++ b/src/steps/os/archlinux.rs @@ -150,6 +150,46 @@ impl Pacman { } } +pub struct Pikaur { + executable: PathBuf, +} + +impl Pikaur { + fn get() -> Option { + Some(Self { + executable: which("pikaur")?, + }) + } +} + +impl ArchPackageManager for Pikaur { + fn upgrade(&self, ctx: &ExecutionContext) -> Result<()> { + let mut command = ctx.run_type().execute(&self.executable); + + command + .arg("-Syu") + .args(ctx.config().pikaur_arguments().split_whitespace()) + .env("PATH", get_execution_path()); + + if ctx.config().yes(Step::System) { + command.arg("--noconfirm"); + } + + command.check_run()?; + + if ctx.config().cleanup() { + let mut command = ctx.run_type().execute(&self.executable); + command.arg("-Sc"); + if ctx.config().yes(Step::System) { + command.arg("--noconfirm"); + } + command.check_run()?; + } + + Ok(()) + } +} + fn box_package_manager(package_manager: P) -> Box { Box::new(package_manager) as Box } @@ -161,15 +201,14 @@ pub fn get_arch_package_manager(ctx: &ExecutionContext) -> Option YayParu::get("paru", &pacman) .map(box_package_manager) .or_else(|| YayParu::get("yay", &pacman).map(box_package_manager)) - .or_else(|| { - Trizen::get() - .map(box_package_manager) - .or_else(|| Pacman::get(ctx).map(box_package_manager)) - }), + .or_else(|| Trizen::get().map(box_package_manager)) + .or_else(|| Pikaur::get().map(box_package_manager)) + .or_else(|| Pacman::get(ctx).map(box_package_manager)), config::ArchPackageManager::Trizen => 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), } }