forked from divnix/digga
-
Notifications
You must be signed in to change notification settings - Fork 0
/
fup-adapter.nix
176 lines (157 loc) · 4.9 KB
/
fup-adapter.nix
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
# constructor dependencies
{
lib,
self,
inputs,
darwin,
flake-utils-plus,
collectors,
internal-modules,
...
}: {
# evaluated digga configuration
config,
# extra arguments that are passed down to fup
extraArgs,
# pass a custom default fup outputs builder
defaultOutputsBuilder,
}: let
sharedOverlays = [
(final: prev: {
__dontExport = true;
lib = prev.lib.extend (lfinal: lprev: {
# digga lib can be accessed in packages as lib.digga
digga = lib;
});
})
];
defaultHostModules = [
(internal-modules.hmNixosDefaults {
specialArgs = config.home.importables // {inherit self inputs;};
modules = config.home.modules ++ config.home.exportedModules;
})
(internal-modules.globalDefaults {
hmUsers = config.home.users;
})
({...} @ args: {
lib.specialArgs =
args.specialArgs
or (builtins.trace ''
WARNING: specialArgs is not accessibly by the module system which means you
are likely using NixOS 20.09. Profiles testing and custom builds (ex: iso)
are not supported in 20.09 and using them could result in infinite
recursion errors. It is recommended to update to 21.05 to use either feature.
''
{});
})
];
unifyOverlays = channels: let
getChannel = inputs."${channelName}".legacyPackages.x86_64-linux;
channelName = builtins.elemAt (builtins.attrNames channels) 0;
in
map (o:
if builtins.isFunction (o getChannel getChannel)
then o channels
else o);
stripChannel = channel:
removeAttrs channel [
# arguments in our channels api that shouldn't be passed to fup
"overlays"
];
# evalArgs sets channelName and system to null by default
# but for proper default handling in fup, null args have to be removed
stripNull = args: (lib.filterAttrs (_: arg: arg != null) args);
stripHost = args:
removeAttrs (stripNull args) [
# arguments in our hosts/hostDefaults api that shouldn't be passed to fup
"externalModules" # TODO: remove deprecated option
"exportedModules"
"tests"
];
nixosHostDefaults =
flake-utils-plus.lib.mergeAny
{
system = "x86_64-linux";
output = "nixosConfigurations";
# add `self` & `inputs` as specialArgs so their libs can be used in imports
specialArgs = config.nixos.importables // {inherit (config) self inputs;};
modules =
config.nixos.hostDefaults.exportedModules
++ defaultHostModules
++ [
internal-modules.nixosDefaults
];
}
(stripNull config.nixos.hostDefaults);
nixosHosts =
lib.mapAttrs
(
_: hostConfig:
flake-utils-plus.lib.mergeAny
nixosHostDefaults
(stripNull hostConfig)
)
config.nixos.hosts;
darwinHostDefaults =
flake-utils-plus.lib.mergeAny
{
system = "x86_64-darwin";
output = "darwinConfigurations";
builder = darwin.lib.darwinSystem;
# add `self` & `inputs` as specialArgs so their libs can be used in imports
specialArgs = config.darwin.importables // {inherit (config) self inputs;};
modules = config.darwin.hostDefaults.exportedModules ++ defaultHostModules;
}
(stripNull config.darwin.hostDefaults);
darwinHosts =
lib.mapAttrs
(
_: hostConfig:
flake-utils-plus.lib.mergeAny
darwinHostDefaults
(stripNull hostConfig)
)
config.darwin.hosts;
diggaFupArgs = {
inherit
(config)
channelsConfig
supportedSystems
;
inherit self inputs sharedOverlays;
hosts =
builtins.mapAttrs (_: stripHost)
(collectors.collectHosts nixosHosts darwinHosts);
channels =
builtins.mapAttrs
(
name: channel:
stripChannel (channel
// {
# pass channels if "overlay" has three arguments
overlaysBuilder = channels: unifyOverlays channels channel.overlays;
})
)
config.channels;
nixosModules = flake-utils-plus.lib.exportModules config.nixos.hostDefaults.exportedModules;
darwinModules = flake-utils-plus.lib.exportModules config.darwin.hostDefaults.exportedModules;
homeModules = flake-utils-plus.lib.exportModules config.home.exportedModules;
devshellModules = flake-utils-plus.lib.exportModules config.devshell.exportedModules;
overlays = flake-utils-plus.lib.exportOverlays {
# since we can't detect overlays owned by self
# we have to filter out ones exported by the inputs
# optimally we would want a solution for NixOS/nix#4740
inherit (self) pkgs;
inherit inputs;
};
outputsBuilder = channels:
flake-utils-plus.lib.mergeAny
(defaultOutputsBuilder channels)
(config.outputsBuilder channels);
};
in
flake-utils-plus.lib.mkFlake (
flake-utils-plus.lib.mergeAny
diggaFupArgs
extraArgs # for overlays list order
)