about summary refs log tree commit diff
path: root/modules/home/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'modules/home/default.nix')
-rw-r--r--modules/home/default.nix87
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);
+      };
+    };
+  }