diff --git a/crates/pacdef_core/src/backend/actual/flatpak.rs b/crates/pacdef_core/src/backend/actual/flatpak.rs index af284db..43a275c 100644 --- a/crates/pacdef_core/src/backend/actual/flatpak.rs +++ b/crates/pacdef_core/src/backend/actual/flatpak.rs @@ -10,6 +10,7 @@ use crate::{impl_backend_constants, Group, Package}; #[derive(Debug, Clone)] pub struct Flatpak { pub(crate) packages: HashSet, + pub(crate) systemwide: bool, } const BINARY: Text = "flatpak"; @@ -26,12 +27,20 @@ const SUPPORTS_AS_DEPENDENCY: bool = false; impl Backend for Flatpak { impl_backend_constants!(); + fn get_switches_runtime(&self) -> Switches { + if self.systemwide { + &[] + } else { + &["--user"] + } + } + fn get_all_installed_packages(&self) -> Result> { - Flatpak::get_installed_packages(true) + self.get_installed_packages(true) } fn get_explicitly_installed_packages(&self) -> Result> { - Flatpak::get_installed_packages(false) + self.get_installed_packages(false) } fn make_dependency(&self, _: &[Package]) -> Result { @@ -43,15 +52,19 @@ impl Flatpak { pub(crate) fn new() -> Self { Self { packages: HashSet::new(), + systemwide: true, } } - fn get_installed_packages(include_implicit: bool) -> Result> { + fn get_installed_packages(&self, include_implicit: bool) -> Result> { let mut cmd = Command::new(BINARY); cmd.args(&["list", "--columns=application"]); if !include_implicit { cmd.arg("--app"); } + if !self.systemwide { + cmd.arg("--user"); + } let output = String::from_utf8(cmd.output()?.stdout)?; Ok( diff --git a/crates/pacdef_core/src/backend/backend_trait.rs b/crates/pacdef_core/src/backend/backend_trait.rs index 8e6be52..9b84448 100644 --- a/crates/pacdef_core/src/backend/backend_trait.rs +++ b/crates/pacdef_core/src/backend/backend_trait.rs @@ -49,6 +49,11 @@ pub trait Backend: Debug { /// [`Backend::supports_as_dependency`]. fn get_switches_make_dependency(&self) -> Switches; + /// Get CLI switches evaluated at runtime + fn get_switches_runtime(&self) -> Switches { + &[] + } + /// Load all packages from a set of groups. The backend will visit all groups, /// find its own section, and clone all packages into its own struct. fn load(&mut self, groups: &HashSet); @@ -80,6 +85,7 @@ pub trait Backend: Debug { fn install_packages(&self, packages: &[Package], noconfirm: bool) -> Result { let mut cmd = Command::new(self.get_binary()); cmd.args(self.get_switches_install()); + cmd.args(self.get_switches_runtime()); if noconfirm { cmd.args(self.get_switches_noconfirm()); @@ -102,6 +108,7 @@ pub trait Backend: Debug { fn make_dependency(&self, packages: &[Package]) -> Result { let mut cmd = Command::new(self.get_binary()); cmd.args(self.get_switches_make_dependency()); + cmd.args(self.get_switches_runtime()); for p in packages { cmd.arg(format!("{p}")); @@ -115,6 +122,7 @@ pub trait Backend: Debug { fn remove_packages(&self, packages: &[Package], noconfirm: bool) -> Result { let mut cmd = Command::new(self.get_binary()); cmd.args(self.get_switches_remove()); + cmd.args(self.get_switches_runtime()); if noconfirm { cmd.args(self.get_switches_noconfirm()); @@ -143,6 +151,7 @@ pub trait Backend: Debug { fn show_package_info(&self, package: &Package) -> Result { let mut cmd = Command::new(self.get_binary()); cmd.args(self.get_switches_info()); + cmd.args(self.get_switches_runtime()); cmd.arg(format!("{package}")); cmd.status() .with_context(|| format!("running command {cmd:?}")) diff --git a/crates/pacdef_core/src/config.rs b/crates/pacdef_core/src/config.rs index e0e39f8..d791425 100644 --- a/crates/pacdef_core/src/config.rs +++ b/crates/pacdef_core/src/config.rs @@ -13,6 +13,8 @@ pub struct Config { pub aur_helper: String, /// Additional arguments to pass to `aur_helper` when removing a package. pub aur_rm_args: Option>, + /// Install Flatpak packages system-wide + pub flatpak_systemwide: bool, /// Warn the user when a group is not a symlink. pub warn_not_symlinks: bool, /// Backends the user does not want to use even though the binary exists. @@ -68,6 +70,7 @@ impl Default for Config { Self { aur_helper: "paru".into(), aur_rm_args: None, + flatpak_systemwide: true, warn_not_symlinks: true, disabled_backends: vec![], } diff --git a/crates/pacdef_core/src/core.rs b/crates/pacdef_core/src/core.rs index 7a1cb67..dcda504 100644 --- a/crates/pacdef_core/src/core.rs +++ b/crates/pacdef_core/src/core.rs @@ -128,6 +128,13 @@ impl Pacdef { arch.aur_rm_args = self.config.aur_rm_args.take(); } } + + #[cfg(feature = "flatpak")] + { + if let Some(flatpak) = backend.as_any_mut().downcast_mut::() { + flatpak.systemwide = self.config.flatpak_systemwide; + } + } } fn install_packages(&mut self, args: &ArgMatches) -> Result<()> {