mirror of
https://github.com/nix-community/home-manager
synced 2024-11-30 15:09:46 +01:00
a49ce0e9ed
Before the profile directory value would point directly to the build output in the Nix store. Unfortunately this would cause an infinite loop if the user's configuration directly or indirectly refers to the profile directory value. Fixes #1188
83 lines
2 KiB
Nix
83 lines
2 KiB
Nix
{ config, lib, pkgs, ... }:
|
||
|
||
with lib;
|
||
|
||
let
|
||
|
||
cfg = config.home-manager;
|
||
|
||
extendedLib = import ../modules/lib/stdlib-extended.nix pkgs.lib;
|
||
|
||
hmModule = types.submoduleWith {
|
||
specialArgs = { lib = extendedLib; };
|
||
modules = [(
|
||
{name, ...}: {
|
||
imports = import ../modules/modules.nix {
|
||
inherit pkgs;
|
||
lib = extendedLib;
|
||
};
|
||
|
||
config = {
|
||
submoduleSupport.enable = true;
|
||
submoduleSupport.externalPackageInstall = cfg.useUserPackages;
|
||
|
||
home.username = config.users.users.${name}.name;
|
||
home.homeDirectory = config.users.users.${name}.home;
|
||
};
|
||
}
|
||
)];
|
||
};
|
||
|
||
in
|
||
|
||
{
|
||
options = {
|
||
home-manager = {
|
||
useUserPackages = mkEnableOption ''
|
||
installation of user packages through the
|
||
<option>users.users.‹name?›.packages</option> option.
|
||
'';
|
||
|
||
users = mkOption {
|
||
type = types.attrsOf hmModule;
|
||
default = {};
|
||
description = ''
|
||
Per-user Home Manager configuration.
|
||
'';
|
||
};
|
||
};
|
||
};
|
||
|
||
config = mkIf (cfg.users != {}) {
|
||
warnings =
|
||
flatten (flip mapAttrsToList cfg.users (user: config:
|
||
flip map config.warnings (warning:
|
||
"${user} profile: ${warning}"
|
||
)
|
||
));
|
||
|
||
assertions =
|
||
flatten (flip mapAttrsToList cfg.users (user: config:
|
||
flip map config.assertions (assertion:
|
||
{
|
||
inherit (assertion) assertion;
|
||
message = "${user} profile: ${assertion.message}";
|
||
}
|
||
)
|
||
));
|
||
|
||
users.users = mkIf cfg.useUserPackages (
|
||
mapAttrs (username: usercfg: {
|
||
packages = [ usercfg.home.path ];
|
||
}) cfg.users
|
||
);
|
||
|
||
environment.pathsToLink = mkIf cfg.useUserPackages [ "/etc/profile.d" ];
|
||
|
||
system.activationScripts.postActivation.text =
|
||
concatStringsSep "\n" (mapAttrsToList (username: usercfg: ''
|
||
echo Activating home-manager configuration for ${username}
|
||
sudo -u ${username} -i ${usercfg.home.activationPackage}/activate
|
||
'') cfg.users);
|
||
};
|
||
}
|