diff --git a/config.example.toml b/config.example.toml index 4e162058..5757a292 100644 --- a/config.example.toml +++ b/config.example.toml @@ -57,6 +57,9 @@ # Whether to self update (this is ignored if the binary has been built without self update support, available also via setting the environment variable TOPGRADE_NO_SELF_UPGRADE) #no_self_update = true +# Extra Home Manager arguments +#home_manager_arguments = ["--flake", "file"] + # Commands to run before anything [pre_commands] #"Emacs Snapshot" = "rm -rf ~/.emacs.d/elpa.bak && cp -rl ~/.emacs.d/elpa ~/.emacs.d/elpa.bak" diff --git a/src/config.rs b/src/config.rs index ebded59a..9d709c21 100644 --- a/src/config.rs +++ b/src/config.rs @@ -351,6 +351,9 @@ pub struct Linux { #[merge(strategy = crate::utils::merge_strategies::string_append_opt)] emerge_update_flags: Option, + + #[merge(strategy = crate::utils::merge_strategies::vec_prepend_opt)] + home_manager_arguments: Option>, } #[derive(Deserialize, Default, Debug, Merge)] @@ -1275,6 +1278,14 @@ impl Config { .and_then(|linux| linux.nix_arguments.as_deref()) } + /// Extra Home Manager arguments + pub fn home_manager(&self) -> Option<&Vec> { + self.config_file + .linux + .as_ref() + .and_then(|misc| misc.home_manager_arguments.as_ref()) + } + /// Distrobox use root pub fn distrobox_root(&self) -> bool { self.config_file diff --git a/src/steps/os/unix.rs b/src/steps/os/unix.rs index aa9eb41c..3d4cf1eb 100644 --- a/src/steps/os/unix.rs +++ b/src/steps/os/unix.rs @@ -442,7 +442,15 @@ pub fn run_home_manager(ctx: &ExecutionContext) -> Result<()> { let home_manager = require("home-manager")?; print_separator("home-manager"); - ctx.run_type().execute(home_manager).arg("switch").status_checked() + + let mut cmd = ctx.run_type().execute(home_manager); + cmd.arg("switch"); + + if let Some(extra_args) = ctx.config().home_manager() { + cmd.args(extra_args); + } + + cmd.status_checked() } pub fn run_tldr(ctx: &ExecutionContext) -> Result<()> {