From eb0fa99c7cfcb863cfcc3c1ba15aa0fbc2fcb120 Mon Sep 17 00:00:00 2001 From: Scott Worley Date: Mon, 20 Apr 2020 15:45:30 -0700 Subject: [PATCH] Upgrade user environments --- modules/auto-upgrade.nix | 73 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) diff --git a/modules/auto-upgrade.nix b/modules/auto-upgrade.nix index 3a0d25d..216c4ba 100644 --- a/modules/auto-upgrade.nix +++ b/modules/auto-upgrade.nix @@ -6,13 +6,43 @@ let flock /run/auto-upgrade-with-pinch ${ pkgs.writeShellScript "auto-upgrade-with-lock-held" '' set -e + + in_tmpdir() { + d=$(mktemp -d) + pushd "$d" + "$@" + popd + rm -r "$d" + } + + as_user() { + ${ + if cfg.userEnvironment.enable then '' + sudo -u ${escapeShellArg cfg.userEnvironment.user} "$@" + '' else '' + : + '' + } + } + + # Update channels ( cd /etc/nixos ${pkgs.keyedgit cfg.key}/bin/git pull --ff-only --verify-signatures ${pkgs.pinch}/bin/pinch update channels ) - ${config.system.build.nixos-rebuild}/bin/nixos-rebuild switch --no-build-output + # Build + in_tmpdir ${config.system.build.nixos-rebuild}/bin/nixos-rebuild build + as_user nix-build '' -A ${ + escapeShellArg cfg.userEnvironment.package + } + + # Install + ${config.system.build.nixos-rebuild}/bin/nixos-rebuild switch + as_user nix-env -f '' -riA ${ + escapeShellArg cfg.userEnvironment.package + } '' } ''; @@ -48,6 +78,41 @@ in { at the tip of the remote branch is signed with this key. ''; }; + + userEnvironment = { + enable = mkOption { + type = types.bool; + default = false; + description = '' + Whether to update a user-environment as well. This update is done + with nix-env -riA. Note the -r! I.e., ALL OTHER PACKAGES INSTALLED + WITH nix-env WILL BE DELETED! + + This presumes that you have configured an "entire user environment" + package as shown in + https://nixos.wiki/wiki/FAQ#How_can_I_manage_software_with_nix-env_like_with_configuration.nix.3F + + To check if you're set up for this, run "nix-env --query". If it + only lists one package, you're good to go. + ''; + }; + + user = mkOption { + type = types.str; + description = '' + The username of the user whose environment should be updated. + ''; + }; + + package = mkOption { + type = types.str; + example = "nixos.userPackages"; + description = '' + The name of the single package that is the user's entire environment. + ''; + }; + + }; }; }; @@ -123,5 +188,11 @@ in { startAt = cfg.dates; }; + + assertions = [{ + assertion = cfg.userEnvironment.enable -> cfg.enable; + message = + "User environment upgrades cannot yet be enabled separately from system upgrades."; + }]; }; } -- 2.44.1