old
1{
2 den,
3 lib,
4 ...
5}: let
6 # Shared collector body for the home-manager persistence quirks. Reused by
7 # two distinct aspects so that the same logic runs at both the host scope
8 # (projected onto users via the host-aspects battery) and the user scope.
9 homeCollector = {
10 persistHome,
11 cacheHome,
12 config,
13 ...
14 }: let
15 _removeHomePrefix = path: lib.removePrefix "${config.home.homeDirectory}/" path;
16 removeHomePrefix = path:
17 if (lib.typeOf path == "string")
18 then _removeHomePrefix path
19 else path // {directory = _removeHomePrefix path.directory;};
20 removeHomePrefixes = paths: lib.map removeHomePrefix paths;
21 mergePersist = entries: {
22 directories = lib.unique (lib.concatMap (e: removeHomePrefixes (e.directories or [])) entries);
23 files = lib.unique (lib.concatMap (e: removeHomePrefixes (e.files or [])) entries);
24 };
25 in {
26 home.persistence.persist =
27 (mergePersist persistHome)
28 // {
29 persistentStoragePath = "/persist";
30 };
31 home.persistence.cache =
32 (mergePersist cacheHome)
33 // {
34 persistentStoragePath = "/cache";
35 };
36 };
37in {
38 den.quirks.persist.description = "Persistent directories/files collected from aspects (host)";
39 den.quirks.cache.description = "Cache directories/files collected from aspects (host)";
40 den.quirks.persistUser.description = "Persistent directories/files collected from aspects (user)";
41 den.quirks.cacheUser.description = "Cache directories/files collected from aspects (user)";
42 den.quirks.persistHome.description = "Persistent directories/files collected from aspects (home manager)";
43 den.quirks.cacheHome.description = "Cache directories/files collected from aspects (home manager)";
44
45 den.aspects.core.impermanence.persist-collector = {
46 nixos = {
47 persist,
48 cache,
49 ...
50 }: let
51 mergePersist = entries: {
52 directories = lib.unique (lib.concatMap (e: e.directories or []) entries);
53 files = lib.unique (lib.concatMap (e: e.files or []) entries);
54 };
55 in {
56 environment.persistence.persist = mergePersist persist;
57 environment.persistence.cache = mergePersist cache;
58 };
59 };
60
61 den.aspects.core.impermanence.persist-user-collector = {
62 user = {
63 user,
64 persistUser,
65 cacheUser,
66 config,
67 ...
68 }: let
69 _removeHomePrefix = path: lib.removePrefix "${config.users.users.${user.userName}.home}/" path;
70 removeHomePrefix = path:
71 if (lib.typeOf path == "string")
72 then _removeHomePrefix path
73 else path // {directory = _removeHomePrefix path.directory;};
74 removeHomePrefixes = paths: lib.map removeHomePrefix paths;
75 mergePersist = entries: {
76 directories = lib.unique (lib.concatMap (e: removeHomePrefixes (e.directories or [])) entries);
77 files = lib.unique (lib.concatMap (e: removeHomePrefixes (e.files or [])) entries);
78 };
79 in {
80 persistence.persist = mergePersist persistUser;
81 persistence.cache = mergePersist cacheUser;
82 };
83 };
84
85 den.aspects.core.impermanence.persist-home-collector.homeManager = homeCollector;
86 den.aspects.core.impermanence.persist-home-user-collector.homeManager = homeCollector;
87
88 den.default.includes = (
89 den.lib.policy.when
90 ({host, ...}:
91 host.hasAspect {
92 name = "impermanence";
93 meta.provider = ["core"];
94 })
95 [den.aspects.core.impermanence.persist-home-user-collector]
96 );
97}