diff options
Diffstat (limited to 'modules/home/default.nix')
-rw-r--r-- | modules/home/default.nix | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/modules/home/default.nix b/modules/home/default.nix new file mode 100644 index 000000000000..0ad1cb85b255 --- /dev/null +++ b/modules/home/default.nix @@ -0,0 +1,87 @@ +{ lib, config, ... }: + +let + inherit (lib) attrValues concatStringsSep mapAttrsToList mkOption + optionalString recursiveUpdate; + inherit (lib.types) bool loaOf nullOr str submodule; + + dirOpts = { ... }: { + options = { + owner = mkOption { + default = null; + type = nullOr str; + }; + group = mkOption { + default = "users"; + type = str; + }; + permissions = mkOption { + default = "0700"; + type = str; + }; + activationScripts = mkOption { + default = {}; + type = loaOf str; + }; + }; + }; + + applyDirConfig = user: dir: + let + owner = if dir.owner == null + then user + else config.users.users.${dir.owner}; + in + '' + chmod ${dir.permissions} . + chown ${owner.name}:${dir.group} . + ${concatStringsSep "\n" (attrValues dir.activationScripts)} + ''; + +in + { + options = { + home = mkOption { + default = {}; + type = loaOf (submodule (args: recursiveUpdate (dirOpts args) { + options = { + imperativeNix = mkOption { + default = false; + type = bool; + }; + dirs = mkOption { + default = {}; + type = loaOf (submodule dirOpts); + }; + }; + })); + }; + }; + + config = { + system.activationScripts.home = { + deps = []; + text = concatStringsSep "\n" (mapAttrsToList + (key: home: + let + user = config.users.users.${key}; + + in '' + ${optionalString (!home.imperativeNix) '' + rm -rf ${user.home}/.nix-{defexpr,profile} + ''} + + pushd ${user.home} >/dev/null + ${applyDirConfig user home} + ${concatStringsSep "\n" (mapAttrsToList (name: dir: '' + mkdir -p ${name} + pushd ${name} >/dev/null + ${applyDirConfig user dir} + popd >/dev/null + '') home.dirs)} + popd >/dev/null + '' + ) config.home); + }; + }; + } |