Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d1509990d5 | ||
|
|
fa9b432863 | ||
|
|
bdcc48862a | ||
|
|
630bdc1aff | ||
|
|
ace1a4de4a | ||
|
|
aae49abd24 | ||
|
|
6df26565cc | ||
|
|
ca5ebe7944 | ||
|
|
7aecfa65b1 | ||
|
|
47dce54964 | ||
|
|
c85fc43ec4 | ||
|
|
290b8ddcec | ||
|
|
b808266530 | ||
|
|
520275ecd2 | ||
|
|
3faef2f89e | ||
|
|
b9077813ad | ||
|
|
c8e09b71e8 | ||
|
|
69467c1eae | ||
|
|
1765c1e3b8 | ||
|
|
8a0834c2df | ||
|
|
63b0698ba5 | ||
|
|
4a516533e1 | ||
|
|
1dfe00ac1f | ||
|
|
290f470357 | ||
|
|
7e8adc0279 | ||
|
|
8829d267e6 | ||
|
|
5c608097fe | ||
|
|
44d4db7bba | ||
|
|
9efffe30cb | ||
|
|
da2e90f1e1 | ||
|
|
d99c0a0c61 | ||
|
|
310f5f2716 | ||
|
|
a22f471fcf | ||
|
|
6c2ccf4be4 | ||
|
|
6d1f01fee7 | ||
|
|
2e8ec143cc | ||
|
|
2a0cd569dd | ||
|
|
0fcbc7219a | ||
|
|
0bb7640ac9 | ||
|
|
84922541ab | ||
|
|
36f21917cf | ||
|
|
6b987ae658 | ||
|
|
ce2674687c | ||
|
|
e23360a041 | ||
|
|
02c9d6e105 | ||
|
|
3ff2389e8e | ||
|
|
c1bedb69ae | ||
|
|
8a155aa7be | ||
|
|
332a9662b1 | ||
|
|
a2182a356b | ||
|
|
4dc1786f4a | ||
|
|
c6f60caed2 | ||
|
|
c786ba89cf | ||
|
|
1679651f5a | ||
|
|
2eacc68d71 | ||
|
|
5535782e06 | ||
|
|
488fe4ccf9 | ||
|
|
3c4043c811 | ||
|
|
22c71c0237 | ||
|
|
f51042501c | ||
|
|
f70075542c | ||
|
|
b2575ad3fb | ||
|
|
12201674ba | ||
|
|
5427a7aac5 | ||
|
|
cc43720448 | ||
|
|
8c6a5c151f | ||
|
|
944b3af0d3 | ||
|
|
2ad1489ce4 | ||
|
|
af21783405 | ||
|
|
50b6eb7e1a | ||
|
|
4933be8b36 | ||
|
|
32ce8dd14b | ||
|
|
f355286dc8 | ||
|
|
f7cdc9a29f | ||
|
|
eb0e5249f0 | ||
|
|
b00a48a688 | ||
|
|
7423812be7 | ||
|
|
af880ce23d | ||
|
|
99f7c5f6a7 | ||
|
|
63402398e5 | ||
|
|
bfb5b076c5 | ||
|
|
2b4980946d | ||
|
|
5345accaef | ||
|
|
cfcd210604 | ||
|
|
8d69a799dd | ||
|
|
3ff687255a | ||
|
|
d833258e7c | ||
|
|
dba61f7fd9 | ||
|
|
e03a114811 | ||
|
|
5c1107e84d | ||
|
|
211be6a123 | ||
|
|
dee41b2312 | ||
|
|
681a0c0de9 | ||
|
|
b851964de0 | ||
|
|
75dbdc99d8 | ||
|
|
01ee7f36d8 | ||
|
|
1a33877231 | ||
|
|
57fe05fbe5 | ||
|
|
6aaa2a772e | ||
|
|
11836fda56 | ||
|
|
59f3505cb7 | ||
|
|
2c30add7ac | ||
|
|
ec417b3217 | ||
|
|
42d722c51b | ||
|
|
049b3a03ad | ||
|
|
ed6c698372 | ||
|
|
f769bfaa2c | ||
|
|
ed979af0be | ||
|
|
476badc312 | ||
|
|
c2ec8f32c9 | ||
|
|
35efeaa2fc | ||
|
|
ba3b068893 | ||
|
|
d6cdac193d | ||
|
|
cbe122bcc2 | ||
|
|
d0c4357d1c | ||
|
|
dad8a05b5c | ||
|
|
218085701c | ||
|
|
2a1b77ab98 | ||
|
|
141f036601 | ||
|
|
04581d1682 | ||
|
|
771fac7143 | ||
|
|
610b8b1fa7 | ||
|
|
8588e2fd89 | ||
|
|
5ea4a9a8a4 | ||
|
|
48bb8aa77f | ||
|
|
a44acd3b60 | ||
|
|
c25b457997 | ||
|
|
2dba2fc402 | ||
|
|
d7b4f4c39a | ||
|
|
9a007fbe95 | ||
|
|
bc64041fc3 | ||
|
|
2524cc2e55 | ||
|
|
2d0fdf93f0 | ||
|
|
0ded5d47c0 | ||
|
|
81240e55cd | ||
|
|
bb2fe73afc | ||
|
|
9ae0ee14ba | ||
|
|
612b70bad8 | ||
|
|
c92a062914 | ||
|
|
97c5753b38 | ||
|
|
d1bf54b2d8 | ||
|
|
49d026780a | ||
|
|
870a7c882a | ||
|
|
1424cb1a1e | ||
|
|
0b32cd98b3 | ||
|
|
8780d9e8a2 | ||
|
|
cf5313ba17 | ||
|
|
e2f7f50bd1 | ||
|
|
ae7e71d36f | ||
|
|
4cbdb9d0a7 | ||
|
|
ff5af4604d | ||
|
|
f6af32f48f | ||
|
|
a5a64689c1 | ||
|
|
d63131d825 | ||
|
|
3bf39280b2 | ||
|
|
1926f42c4a | ||
|
|
e62105410d | ||
|
|
ab1b44f998 | ||
|
|
d199d292d3 | ||
|
|
08a033b11e | ||
|
|
dfd73de1aa | ||
|
|
1ad34a2440 | ||
|
|
fd01a4d589 | ||
|
|
503b091d32 | ||
|
|
6c42748adc | ||
|
|
dfe8fcc4f8 | ||
|
|
d0a8ee2fcc | ||
|
|
733659ac54 | ||
|
|
5a73219a92 | ||
|
|
097f0a874b | ||
|
|
3d221ee503 | ||
|
|
bb919d6783 | ||
|
|
d94a92f3d1 | ||
|
|
dcad3e7fed | ||
|
|
9eaedb1b23 | ||
|
|
093920f6ec | ||
|
|
3919903073 | ||
|
|
d829cfde1e | ||
|
|
2e4f6c9011 | ||
|
|
3ba820f907 | ||
|
|
5630b655f8 | ||
|
|
c7a6e85e60 | ||
|
|
5c81c4fc38 | ||
|
|
8b9d435149 | ||
|
|
c341e82468 | ||
|
|
d93a27c38a | ||
|
|
233f78f8a7 | ||
|
|
e1c933a1fe | ||
|
|
894892c097 | ||
|
|
894b520427 | ||
|
|
3a0d033524 | ||
|
|
1712cd7191 | ||
|
|
18f4509efa | ||
|
|
c787ddb428 | ||
|
|
f454cddcec | ||
|
|
e5e964bece | ||
|
|
56906a34d5 | ||
|
|
5fe8ee563e | ||
|
|
3a0242e541 | ||
|
|
0e74363279 | ||
|
|
fc831a4872 | ||
|
|
2a7bab7211 | ||
|
|
ff8da2cbdf | ||
|
|
0258ae745f | ||
|
|
0a1629ac01 | ||
|
|
52c3717723 | ||
|
|
7e1fe0b065 | ||
|
|
f3c733c821 | ||
|
|
5a2c55bd7a | ||
|
|
8a6d9a69b4 | ||
|
|
dde74e3aa3 | ||
|
|
2bc176de92 | ||
|
|
cbca266bd2 | ||
|
|
d0d9efffc2 | ||
|
|
bb4252c69f | ||
|
|
ea5fef4dfa | ||
|
|
4ae0a5c945 | ||
|
|
2348dee3db | ||
|
|
3354b24cd5 | ||
|
|
cc851d2a2e | ||
|
|
912ed376a2 | ||
|
|
4d028a03c7 | ||
|
|
f0f9d1443f | ||
|
|
4fc56e0ae3 | ||
|
|
ce7e7f8078 | ||
|
|
6005906221 | ||
|
|
6191784d3a | ||
|
|
7fd4b631fd | ||
|
|
349a12ae06 | ||
|
|
6c8b435202 | ||
|
|
0daa5808d5 | ||
|
|
2e5e3ded8d | ||
|
|
604382115a | ||
|
|
ef30ea4f79 | ||
|
|
74b91ab60c | ||
|
|
aabdf70725 | ||
|
|
fe2b0ab375 | ||
|
|
05bd7b71c3 | ||
|
|
90da5784ac | ||
|
|
f8037ad20c | ||
|
|
c877405101 | ||
|
|
51f71e2472 | ||
|
|
b00cbafc9d | ||
|
|
4e1ddd2556 | ||
|
|
a2659f53d0 | ||
|
|
fa471428f0 | ||
|
|
fe1e674abf | ||
|
|
ccf65596d2 | ||
|
|
666092aa72 | ||
|
|
64b3c6769b | ||
|
|
53ce9d5c6e | ||
|
|
e3a15547e6 | ||
|
|
5b98f2177f | ||
|
|
36ca65b92c | ||
|
|
698ed94e18 | ||
|
|
70a01b6296 | ||
|
|
2d75dbc7c4 | ||
|
|
aa71a0d5c0 | ||
|
|
1525e0cf64 | ||
|
|
cb4917933b | ||
|
|
1d4d973fa8 | ||
|
|
ff3d996583 | ||
|
|
56a9c4f952 | ||
|
|
7d987bf8e5 | ||
|
|
2081b2629e | ||
|
|
cd4a83ea30 | ||
|
|
211d9159f7 | ||
|
|
72529947d7 | ||
|
|
ef3a868cda | ||
|
|
c08541f8ce | ||
|
|
426c1d28b7 | ||
|
|
59cbee72e7 | ||
|
|
1d7d0711ce | ||
|
|
89ca24704b | ||
|
|
2ff4e18a9c | ||
|
|
2bfe93d068 | ||
|
|
50e8f517ff | ||
|
|
15c1290aef | ||
|
|
d60f5e492a | ||
|
|
e69acddf10 | ||
|
|
42e3c1d0d9 | ||
|
|
34e010bd73 | ||
|
|
baaecaef0d | ||
|
|
8e7e816cbb | ||
|
|
5cc15fac20 | ||
|
|
0a5aed6961 | ||
|
|
a873d216f5 | ||
|
|
2b29300c62 | ||
|
|
875fc51d93 | ||
|
|
5484d0d30e | ||
|
|
83d6714e7f | ||
|
|
1ee565936f | ||
|
|
28d6b42dff | ||
|
|
1361610f69 | ||
|
|
de57a61451 | ||
|
|
9845a82cca | ||
|
|
012636d902 | ||
|
|
0462b83c2a | ||
|
|
5f45dcaa7a | ||
|
|
607d13c7e1 | ||
|
|
60e4e10001 | ||
|
|
9cd4fd9793 | ||
|
|
27536cb92d | ||
|
|
a84b815ce3 | ||
|
|
b89a0ded30 | ||
|
|
1622623105 | ||
|
|
f325d2b55e | ||
|
|
8acb2a4fdb | ||
|
|
cf8bac3001 | ||
|
|
732767bebe | ||
|
|
c92b542a60 | ||
|
|
ab788f8755 | ||
|
|
0d8ef1a98c | ||
|
|
461ab2cd62 | ||
|
|
6f45a5586f | ||
|
|
da76196ec3 | ||
|
|
6fc5e74872 | ||
|
|
afafcd97d9 | ||
|
|
80cbb60d04 | ||
|
|
428e4a9203 | ||
|
|
3d3fe94a53 | ||
|
|
67760e2b39 | ||
|
|
00f7574e2f | ||
|
|
369f63ca3e | ||
|
|
a745ff911e | ||
|
|
e1d7d313d1 | ||
|
|
295285cc0a | ||
|
|
4d39087360 | ||
|
|
7b4201faeb | ||
|
|
4c5e0b59a3 | ||
|
|
885eeeb12c | ||
|
|
d912f24882 | ||
|
|
94dcc1eb10 | ||
|
|
d363992f8e | ||
|
|
1ca5a97378 | ||
|
|
64a81e554f | ||
|
|
295988e5c6 | ||
|
|
3eaed7c2b7 | ||
|
|
1f82dd2388 | ||
|
|
424e2812da | ||
|
|
97290b0e51 | ||
|
|
e685470dac | ||
|
|
35933d56ee | ||
|
|
de8f67b294 | ||
|
|
fc0373f228 | ||
|
|
a51957526f | ||
|
|
72151ff799 | ||
|
|
3b9ce2e3b1 | ||
|
|
9f326ae4cd | ||
|
|
8f3e61563c | ||
|
|
29fadb1628 | ||
|
|
262d064193 | ||
|
|
9e8aab8d57 | ||
|
|
fe7fd95b04 | ||
|
|
7c2250eb14 | ||
|
|
f1cdebd300 | ||
|
|
27fc882205 | ||
|
|
d7c79516f8 | ||
|
|
8566b64f85 | ||
|
|
769c0b4bb0 | ||
|
|
cf9aa92218 | ||
|
|
62dd732b05 | ||
|
|
c367332261 | ||
|
|
33def15a43 | ||
|
|
e0bb061ecf | ||
|
|
ec89419f21 | ||
|
|
22643738cf | ||
|
|
740ced602f | ||
|
|
438eb72b21 | ||
|
|
c565eb8432 | ||
|
|
b4dafb6057 | ||
|
|
cba4d45309 | ||
|
|
6cd2e1931f | ||
|
|
d9aebb25ca | ||
|
|
fe10247d9c | ||
|
|
30e2e9f66e | ||
|
|
56bf5fe213 | ||
|
|
446998414e | ||
|
|
3259edaa22 | ||
|
|
a9767188dc | ||
|
|
471a1c9598 | ||
|
|
54bc814c34 | ||
|
|
aab02acbc3 | ||
|
|
de261eac51 | ||
|
|
31cfcb1075 | ||
|
|
abdc40260f | ||
|
|
74e6399d0d | ||
|
|
2623101113 | ||
|
|
451c6e1a44 | ||
|
|
d565ab385b | ||
|
|
db610dc844 | ||
|
|
dbe26921a0 | ||
|
|
9381676f7e | ||
|
|
ec1e3f1b31 | ||
|
|
a9a5f7f0ee | ||
|
|
0e89241d79 | ||
|
|
42b190b6ff | ||
|
|
9879b43fc5 | ||
|
|
fc36f3b67e | ||
|
|
1ac9462e03 | ||
|
|
699552615b | ||
|
|
10d8a0733a | ||
|
|
8c91f5b6f6 | ||
|
|
f6c21ed203 | ||
|
|
75c99f78fd | ||
|
|
d710773d9d | ||
|
|
147641638e | ||
|
|
adf4a2a010 | ||
|
|
fb286730c6 | ||
|
|
93668cf38e | ||
|
|
601e21eff4 | ||
|
|
dbe4de3f29 | ||
|
|
5482742afd | ||
|
|
bc6dd68295 | ||
|
|
669c90a86e | ||
|
|
2e5cf94bd7 | ||
|
|
195f2c7012 | ||
|
|
4c7c1b6043 | ||
|
|
85bf4aa8f7 | ||
|
|
74e82a783d | ||
|
|
7a4b2b917c | ||
|
|
29b476c50d | ||
|
|
8bf87e1def | ||
|
|
b9d7fd4b92 | ||
|
|
457ee97c47 | ||
|
|
1b80f4832e | ||
|
|
3b46427421 | ||
|
|
06126dd545 | ||
|
|
6133280b8b | ||
|
|
87638b2dc4 | ||
|
|
e090ba5f03 | ||
|
|
ecc85ab2f7 | ||
|
|
f2d1ed3236 | ||
|
|
bd6e362491 | ||
|
|
59b8cfd22c | ||
|
|
a3da32cd18 | ||
|
|
22c2c6749d | ||
|
|
e631f88e66 | ||
|
|
4e5a5adf04 | ||
|
|
3fb34139cb | ||
|
|
870de6da45 | ||
|
|
ff673d6918 | ||
|
|
cac367ad33 | ||
|
|
f661b7a8e9 | ||
|
|
22372b343d | ||
|
|
3c6c7d1add | ||
|
|
9cbef1a2c9 | ||
|
|
c2642d9f43 | ||
|
|
9d2d40486a | ||
|
|
25f10c301e | ||
|
|
04972b9f93 | ||
|
|
3e9da748fd | ||
|
|
34b86f4cb0 | ||
|
|
e98687de27 | ||
|
|
c20bab8526 | ||
|
|
a80e8d83c1 | ||
|
|
683a449201 | ||
|
|
bf2236b625 | ||
|
|
106c795bc4 | ||
|
|
266aeeda25 | ||
|
|
929be0e37b | ||
|
|
68fdb9b551 | ||
|
|
177e9a6c74 | ||
|
|
94cc51a496 | ||
|
|
c422705489 | ||
|
|
4c048e2bf1 | ||
|
|
dd5c6bf906 | ||
|
|
c0026e4efd | ||
|
|
8d5dfc6ea4 | ||
|
|
2af7f1bc63 | ||
|
|
34508b7258 | ||
|
|
478812507b | ||
|
|
6df9e6ae43 | ||
|
|
7c112243fa | ||
|
|
e4529bc7f6 | ||
|
|
fe67cbcad6 | ||
|
|
788fcce8a2 | ||
|
|
5c75354cb4 | ||
|
|
bdc8192184 | ||
|
|
35457c900c | ||
|
|
7f14266f25 | ||
|
|
570b6c5b8a | ||
|
|
15bf332bbb | ||
|
|
f84f1f5ce0 | ||
|
|
b9338abd2f | ||
|
|
56f10b620b | ||
|
|
58d6a93567 | ||
|
|
b9e27d93e2 | ||
|
|
7c15ba7e17 | ||
|
|
cf4ff2bbc5 | ||
|
|
835abd5655 | ||
|
|
18f00370d2 | ||
|
|
6548d1a69d | ||
|
|
e4bc1040d7 | ||
|
|
756c492982 | ||
|
|
2bce22c552 | ||
|
|
defcb57b68 | ||
|
|
5d87c5b405 | ||
|
|
3d95b060cb | ||
|
|
48e90e5fc1 | ||
|
|
a47d2e53ab | ||
|
|
1d733d399f | ||
|
|
280c021b57 | ||
|
|
ff164bcd30 | ||
|
|
b2bcc6944b | ||
|
|
44ca3c87e9 | ||
|
|
75f01d2bc3 | ||
|
|
99d4968c7d | ||
|
|
a48845f0c4 | ||
|
|
7b0deeb979 | ||
|
|
7f950d7e18 | ||
|
|
66fc131957 | ||
|
|
2270b4e13c | ||
|
|
ca3e1d1f57 | ||
|
|
42d197bb56 | ||
|
|
f6e7e64db5 | ||
|
|
4414e08f5d | ||
|
|
5c12b0e9db | ||
|
|
7c075b3457 | ||
|
|
ee467905d2 | ||
|
|
5fd66e5f36 | ||
|
|
979572957c | ||
|
|
cfb692b751 | ||
|
|
325a8afa8f | ||
|
|
2b96f8ca0f | ||
|
|
0f61751c6f | ||
|
|
86bbac7b63 | ||
|
|
6abcddcb0d | ||
|
|
288481dfde | ||
|
|
4a17963158 | ||
|
|
e31a49c831 | ||
|
|
7451f47d7c | ||
|
|
281679cf73 | ||
|
|
ddb2fd6b3d | ||
|
|
4c6e9da488 | ||
|
|
0af98058cc | ||
|
|
0bbc76f4bc | ||
|
|
dccde9091c | ||
|
|
583fc82eb2 | ||
|
|
c4109df5f8 | ||
|
|
0eeb74afe7 | ||
|
|
b080645df9 | ||
|
|
e5bec84188 | ||
|
|
6fd593f9b9 | ||
|
|
3c0f1505a3 | ||
|
|
7ac1cb2171 | ||
|
|
f55d0f02b5 | ||
|
|
36e77fd075 | ||
|
|
c824f316bd | ||
|
|
4be4e36bdd | ||
|
|
054edbbc02 | ||
|
|
3ec5412999 | ||
|
|
aedb9959a7 | ||
|
|
f692cc7fc4 | ||
|
|
24ba56700e | ||
|
|
08593b6b61 | ||
|
|
b1e8ddfa40 | ||
|
|
35bfb7dbc0 | ||
|
|
0fd0348daa | ||
|
|
7473c0b89d | ||
|
|
5d69ccc1cf | ||
|
|
60723a9e48 | ||
|
|
932f2846c6 | ||
|
|
d18d9cb3e6 | ||
|
|
21b38df7e9 | ||
|
|
0aacbb38d4 | ||
|
|
4d4dafa033 | ||
|
|
4f6e63123a | ||
|
|
9e1834f1a5 | ||
|
|
a4f304de6e | ||
|
|
4ae063cbc4 | ||
|
|
396de6eba0 | ||
|
|
3fe1f724b2 | ||
|
|
2b7a18a3a1 | ||
|
|
d8e185d9da | ||
|
|
09ae39619a | ||
|
|
bcc34c1ea1 | ||
|
|
b7c0ebd725 | ||
|
|
f8538d5ce5 | ||
|
|
65171bd629 | ||
|
|
25c485fdc4 | ||
|
|
0c6bcf6d27 | ||
|
|
1e575f7573 | ||
|
|
4dfce7eae1 | ||
|
|
ef83b2b3aa | ||
|
|
986b8433e5 | ||
|
|
ba62795936 | ||
|
|
ab6e141fda | ||
|
|
e9d088f671 | ||
|
|
3fff69e139 | ||
|
|
f8cea71fd8 | ||
|
|
1e0b7a2760 | ||
|
|
ca36eee75d | ||
|
|
c937b0c3d2 | ||
|
|
2358416875 | ||
|
|
b2f7e796fb | ||
|
|
e4844fe0e1 | ||
|
|
654efaf77e | ||
|
|
3b8ffa2d81 | ||
|
|
1dbdce29cd | ||
|
|
1ddfd3381c | ||
|
|
c7577683b2 | ||
|
|
2caf76ebbb | ||
|
|
3551662097 | ||
|
|
59a2599726 | ||
|
|
9f154c6d97 | ||
|
|
5a44d3ef81 | ||
|
|
eb7481a5db | ||
|
|
1eb2ba1434 | ||
|
|
d513b5b92a | ||
|
|
388e48e016 | ||
|
|
54bcd5c779 | ||
|
|
d2ada5db78 | ||
|
|
f96dd8edd0 | ||
|
|
046b0327a2 | ||
|
|
7cc14c08ab | ||
|
|
84107379eb | ||
|
|
e4c0636e8e | ||
|
|
469efb023a | ||
|
|
35232ff049 | ||
|
|
e2f43bd954 | ||
|
|
93819f9988 | ||
|
|
ce842e06d2 | ||
|
|
0f69accc2a | ||
|
|
e61ab5fc0e | ||
|
|
cc09326220 | ||
|
|
1891bec349 | ||
|
|
e23d2f4e59 | ||
|
|
565144e02a | ||
|
|
d1f7eddc1e | ||
|
|
a225036f99 | ||
|
|
6c5092d7b7 | ||
|
|
7fc1731f8e | ||
|
|
f6a64b3b35 | ||
|
|
d8e0dbd15b | ||
|
|
9bbb5573cb | ||
|
|
06a914d19b | ||
|
|
23ad68431e | ||
|
|
f924ae77e7 | ||
|
|
2fdc3b84a0 | ||
|
|
bb6176a891 | ||
|
|
ddc202de3c | ||
|
|
7a5bf654ad | ||
|
|
7568f926eb | ||
|
|
12a2c56b9b | ||
|
|
a5696a6265 | ||
|
|
90a780dda2 | ||
|
|
9e17d6e02a | ||
|
|
1d70d9e856 | ||
|
|
f469c31244 | ||
|
|
7ee13bd17f | ||
|
|
e472d81454 | ||
|
|
177ffe7cc3 | ||
|
|
c0f3908591 | ||
|
|
63e5b9cb7f | ||
|
|
585826a0ca | ||
|
|
37c09af562 | ||
|
|
86dd6a8727 | ||
|
|
00633b560e | ||
|
|
2eb78d1bc4 | ||
|
|
2c6dfc3b38 | ||
|
|
7402fe53a2 | ||
|
|
a6ceecd7a8 | ||
|
|
131ef20840 | ||
|
|
ef505f0907 | ||
|
|
e9023ad8ed | ||
|
|
a0cf5b51ba | ||
|
|
2a5074b45e | ||
|
|
2440876d52 | ||
|
|
4937465963 | ||
|
|
976965b88d | ||
|
|
719b1b59fd | ||
|
|
c52b166250 | ||
|
|
dc5f94e1d7 | ||
|
|
20f80d9e94 | ||
|
|
23ca460e2b | ||
|
|
26e05e1087 | ||
|
|
7f147d5ed5 | ||
|
|
6f2435be78 | ||
|
|
bf73f04d49 | ||
|
|
f4d0b320ab | ||
|
|
bc2605cfdc | ||
|
|
9095232de9 | ||
|
|
8485cf4573 | ||
|
|
ff2ba19102 | ||
|
|
3dbed0c68d | ||
|
|
2270eb3381 | ||
|
|
653af80d86 | ||
|
|
310d3d5727 | ||
|
|
9ccef08496 | ||
|
|
6da5d437e3 | ||
|
|
a8062cfdd3 | ||
|
|
868fd9aff8 | ||
|
|
bf451d9da2 | ||
|
|
5ecdc21dae | ||
|
|
3f53295f1f | ||
|
|
5e29d7e317 | ||
|
|
5c3f5339c4 | ||
|
|
e3e54e9fd2 | ||
|
|
98e82fde98 | ||
|
|
9e2f19783b | ||
|
|
189cddd4b9 | ||
|
|
3bb44a39ee | ||
|
|
f7851b6939 | ||
|
|
0e6a8b78ac | ||
|
|
d8e1d220b2 | ||
|
|
15d1b11815 | ||
|
|
5743aa5ba5 | ||
|
|
2d3a4465e6 | ||
|
|
b5ee47dc20 | ||
|
|
0de9800ad1 | ||
|
|
7c243d902d | ||
|
|
041d3926bf | ||
|
|
e6bb2deab7 | ||
|
|
2d4cb53365 | ||
|
|
5924c8005e | ||
|
|
f7632aebaa | ||
|
|
7ec3fcbd83 | ||
|
|
ec96f846b6 | ||
|
|
aab44b98ac | ||
|
|
8772ed5dd8 | ||
|
|
dac8639d75 | ||
|
|
a7d274857f | ||
|
|
21d3804fc4 | ||
|
|
a043646583 | ||
|
|
77513392bf | ||
|
|
d04e3fd715 | ||
|
|
6881832c8d | ||
|
|
955b12ab3f | ||
|
|
d83ddb077b | ||
|
|
ddec2d493a | ||
|
|
6ea164796e | ||
|
|
1a90ecafbb | ||
|
|
e47a26dad4 | ||
|
|
824706c800 | ||
|
|
ea66a576f4 | ||
|
|
b4b3b1a3c0 | ||
|
|
1a71d9e363 | ||
|
|
31468d8d35 | ||
|
|
8a860edc51 | ||
|
|
7570abe580 | ||
|
|
796af3f04f | ||
|
|
3c05e61f88 | ||
|
|
355240ce09 | ||
|
|
1d10324acd | ||
|
|
e82536e0a1 | ||
|
|
d08eda2651 | ||
|
|
31b2a79a70 | ||
|
|
8fc7317bde | ||
|
|
10aeed469b | ||
|
|
2564fd508d | ||
|
|
5fa36205f1 | ||
|
|
31f8e0596b | ||
|
|
65780e2706 | ||
|
|
b3b90f3fc3 | ||
|
|
ee928627b0 | ||
|
|
a84b6e185d | ||
|
|
aba86644a2 | ||
|
|
dafcf7f738 | ||
|
|
aa8b285dd2 | ||
|
|
7758ee652c | ||
|
|
d6cf1cff1b | ||
|
|
a4e2db9b5d | ||
|
|
ff35211dc9 | ||
|
|
7b0c09526b | ||
|
|
e1188d4dc0 | ||
|
|
02279b2169 | ||
|
|
4faab1bed9 | ||
|
|
4743ca7301 | ||
|
|
1e508da3b7 | ||
|
|
4a280fe9fd | ||
|
|
1af9f7f360 | ||
|
|
1f9146d659 | ||
|
|
cf7237aa58 | ||
|
|
5a8d2018d6 | ||
|
|
ed9f64628e | ||
|
|
40a7419d91 | ||
|
|
e9a57141c7 | ||
|
|
97fbf36d79 | ||
|
|
be5c929432 | ||
|
|
7a7053d15d | ||
|
|
1cecbc6223 | ||
|
|
c87fd312ba | ||
|
|
53dd70fcfa | ||
|
|
f988a5d676 | ||
|
|
d052cd6a62 | ||
|
|
3e82fa4aa6 | ||
|
|
b9b14f5a63 | ||
|
|
518e6ff6e7 | ||
|
|
8a4cd43915 | ||
|
|
987698c7de | ||
|
|
2154eb00e1 | ||
|
|
ae3ef67592 | ||
|
|
48284524f9 | ||
|
|
0eea7965cd | ||
|
|
a9cdfbf1be | ||
|
|
c17f00a50f | ||
|
|
8b1eb26dee | ||
|
|
0873e7ebd1 | ||
|
|
2b3ff7cb96 | ||
|
|
3b9e258024 | ||
|
|
249dca5754 | ||
|
|
997fcd4317 | ||
|
|
e6dd0f4627 | ||
|
|
e2cd98d063 | ||
|
|
3de1aa9386 | ||
|
|
d9f39162bc | ||
|
|
27024bbc73 | ||
|
|
64265c1195 | ||
|
|
c5e72d88c3 | ||
|
|
880abebaae | ||
|
|
c421d55d19 | ||
|
|
6d31b1af9e | ||
|
|
a712e86903 | ||
|
|
bdd9b32d98 | ||
|
|
b1b25c7786 | ||
|
|
f92f0defaf | ||
|
|
d58c1d7495 | ||
|
|
36a33169f7 | ||
|
|
027f061c15 | ||
|
|
e4c2d0a59a | ||
|
|
f83e99c059 | ||
|
|
f839796342 | ||
|
|
5f591cfb8d | ||
|
|
5ccacb3b11 | ||
|
|
b5754843ce | ||
|
|
66b94c6bf1 | ||
|
|
30666cd636 | ||
|
|
41e4ba4cdc | ||
|
|
3b9dc239b6 | ||
|
|
d79415bb17 | ||
|
|
e634bb045e | ||
|
|
6662cafd0b | ||
|
|
8a23e42609 | ||
|
|
32d90c00e7 | ||
|
|
073c94ba63 | ||
|
|
c0531c2437 | ||
|
|
1c5347c47b | ||
|
|
2ef5211b59 | ||
|
|
90f5c3da21 | ||
|
|
c214e50ecd | ||
|
|
4531ec7b10 | ||
|
|
0f39f567df | ||
|
|
9e9c52d8ff | ||
|
|
0191fd7fbc | ||
|
|
0c355cdbce | ||
|
|
a1bbac3837 | ||
|
|
1684e54a82 | ||
|
|
891a14fa91 | ||
|
|
17681732cf | ||
|
|
370840c811 | ||
|
|
b7ad813898 | ||
|
|
000a855a52 | ||
|
|
9b050f648a | ||
|
|
778749742d | ||
|
|
ecefc32f48 | ||
|
|
93c184ac99 | ||
|
|
56b9d633aa | ||
|
|
9506d48aaf | ||
|
|
2a7e8ba1e1 | ||
|
|
0aa2b2c3ab | ||
|
|
c97de1f2f9 | ||
|
|
55843bbb90 | ||
|
|
84126801a8 | ||
|
|
d2edf8e5e1 | ||
|
|
cfcdefaf6f | ||
|
|
596a8b5675 | ||
|
|
961f3e4655 | ||
|
|
ebbe53fa94 | ||
|
|
363524d1a8 | ||
|
|
4ea9fb4896 | ||
|
|
e6ed255539 | ||
|
|
06b27aa14b | ||
|
|
557b73f139 | ||
|
|
4c4868bf64 | ||
|
|
92ef6714f7 | ||
|
|
e89709f6c8 | ||
|
|
866cd677f8 | ||
|
|
a37e0354b3 | ||
|
|
9fb333e468 | ||
|
|
45c5d07f46 | ||
|
|
5ab73e7819 | ||
|
|
5cd8bada21 | ||
|
|
cda2f4d2c1 | ||
|
|
c0b102e17b | ||
|
|
c11b723597 | ||
|
|
f51d23ee25 | ||
|
|
b2b3e3d9f1 | ||
|
|
cf32f6aa7e | ||
|
|
30e2ec1ff8 | ||
|
|
3904776c7d | ||
|
|
9132b37ea7 | ||
|
|
5cee13a82f | ||
|
|
09765f0bde | ||
|
|
6ece7e55ad | ||
|
|
fafc8a41d1 | ||
|
|
03d31afbb7 | ||
|
|
c786271e0d | ||
|
|
125c9b2786 | ||
|
|
5bf0448f5c | ||
|
|
4dd9fd78ea | ||
|
|
9380f38ccd | ||
|
|
2956481414 | ||
|
|
36fb3c5e11 | ||
|
|
3eb2809df9 | ||
|
|
7cfbd515d8 | ||
|
|
ed8d4b0e32 | ||
|
|
d0586b17c9 | ||
|
|
7be1e8f8fd | ||
|
|
fcf6a55374 | ||
|
|
ef9e2dd4d9 | ||
|
|
7a64a85d42 | ||
|
|
da8394337b | ||
|
|
d2da00964b | ||
|
|
95527e2c8d | ||
|
|
8d2052cb5f | ||
|
|
a296e8e2ad | ||
|
|
848e3c2e72 | ||
|
|
411822f1aa | ||
|
|
00cd9c72e4 | ||
|
|
880e505cd6 | ||
|
|
b3484942b4 | ||
|
|
1ea25caa5d | ||
|
|
7015cad986 | ||
|
|
ac7098390d | ||
|
|
b52c17e65b | ||
|
|
204fe5bfee | ||
|
|
e12a08907f | ||
|
|
105b22e390 | ||
|
|
18c3e72ca8 | ||
|
|
7528e760c5 | ||
|
|
beb58657b7 | ||
|
|
cc573f16cc | ||
|
|
01f6aca376 | ||
|
|
d5e63ed2cb | ||
|
|
11ae6e5dfb | ||
|
|
8fd14dfa0f | ||
|
|
5a9f5a12c2 | ||
|
|
9bdab91b11 | ||
|
|
e0aa126141 | ||
|
|
f9438a8ea6 | ||
|
|
2168619797 | ||
|
|
412123d5e0 | ||
|
|
aefbfe7c1d | ||
|
|
370c5cdeaa | ||
|
|
a9177ce5d4 | ||
|
|
be2cbd81a7 | ||
|
|
5de9bb7524 | ||
|
|
d186f83162 | ||
|
|
b49d340283 | ||
|
|
cf576687f8 | ||
|
|
2ccb754f43 | ||
|
|
1733c0c3bc | ||
|
|
bfe56b4af6 | ||
|
|
4e6361951a | ||
|
|
20ac2e8e33 | ||
|
|
7e05715ac9 | ||
|
|
271902c398 | ||
|
|
4eee5bed4c | ||
|
|
a8591a98d2 | ||
|
|
5bfc473597 | ||
|
|
b793a38cea | ||
|
|
1be4363373 | ||
|
|
a97a1fa739 | ||
|
|
f2d6ebd528 | ||
|
|
7ef5dd5ba2 | ||
|
|
e44f828c74 | ||
|
|
2163ffa17d | ||
|
|
45ce15349e | ||
|
|
2722d07b54 | ||
|
|
d1acb8d793 | ||
|
|
396604d42e | ||
|
|
c469a4e41f | ||
|
|
6e7718ff89 | ||
|
|
aa6c7addbe | ||
|
|
0aaac9f10e | ||
|
|
35dc4cef8c | ||
|
|
438753e0b2 | ||
|
|
9aea35e0ee | ||
|
|
5cf3c2d590 | ||
|
|
4116c48e3a | ||
|
|
126155b7ee | ||
|
|
11e4d70b02 | ||
|
|
46f54f1a76 | ||
|
|
0930425170 | ||
|
|
20fea85ca3 | ||
|
|
4ad24e3970 | ||
|
|
d87e45ec17 | ||
|
|
77a0bc3d80 | ||
|
|
b901da2897 | ||
|
|
c6fb938aa0 | ||
|
|
3f2f852208 | ||
|
|
7cacd1ca77 | ||
|
|
6c22a81476 | ||
|
|
aa83e4e3f7 | ||
|
|
6e79b0e042 | ||
|
|
b6a4cd4b4f | ||
|
|
50080afc8b | ||
|
|
7362ad8b40 | ||
|
|
49b617afa5 | ||
|
|
8277328613 | ||
|
|
a17c28ecd6 | ||
|
|
564a5f695f | ||
|
|
aa18239158 | ||
|
|
e510cb5aaf | ||
|
|
510f9be37c | ||
|
|
a43fd8ba37 | ||
|
|
1eb6582d0d | ||
|
|
68769d9900 | ||
|
|
7a4d0c0804 | ||
|
|
41e86a794b | ||
|
|
9aa579be91 | ||
|
|
ebf25bd6c1 | ||
|
|
a566497ead | ||
|
|
201b6ddc16 | ||
|
|
38bda22857 | ||
|
|
f91778a4b2 | ||
|
|
88bda9f240 | ||
|
|
52d08cd1f7 | ||
|
|
8fa4c2e48d | ||
|
|
e0c5fedee4 | ||
|
|
007d3471d3 | ||
|
|
84e5e05cda | ||
|
|
688da5dde0 | ||
|
|
1d3ad66d46 | ||
|
|
0c7a6f2537 | ||
|
|
79f883a682 | ||
|
|
c68dff08cb | ||
|
|
bdc9b9eaae | ||
|
|
e8dda2568e | ||
|
|
f9d64f817f | ||
|
|
f3acd7003d | ||
|
|
1b96c6e218 | ||
|
|
3c35262821 | ||
|
|
4063c33fd2 | ||
|
|
ba6073761c | ||
|
|
07666cf5df | ||
|
|
61746d3d1d | ||
|
|
0ea31b6f23 | ||
|
|
71f2577f70 | ||
|
|
57272e97a4 | ||
|
|
580c5f0ba9 | ||
|
|
091b43e7bb | ||
|
|
d56d3eb69e | ||
|
|
fa8b3f3536 | ||
|
|
00d19ab9a9 | ||
|
|
5185823d68 | ||
|
|
bc1bc32cea | ||
|
|
f31f367709 | ||
|
|
cbfc853a2a | ||
|
|
0b5d7d32ae | ||
|
|
f84b0c7ce1 | ||
|
|
eadce6f0af | ||
|
|
21515dd5a2 | ||
|
|
26d4f86948 | ||
|
|
917d839cf7 | ||
|
|
8756a87647 | ||
|
|
f87727ec38 | ||
|
|
61e10e2a8b | ||
|
|
fcb9855bca | ||
|
|
a7a55fe074 | ||
|
|
c7987f3ca5 | ||
|
|
be6fd6d184 | ||
|
|
4b9ceca7dd | ||
|
|
2dde881fe0 | ||
|
|
60af3411f9 | ||
|
|
0cacc4a343 | ||
|
|
e37114edb7 | ||
|
|
c503ce38ef | ||
|
|
897ad326f0 | ||
|
|
bbc0505e7d | ||
|
|
4a748d0af3 | ||
|
|
10511ea412 | ||
|
|
3cb0fc1713 | ||
|
|
f20c9aa0d6 | ||
|
|
9b35c5ee66 | ||
|
|
e1b32f5566 | ||
|
|
3adadea5e1 | ||
|
|
d06573a2d0 | ||
|
|
335778c080 | ||
|
|
ecb75e3142 | ||
|
|
728a07e187 | ||
|
|
d38867df82 | ||
|
|
fb8dc4f441 | ||
|
|
050cfb24ac | ||
|
|
d59a129e89 | ||
|
|
6e8e755c94 | ||
|
|
dea4472fa6 | ||
|
|
9899a5b72a | ||
|
|
aba033f363 | ||
|
|
ad576ce32b | ||
|
|
5bbd691add | ||
|
|
5d699639c1 | ||
|
|
d1d814ac0e | ||
|
|
38523907d0 | ||
|
|
6cc279e689 | ||
|
|
a3a46501f8 | ||
|
|
7dba9f006b | ||
|
|
148f315724 | ||
|
|
4e2a2ac6e0 | ||
|
|
989504b1bb | ||
|
|
c1c5a6869f | ||
|
|
d8926ddd78 | ||
|
|
8f2c5634bb | ||
|
|
d0f91f245c | ||
|
|
bbffee6c75 | ||
|
|
d4a86fe534 | ||
|
|
3fdaf0fa36 | ||
|
|
fef61aa4bc | ||
|
|
ca6ac06770 | ||
|
|
761a6974dc | ||
|
|
6bff359277 | ||
|
|
df3b1ccedf | ||
|
|
c87827804c | ||
|
|
9b8f612dc6 | ||
|
|
522d9179b2 | ||
|
|
e090f86894 | ||
|
|
99c67113d3 | ||
|
|
78c443c31a | ||
|
|
9dc3b99f34 | ||
|
|
78f4a7299f | ||
|
|
3b97ba02b4 | ||
|
|
3478478111 | ||
|
|
d909545c9d | ||
|
|
cd013387f8 | ||
|
|
fd4c69c550 | ||
|
|
a39248a9b9 | ||
|
|
2f755ed86c | ||
|
|
31834cb7a7 | ||
|
|
0239e8af21 | ||
|
|
eac37bfb9f | ||
|
|
dd15e02f5b | ||
|
|
d58d2e3a51 | ||
|
|
c84b4f2858 | ||
|
|
4386340d9a | ||
|
|
bf8d573995 | ||
|
|
5f6a77f709 | ||
|
|
9df248931c | ||
|
|
eb1e0d69e4 | ||
|
|
18c6565158 | ||
|
|
91b02f5270 | ||
|
|
8aa8bffc08 | ||
|
|
596f3e5f8b | ||
|
|
9ad9217c44 | ||
|
|
f30bf399ef | ||
|
|
42900c3a7c | ||
|
|
0bedb8d069 | ||
|
|
8475e6307b | ||
|
|
35c7f4f551 | ||
|
|
2c20efdcd5 | ||
|
|
e7c5106f7a | ||
|
|
42166188e8 | ||
|
|
e89f33a20c | ||
|
|
12e7ac7963 | ||
|
|
982785f5b7 | ||
|
|
745fa5967e | ||
|
|
89fcc5e295 | ||
|
|
db8c0b2743 | ||
|
|
2909aa5e86 | ||
|
|
7a47f02f45 | ||
|
|
6ffac1c71d | ||
|
|
5016c4be9e | ||
|
|
b66edf3cc1 | ||
|
|
7af2143125 | ||
|
|
668b7ee331 | ||
|
|
8350f79e61 | ||
|
|
e05f96d1fb | ||
|
|
16615617f1 | ||
|
|
e9e23d44b2 | ||
|
|
f6fae09924 | ||
|
|
73c27f3628 | ||
|
|
6f0f4109ad | ||
|
|
b32a140cfe | ||
|
|
3f7231bd58 | ||
|
|
f147abb1b3 | ||
|
|
e36701978e | ||
|
|
0b1caf1d0b | ||
|
|
4203c425a7 | ||
|
|
0a91a5f492 | ||
|
|
d3ab241abb | ||
|
|
792e0821b8 | ||
|
|
ad2729bc6b | ||
|
|
17a3f994bc | ||
|
|
60a462ced2 | ||
|
|
b1be543101 | ||
|
|
22eff6399e | ||
|
|
7021cd656a | ||
|
|
dbbd25fd3e | ||
|
|
5f5df22ee1 | ||
|
|
9191dd6fa7 | ||
|
|
93a8761796 | ||
|
|
b3ff97b99c | ||
|
|
0480d2ff0b | ||
|
|
290c3bf354 | ||
|
|
1e4960a3bf | ||
|
|
7ad5f2353e | ||
|
|
a4de68e3e5 | ||
|
|
2270ca3b49 | ||
|
|
ac0a38c0f3 | ||
|
|
86bb01f4d9 | ||
|
|
26c9fa3b07 | ||
|
|
1c25341711 | ||
|
|
61937b83aa | ||
|
|
2e6c253754 | ||
|
|
b999a43b7c | ||
|
|
db7c90581a | ||
|
|
887329deb0 | ||
|
|
f59c59df77 | ||
|
|
28b416db37 | ||
|
|
dd15b9cf77 | ||
|
|
fb1c99a543 | ||
|
|
bd48b70513 | ||
|
|
78849ee8ba | ||
|
|
5260042206 | ||
|
|
050d0a322a | ||
|
|
d1a6d19654 | ||
|
|
63706b590a | ||
|
|
8ec5ec5fe6 | ||
|
|
7dd0748175 | ||
|
|
0e503b0b53 | ||
|
|
5712df2f6c | ||
|
|
f1c5901d9a | ||
|
|
72ad21cc8b | ||
|
|
4e2c1ab7d5 | ||
|
|
2f3b78b4da | ||
|
|
fd379e3076 | ||
|
|
6817d2e990 | ||
|
|
d8ce6c8e70 | ||
|
|
aa002e816e | ||
|
|
f059cc9f2f | ||
|
|
bbcede1118 | ||
|
|
da8a061fe9 | ||
|
|
4e88c31683 | ||
|
|
9cf405d467 | ||
|
|
b863756912 | ||
|
|
871cd691de | ||
|
|
982c4a07f3 | ||
|
|
d1dd6be21a | ||
|
|
957f39e615 | ||
|
|
a6873ed5b4 | ||
|
|
65f967ab93 | ||
|
|
ba96db4c9b | ||
|
|
c7e311600d | ||
|
|
a10afd5690 | ||
|
|
04266f2b19 | ||
|
|
390b3f0416 | ||
|
|
5104926f43 | ||
|
|
5b755f985f | ||
|
|
3c3f6fcb3c | ||
|
|
7a389f9c2c | ||
|
|
07d514bc18 | ||
|
|
af2a402d24 | ||
|
|
b4d754bfd9 | ||
|
|
e560b2c552 | ||
|
|
f71f301975 | ||
|
|
d99945995a | ||
|
|
9460a49ba3 | ||
|
|
79f73d8218 | ||
|
|
18c020cf48 | ||
|
|
4d8989e3eb | ||
|
|
fabf809a43 | ||
|
|
5fe1216373 | ||
|
|
a1d16ce0a7 | ||
|
|
9b766c988b | ||
|
|
99c1671137 | ||
|
|
8d0834dfbf | ||
|
|
b7a7c18fb7 | ||
|
|
67719e2343 | ||
|
|
1c5b054ea1 | ||
|
|
976c570fe8 | ||
|
|
1c6070363c | ||
|
|
2ccd3d34b7 | ||
|
|
04e35ee769 | ||
|
|
c58d87b2dd | ||
|
|
417cdcb5f0 | ||
|
|
48e0defbce | ||
|
|
4c8449a7be | ||
|
|
5d970a8fb0 | ||
|
|
06ad5b3a22 | ||
|
|
0c18affd86 | ||
|
|
e57d377b02 | ||
|
|
6190a2dd68 | ||
|
|
777b80fdac | ||
|
|
9e5b2ce735 | ||
|
|
d9d2786c13 | ||
|
|
6b82a631c9 | ||
|
|
39d5055beb | ||
|
|
84075c1f71 | ||
|
|
a96095b9a9 | ||
|
|
38b1fc0400 | ||
|
|
8b2ccdfe09 | ||
|
|
11483cf376 | ||
|
|
f6e11bde77 | ||
|
|
d01c59549a | ||
|
|
f119fa9287 | ||
|
|
a93812c647 | ||
|
|
c740f2f687 | ||
|
|
730267d80e | ||
|
|
827c67fee5 | ||
|
|
9f7f6a042a | ||
|
|
2f1dcc418f | ||
|
|
1541d927fe | ||
|
|
b449d33380 | ||
|
|
463e87c9cc | ||
|
|
592e3c8d34 | ||
|
|
f317e83a27 | ||
|
|
13632c0620 | ||
|
|
9796ad42f0 | ||
|
|
07eee49c19 | ||
|
|
96c77ae232 | ||
|
|
1572a5a81d | ||
|
|
bec2bebbb2 | ||
|
|
b261fb51ce | ||
|
|
9508108f62 | ||
|
|
a61796db7e | ||
|
|
fe6bc9daea | ||
|
|
fe65cf0017 | ||
|
|
0befc7823e | ||
|
|
fba0eabea5 | ||
|
|
00d3eb70b7 | ||
|
|
420490d4cf | ||
|
|
6358e9ba57 | ||
|
|
a9052790fb | ||
|
|
015052aaef | ||
|
|
e3f8a26ed1 | ||
|
|
c7c7ebd2b3 | ||
|
|
635a7fadc0 | ||
|
|
e9119f8cf3 | ||
|
|
d341ac1698 | ||
|
|
e07c9729e8 | ||
|
|
d38194f22a | ||
|
|
537b04902f | ||
|
|
333af3d7ec | ||
|
|
44faf1c824 | ||
|
|
d561771117 | ||
|
|
837d873960 | ||
|
|
2eace569ca | ||
|
|
74f10c4c72 | ||
|
|
e2e4efce2c | ||
|
|
6bf6c82698 | ||
|
|
fda2b782e8 | ||
|
|
eb85d4660a | ||
|
|
84909e5b42 | ||
|
|
a903a4f88f | ||
|
|
5ecaff5425 | ||
|
|
7386909aca | ||
|
|
367836c0e1 | ||
|
|
d07b5261da | ||
|
|
24dc067fb2 | ||
|
|
6dbee781ab | ||
|
|
515ebb7d18 | ||
|
|
1a007b8035 | ||
|
|
3401eef02c | ||
|
|
2986ad46b2 | ||
|
|
31368747c6 | ||
|
|
72cb0d45e2 | ||
|
|
7ca12b3245 | ||
|
|
7d56733b7b | ||
|
|
6c929a769a | ||
|
|
787a692622 | ||
|
|
51c337ef7a | ||
|
|
58ad54a215 | ||
|
|
bf8d39428b | ||
|
|
75bd3f309c | ||
|
|
f3e4d946a3 | ||
|
|
e34b399544 | ||
|
|
9870281457 | ||
|
|
9c62566a88 | ||
|
|
e095f78faf | ||
|
|
bcd0a91f23 | ||
|
|
e340d1da80 | ||
|
|
be6e351dae | ||
|
|
521eb49de1 | ||
|
|
225ea8d8a8 | ||
|
|
0e5ae3b12a | ||
|
|
4758eeb6c4 | ||
|
|
611484749e | ||
|
|
4667fc4b4e | ||
|
|
0db9c2ae4d | ||
|
|
cb3aa4f7fe | ||
|
|
b24e8b6db4 | ||
|
|
a12c22ac63 | ||
|
|
85dee745b4 | ||
|
|
5ca5417326 | ||
|
|
99fa075e11 | ||
|
|
3e13a15cc4 | ||
|
|
84e0f3564a | ||
|
|
229d4d92db | ||
|
|
fe810a2f76 | ||
|
|
432b5b8a9b | ||
|
|
b4743b0f01 | ||
|
|
d062090ebb | ||
|
|
4f561925a6 | ||
|
|
4f6b01822d | ||
|
|
8fd60d2cd2 | ||
|
|
e19bbd1bea | ||
|
|
ebf7d8367e | ||
|
|
5234bd2373 | ||
|
|
9d1a1a5cdc | ||
|
|
c755a34fe0 | ||
|
|
8292d9693d | ||
|
|
3256b8d9eb | ||
|
|
7de94d6900 | ||
|
|
eb5f1bd77b | ||
|
|
a73e07fc62 | ||
|
|
a2884785ad | ||
|
|
1e18377497 | ||
|
|
340e64f76b | ||
|
|
dc4784103d | ||
|
|
a482d31e66 | ||
|
|
0aeb0855cf | ||
|
|
757af21760 | ||
|
|
90d7abfac8 | ||
|
|
66c09c59a4 | ||
|
|
f1bbd2227f | ||
|
|
9c2fdff1ba | ||
|
|
8167ad20c6 | ||
|
|
c1a0f5a040 | ||
|
|
29fa47ee98 | ||
|
|
db5a99e0b5 | ||
|
|
a9a8c21338 | ||
|
|
b2635c9a12 | ||
|
|
e6b2715540 | ||
|
|
96d1b56cee | ||
|
|
a80a38af3c | ||
|
|
d431010763 | ||
|
|
b01ac687ac | ||
|
|
e09caeed3e | ||
|
|
f4ceefee89 | ||
|
|
4f1ddb238a | ||
|
|
d04d616b88 | ||
|
|
bfeb49a43f | ||
|
|
f130a50837 | ||
|
|
06b4bb4a3c | ||
|
|
289d0a0297 | ||
|
|
106c306983 | ||
|
|
5aba144c1c | ||
|
|
979121f7b0 | ||
|
|
efbfd5444f | ||
|
|
f9cd0c8193 | ||
|
|
178cddbfba | ||
|
|
f11101c63c | ||
|
|
5001ee38c8 | ||
|
|
ffb5b00b74 | ||
|
|
dabdead167 | ||
|
|
9325af1bb6 | ||
|
|
e5aa8ee4f8 | ||
|
|
5156f2a08c | ||
|
|
ff59dd871f | ||
|
|
1a1a8e99fa | ||
|
|
f1a630bc58 | ||
|
|
3b28b85f89 | ||
|
|
3249789ee1 | ||
|
|
4e80a54a4e | ||
|
|
ef49f45945 | ||
|
|
2f1abd93ae | ||
|
|
5e6e9d152b | ||
|
|
b7d84aa2b1 | ||
|
|
4a55110d85 | ||
|
|
825006cb0c | ||
|
|
5f273f3875 | ||
|
|
a198297637 | ||
|
|
c0694bb6cb | ||
|
|
9374fcf980 | ||
|
|
32ac647149 | ||
|
|
06c7830e2d | ||
|
|
e45f32581c | ||
|
|
d555a212e6 | ||
|
|
67171cd8df | ||
|
|
b95f4acffb | ||
|
|
acd8c76703 | ||
|
|
bf8501459e | ||
|
|
056dc9ca1f | ||
|
|
2b2ffa3aec | ||
|
|
b3bb0ab568 | ||
|
|
0801c17692 | ||
|
|
fc0f4a3515 | ||
|
|
4f8fca072e | ||
|
|
244ab4aab1 | ||
|
|
b8ad6ff8b0 | ||
|
|
063cb98826 | ||
|
|
bec3530169 | ||
|
|
5f8ca49d1e | ||
|
|
01831a129c | ||
|
|
4c8123a95a | ||
|
|
b74c32aa4c | ||
|
|
95c32aa1c9 | ||
|
|
42031dec04 | ||
|
|
ec256194c0 | ||
|
|
20e693ff6b | ||
|
|
69f2203e4c | ||
|
|
701e363088 | ||
|
|
cfd39a5c25 | ||
|
|
4e91931e71 | ||
|
|
1babdc4cb0 | ||
|
|
65cdc516fc | ||
|
|
6826c089bb | ||
|
|
d78efbd86b | ||
|
|
2f4233bf54 | ||
|
|
c3b18dc7e2 | ||
|
|
cb541c65ec | ||
|
|
27091843bc | ||
|
|
a90235c9ee | ||
|
|
794170ffcc | ||
|
|
102c3bbf5f | ||
|
|
a036af39e3 | ||
|
|
182dc442b4 | ||
|
|
d786754ad7 | ||
|
|
ed2dabd9fb | ||
|
|
bf5f693c9f | ||
|
|
55199f20a5 | ||
|
|
fc9859c835 | ||
|
|
11f1b51449 | ||
|
|
f338ade642 | ||
|
|
3762b8e582 | ||
|
|
b77d757614 | ||
|
|
60513a6f40 | ||
|
|
fd553c6220 | ||
|
|
8798d24fef | ||
|
|
df927a4447 | ||
|
|
b9d95baf55 | ||
|
|
3135271829 | ||
|
|
192ed122a3 | ||
|
|
0e0f6eb1ac | ||
|
|
cbf99755ec | ||
|
|
f88a4d61ac | ||
|
|
8b6be74a60 | ||
|
|
55a2abcefc | ||
|
|
2907b78f2b | ||
|
|
eb439aa374 | ||
|
|
3c336a2370 | ||
|
|
0a9b076b9e | ||
|
|
81ac42d1ff | ||
|
|
fa1dd8cf14 | ||
|
|
41b7a0d5dc | ||
|
|
f69b1d9e89 | ||
|
|
c09b0e5383 | ||
|
|
fd61e87c38 | ||
|
|
2c1b1a7f28 | ||
|
|
b4cd038055 | ||
|
|
d8151fd698 | ||
|
|
fa0cf20a4b | ||
|
|
14c31e32e2 | ||
|
|
d21d0e41fc | ||
|
|
2e4124e018 | ||
|
|
c53c82fd97 | ||
|
|
60ab95695c | ||
|
|
308bcfffe6 | ||
|
|
9ce409e88b | ||
|
|
69e3eecb20 | ||
|
|
6bc6fbf059 | ||
|
|
36bd7c4714 | ||
|
|
ed3ba2e491 | ||
|
|
9dd0541586 | ||
|
|
c752f42246 | ||
|
|
7a1745bcd0 | ||
|
|
19789829f8 | ||
|
|
b419631529 | ||
|
|
1f8a6aae78 | ||
|
|
efddf410f5 | ||
|
|
991f742152 | ||
|
|
96ed3a09b2 | ||
|
|
ee7b9f1637 | ||
|
|
7fecbe5fe7 | ||
|
|
3eea3eda52 | ||
|
|
73496d91a0 | ||
|
|
30564a3983 | ||
|
|
f2ce2ed3da | ||
|
|
ab8ba60c46 | ||
|
|
b8313202e6 | ||
|
|
3b2c4e767c | ||
|
|
06c3027759 | ||
|
|
13aab594ba | ||
|
|
f4307e5b03 | ||
|
|
21594c6ccc | ||
|
|
df2ca3dc72 | ||
|
|
30301c96d1 | ||
|
|
5ea274aeb6 | ||
|
|
5cb5b5731f | ||
|
|
54586d3d04 | ||
|
|
908cb7db8f | ||
|
|
ce94605424 | ||
|
|
a9ad8cf5bc | ||
|
|
e114c3ca75 | ||
|
|
66ecc2a7df | ||
|
|
f508f9af92 | ||
|
|
a7a39e2ac0 | ||
|
|
8492678a37 | ||
|
|
c0e4596641 | ||
|
|
c4b916231f | ||
|
|
75d71a98fb | ||
|
|
a15819e1eb | ||
|
|
bc52fe753b | ||
|
|
919937e5f4 | ||
|
|
203f7a5e31 | ||
|
|
9edc647e16 | ||
|
|
be72e9d7f8 | ||
|
|
3e256f1d19 | ||
|
|
cba397329b | ||
|
|
1a571e4e35 | ||
|
|
6ec883e4c6 | ||
|
|
effa21cfbe | ||
|
|
6b1d6465ce | ||
|
|
e448acd01c | ||
|
|
f61b9547af | ||
|
|
3e9d57a34b | ||
|
|
5ce50d657e | ||
|
|
892ea04a90 | ||
|
|
7cdc3134cf | ||
|
|
3ca6ccaee9 | ||
|
|
caf12dffd7 | ||
|
|
2de78ea45d | ||
|
|
e9de33d7df | ||
|
|
dad560dac4 | ||
|
|
2eda13ba80 | ||
|
|
fb91f5101f | ||
|
|
9c2339409a | ||
|
|
a4ddddf83c | ||
|
|
b8d0622c79 | ||
|
|
e87b4a5c47 | ||
|
|
0160bd554a | ||
|
|
c4594c2b8a | ||
|
|
506edcfebb | ||
|
|
26c22bccc6 | ||
|
|
a4c8c1d37c | ||
|
|
5f48d5f69c | ||
|
|
92738da75e | ||
|
|
c7b53b2949 | ||
|
|
924b467936 | ||
|
|
88fab93069 | ||
|
|
ce9ce85ab1 | ||
|
|
14e5aa9378 | ||
|
|
c15edb10c7 | ||
|
|
d0a84b526e | ||
|
|
31f368e4aa | ||
|
|
e5583f5cb0 | ||
|
|
b71e916d54 | ||
|
|
b002c24153 | ||
|
|
6668972acb | ||
|
|
cd476ce9b8 | ||
|
|
8aa7e32de8 | ||
|
|
095520d631 | ||
|
|
dfe2cfd4e4 | ||
|
|
20c5a41252 | ||
|
|
141cdff016 | ||
|
|
73bea6a3d9 | ||
|
|
2bace16a28 | ||
|
|
bad65feca5 | ||
|
|
9e39bba215 | ||
|
|
9510d6087f | ||
|
|
b968c5ad6f | ||
|
|
d165df7cd6 | ||
|
|
8c142a2b61 | ||
|
|
37279a0e2a | ||
|
|
08aaa98f11 | ||
|
|
07c337fa64 | ||
|
|
5e064830a2 | ||
|
|
e57c9cc4de | ||
|
|
e0ea54d47d | ||
|
|
8111634844 | ||
|
|
386a92fcb6 | ||
|
|
c00446e117 | ||
|
|
43b5377d35 | ||
|
|
bbce1dc247 | ||
|
|
324ab4ded9 | ||
|
|
c9efbaf6be | ||
|
|
b2d01fcb7e | ||
|
|
b425cffddc | ||
|
|
43e4c57276 | ||
|
|
8b141fe238 | ||
|
|
161f14079f | ||
|
|
ea7dd7141f | ||
|
|
269100721f | ||
|
|
a3e7e14189 | ||
|
|
f170ab0d62 | ||
|
|
8058803f39 | ||
|
|
4f0a03ab6a | ||
|
|
0758285b54 | ||
|
|
979542b74d | ||
|
|
6523b2cfbd | ||
|
|
cf64dcb62f | ||
|
|
a10af515f2 | ||
|
|
56cd565813 | ||
|
|
d13178364c | ||
|
|
fe1ba962f7 | ||
|
|
62e18b055a | ||
|
|
02ba151020 | ||
|
|
33315518a7 | ||
|
|
bee451ad2c | ||
|
|
220858c749 | ||
|
|
2a63bd675f | ||
|
|
5ab983b803 | ||
|
|
f77d42a230 | ||
|
|
9737c2c9b4 | ||
|
|
61a78ec23d | ||
|
|
360276af09 | ||
|
|
d979e001d9 | ||
|
|
0f264f407f | ||
|
|
29b1df551d | ||
|
|
a9eb968b26 | ||
|
|
6e78b24ebb | ||
|
|
eac8790692 | ||
|
|
64308e80c1 | ||
|
|
9d437d57c6 | ||
|
|
8ae8309c1f | ||
|
|
106ea3b306 | ||
|
|
2feaab06fe | ||
|
|
b7dcef7225 | ||
|
|
3cb8dce6b3 | ||
|
|
b314be1c67 | ||
|
|
5b51b132bd | ||
|
|
11baf6706f | ||
|
|
3f6496909b | ||
|
|
6cab5d8d46 | ||
|
|
cd27874e8e | ||
|
|
342dbf9d96 | ||
|
|
f3b1edc959 | ||
|
|
d691924642 | ||
|
|
84615139d9 | ||
|
|
9a285340a1 | ||
|
|
0748e0b1e4 | ||
|
|
ff5918d529 | ||
|
|
2a469e1cf3 | ||
|
|
6faf11f882 | ||
|
|
0191a5659d | ||
|
|
e6a6e1053b | ||
|
|
18d6d88c21 | ||
|
|
14e19ef2bf | ||
|
|
5315382109 | ||
|
|
32cb3ebe1c | ||
|
|
15b63a12a7 | ||
|
|
e36b3b55cd | ||
|
|
efba0140cb | ||
|
|
aa22ecbecc | ||
|
|
567346ec0c | ||
|
|
759427fd20 | ||
|
|
f9a4468bad | ||
|
|
e71fec0cfe | ||
|
|
8f79c416b7 | ||
|
|
3294451c73 | ||
|
|
c575c9e300 | ||
|
|
644fe27257 | ||
|
|
30288109a6 | ||
|
|
2fa552d1d4 | ||
|
|
3881a4562c | ||
|
|
7d6138b70c | ||
|
|
907520dc99 | ||
|
|
475beadf55 | ||
|
|
697aab4366 | ||
|
|
1bd6006f63 | ||
|
|
36eb962948 | ||
|
|
eb2ca47493 | ||
|
|
9ead114d4f | ||
|
|
5db9a0b897 | ||
|
|
bced1e4924 | ||
|
|
1372e5c0d3 | ||
|
|
2cd806457b | ||
|
|
d1d979d3d3 | ||
|
|
bed95508f1 | ||
|
|
6877c0298d | ||
|
|
3cc466cfc4 | ||
|
|
0930704a6c | ||
|
|
157659b856 | ||
|
|
322bad116e | ||
|
|
df05dacef7 | ||
|
|
d13ec3a9af | ||
|
|
9eaf9b698f | ||
|
|
8105b5cf9f | ||
|
|
d34bc58a1e | ||
|
|
bb98e26b45 | ||
|
|
d1c33b50ab | ||
|
|
ccae411b60 | ||
|
|
9d2453f5bb | ||
|
|
6d8f1fbc72 | ||
|
|
ef9e6148a5 | ||
|
|
894e7a5e97 | ||
|
|
82c579cf95 | ||
|
|
367a771cf4 | ||
|
|
1c2b5cc9ec | ||
|
|
8b7a1c86ef | ||
|
|
52eebec2d7 | ||
|
|
d9b358fff0 | ||
|
|
68c12dac5d | ||
|
|
13b72fa3c4 | ||
|
|
cbd7cc7538 | ||
|
|
6dcceb37b7 | ||
|
|
86530b6fe5 | ||
|
|
e4fb4b4426 | ||
|
|
12d9a4ecfd | ||
|
|
d486d13bf0 | ||
|
|
9b3b6d25fd | ||
|
|
e78539c824 | ||
|
|
f015b7a048 | ||
|
|
b6a20644f2 | ||
|
|
f815babcfa | ||
|
|
85a416cc51 | ||
|
|
52a0eccd13 | ||
|
|
2b405d0eb1 | ||
|
|
372f581577 | ||
|
|
e01b5987a9 | ||
|
|
75c06bdead | ||
|
|
7a07cb3441 | ||
|
|
860751ce21 | ||
|
|
c60011b444 | ||
|
|
90f3f3c010 | ||
|
|
e86c1370aa | ||
|
|
0406dcfdb4 | ||
|
|
b912cd42cb | ||
|
|
cbfdaf0340 | ||
|
|
cf2d3cfba2 | ||
|
|
2261272c20 | ||
|
|
5749773023 | ||
|
|
3f5592e603 | ||
|
|
ec712a25f8 | ||
|
|
8368ba630a | ||
|
|
f42ae7d7de | ||
|
|
934f3b014a | ||
|
|
625a463414 | ||
|
|
e85b6b7576 | ||
|
|
8c19d49ca1 | ||
|
|
d878d50c97 | ||
|
|
3732dabf36 | ||
|
|
d565e47334 | ||
|
|
59fa886585 | ||
|
|
e8f13f4e63 | ||
|
|
b62f8cfa33 | ||
|
|
bb83b097eb | ||
|
|
710baac496 | ||
|
|
228830142b | ||
|
|
d63a702db8 | ||
|
|
749f480c0d | ||
|
|
4558469892 | ||
|
|
864fd55a98 | ||
|
|
452aec530a | ||
|
|
9d9a34d1ab | ||
|
|
e311bc8fcc | ||
|
|
27850f982f | ||
|
|
8db61274ca | ||
|
|
6fb19643d7 | ||
|
|
35d25bf46c | ||
|
|
1cb88762e9 | ||
|
|
ac94f820b6 | ||
|
|
89d8ba66ea | ||
|
|
17b537849c | ||
|
|
e455461f50 | ||
|
|
3e7d1729eb | ||
|
|
e2be631550 | ||
|
|
3a1090e440 | ||
|
|
5b250cc8f1 | ||
|
|
e4e17ecdfe | ||
|
|
d4bf6c45f0 | ||
|
|
e61a376a00 | ||
|
|
66e8308dca | ||
|
|
b1f6c2e05f | ||
|
|
9084cec1de | ||
|
|
59e3ccccf0 | ||
|
|
6ba42941a0 | ||
|
|
1bc43c0419 | ||
|
|
cc4a3990bb | ||
|
|
4706414949 | ||
|
|
1070a9815a | ||
|
|
0dc906706c | ||
|
|
dfa4c8f539 | ||
|
|
df6afa7c92 | ||
|
|
33ac20ef79 | ||
|
|
eb3ef1a73d | ||
|
|
627eab7a5b | ||
|
|
486bb80725 | ||
|
|
791ba16a99 | ||
|
|
c22319dda2 | ||
|
|
e8294186c2 | ||
|
|
c5410d0a9d | ||
|
|
247f613ded | ||
|
|
cdb43e285e | ||
|
|
99c666ba1f | ||
|
|
c2960b76e0 | ||
|
|
12b064cc82 | ||
|
|
c35acfa385 | ||
|
|
38663c0411 | ||
|
|
80a901ad4e | ||
|
|
5143088069 | ||
|
|
4eba5361d5 | ||
|
|
c5789604db | ||
|
|
b8946bbe6c | ||
|
|
7ce10c058e | ||
|
|
6aefb8f9f3 | ||
|
|
a17e8cf655 | ||
|
|
b889eb031b | ||
|
|
190aff9803 | ||
|
|
f78b64b8c5 | ||
|
|
9fee8e70c7 | ||
|
|
1eea673188 | ||
|
|
a90d0e0d01 | ||
|
|
1265353248 | ||
|
|
f6d52fdc95 | ||
|
|
7cbcc00bcf | ||
|
|
e8a15c1cde | ||
|
|
09b69da2f8 | ||
|
|
56495fa2cc | ||
|
|
99a4a34de2 | ||
|
|
41e5b1f896 | ||
|
|
452b2ca05d | ||
|
|
1ca27363cd | ||
|
|
73ed7a3c09 | ||
|
|
baa0f3bf4a | ||
|
|
d2e5694080 | ||
|
|
09d66100a7 | ||
|
|
ef9df77426 | ||
|
|
58f6b9981a | ||
|
|
0162bee547 | ||
|
|
a48019f5c4 | ||
|
|
f3854a41e1 | ||
|
|
56aac0e8d5 | ||
|
|
17dbd4a3c1 | ||
|
|
1ab1c4009a | ||
|
|
1703f0869c | ||
|
|
afaa80b40b | ||
|
|
9c3dd761e4 | ||
|
|
83ab9c3a48 | ||
|
|
f888031120 | ||
|
|
5deef532c8 | ||
|
|
27370bdc39 | ||
|
|
190a631998 | ||
|
|
e41ea7354e | ||
|
|
e8b3b913fe | ||
|
|
f9f8afa1ad | ||
|
|
2bf50175f1 | ||
|
|
c152769a40 | ||
|
|
d76e39cac5 | ||
|
|
764f9a36fa | ||
|
|
d814037567 | ||
|
|
135a708bf4 | ||
|
|
25ce345d82 | ||
|
|
a396b3e02e | ||
|
|
29d2147792 | ||
|
|
e7d37fac59 | ||
|
|
e1e1df707e | ||
|
|
d92103ad03 | ||
|
|
064e4133e2 | ||
|
|
d58ad2ef03 | ||
|
|
4b6552ca68 | ||
|
|
648cbc644f | ||
|
|
57b47f45b9 | ||
|
|
3efe11e047 | ||
|
|
58b1fa0b5d | ||
|
|
0b5e207619 | ||
|
|
db9f06b008 | ||
|
|
e572e27083 | ||
|
|
34778c3d2b | ||
|
|
9e7133252f | ||
|
|
47ae6c8cd3 | ||
|
|
c3a15c9bfb | ||
|
|
f855e193da | ||
|
|
a2514d4ebf | ||
|
|
d031e89d64 | ||
|
|
2b71a3063e | ||
|
|
3d9c85a69e | ||
|
|
26f4c88c21 | ||
|
|
1eea3ba803 | ||
|
|
0ec4badff1 | ||
|
|
31c6326578 | ||
|
|
dbef184d54 | ||
|
|
a5cdbaa4aa | ||
|
|
e6f9f27cbe | ||
|
|
49b4c70dc9 | ||
|
|
88ff1e2a13 | ||
|
|
0547f00eb5 | ||
|
|
77c616ef00 | ||
|
|
785ca6121b | ||
|
|
8f7ba0f15c | ||
|
|
f154dc20b4 | ||
|
|
aa50466c2c | ||
|
|
2290f38717 | ||
|
|
253dd24c17 | ||
|
|
4c099fdedb | ||
|
|
7291eb5b70 | ||
|
|
c9f7d188ba | ||
|
|
2f7ee90b65 | ||
|
|
09753fb78e | ||
|
|
650edb014e | ||
|
|
8fcb81247b | ||
|
|
e999b2ed84 | ||
|
|
b4606895b3 | ||
|
|
f6709905c9 | ||
|
|
5401c28e2d | ||
|
|
8670877b08 | ||
|
|
f079baa408 | ||
|
|
c9def71c5b | ||
|
|
90e3c373c8 | ||
|
|
54e72bbb24 | ||
|
|
9e792c2e14 | ||
|
|
e03b58a6fd | ||
|
|
73e79da56e | ||
|
|
013ce618f4 | ||
|
|
22ee43487b | ||
|
|
5b59a8f228 | ||
|
|
28f703b17e | ||
|
|
ab494ddbb3 | ||
|
|
9e75117dbb | ||
|
|
8ffac2eb41 | ||
|
|
c89d4446a7 | ||
|
|
cd71f90a5e | ||
|
|
181a060df6 | ||
|
|
67c6c24054 | ||
|
|
654fcc7736 | ||
|
|
28dcd5985d | ||
|
|
95a3d251f2 | ||
|
|
d70fa02a50 | ||
|
|
ee55bcf040 | ||
|
|
6848d3f540 | ||
|
|
00a8d91127 | ||
|
|
5fcb4f8779 | ||
|
|
d700b07f1a | ||
|
|
97cbdb922b | ||
|
|
6ae850442b | ||
|
|
2b990dc80e | ||
|
|
4256aea64a | ||
|
|
0b435a5f22 | ||
|
|
9dc056026b | ||
|
|
3c2cb81fd4 | ||
|
|
8e39b4f676 | ||
|
|
05247d9e06 | ||
|
|
13fa41e77f | ||
|
|
16e6b2a470 | ||
|
|
361c6773aa | ||
|
|
5b95d1c200 | ||
|
|
984f376d6e | ||
|
|
f17fe1876a | ||
|
|
56e4b88349 | ||
|
|
0a25ed53ad | ||
|
|
0e411d08fd | ||
|
|
1971a83f5e | ||
|
|
0bc18806a1 | ||
|
|
a14bfb7ac2 | ||
|
|
42edc2637d | ||
|
|
a5de3c54d0 | ||
|
|
11d9f0d83e | ||
|
|
5c3a7f4954 | ||
|
|
d0ceb53e62 | ||
|
|
867d820daa | ||
|
|
142892835d | ||
|
|
371ddc67bd | ||
|
|
f70e5068aa | ||
|
|
8a56f90268 | ||
|
|
9f9ec374bd | ||
|
|
c7fc87a4f0 | ||
|
|
9f7ed639d2 | ||
|
|
8cb30b8ea8 | ||
|
|
52d5dbc27f | ||
|
|
a555ad0806 | ||
|
|
19a8802e70 | ||
|
|
0fd7f0d094 | ||
|
|
a49d339ff9 | ||
|
|
c2c8226995 | ||
|
|
1ca1f44d5d | ||
|
|
55a35ec3d9 | ||
|
|
c5c07ab5f7 | ||
|
|
29399b127b | ||
|
|
cb103a5dff | ||
|
|
a6f6799412 | ||
|
|
2e2f7df031 | ||
|
|
2478d5c33a | ||
|
|
1ac8873f2a | ||
|
|
daea0a7da0 | ||
|
|
b875079951 | ||
|
|
8377a79129 | ||
|
|
450aba73a6 | ||
|
|
35b58cf109 | ||
|
|
3234d90fbf | ||
|
|
6b54181ba6 | ||
|
|
fa43725309 | ||
|
|
ad0b901d67 | ||
|
|
3fde1c6936 | ||
|
|
fca2340fe4 | ||
|
|
d535823c3d | ||
|
|
d12c0c1a9e | ||
|
|
f9c612c8a1 | ||
|
|
e032c914da | ||
|
|
e5a3d9e865 | ||
|
|
f1f40bc147 | ||
|
|
cb0ea2dabb | ||
|
|
7ea0c3ee36 | ||
|
|
ba7cd69af0 | ||
|
|
d97214e520 | ||
|
|
77a12243ec | ||
|
|
c68f50a483 | ||
|
|
a1ac609b22 | ||
|
|
a13fc2a6b9 | ||
|
|
a1115c3246 | ||
|
|
d8774277cb | ||
|
|
e39085ee63 | ||
|
|
49b9f1f3d9 | ||
|
|
020100451b | ||
|
|
504d4dbe90 | ||
|
|
8913638934 | ||
|
|
b9d920e2e2 | ||
|
|
2ff60eb154 | ||
|
|
69c66c3844 | ||
|
|
66031b3b3f | ||
|
|
26a070f137 | ||
|
|
e43a3c18db | ||
|
|
3af3dadb7f | ||
|
|
6d7afc18cb | ||
|
|
f68dda396a | ||
|
|
56a3dd4b95 | ||
|
|
06392fcba0 | ||
|
|
d774b3b377 | ||
|
|
6b27b6b0ae | ||
|
|
ea717458f1 | ||
|
|
5d84a8dc40 | ||
|
|
5b7db593d3 | ||
|
|
9fdd752ebf | ||
|
|
f5b7bb1dc7 | ||
|
|
fb1479bf81 | ||
|
|
6f60964c5f | ||
|
|
7977650aa7 | ||
|
|
2ec96fa1a0 | ||
|
|
ef702e5917 | ||
|
|
6e9f2c41c6 | ||
|
|
e6032c21f4 | ||
|
|
b4ab60a13a | ||
|
|
6392b1f3f7 | ||
|
|
d662a53044 | ||
|
|
328501de11 | ||
|
|
993defd405 | ||
|
|
3a78ae7f25 | ||
|
|
eaa0cdf3be | ||
|
|
220e0f5cef | ||
|
|
193d636c73 | ||
|
|
65605630cb | ||
|
|
5a783238a6 | ||
|
|
37e1a7cdab | ||
|
|
66d17b77fa | ||
|
|
ae7071e1e6 | ||
|
|
7264bf26c9 | ||
|
|
87ac0accee | ||
|
|
1e6523ec31 | ||
|
|
2e2171e017 | ||
|
|
5a0062d32f | ||
|
|
ea033c26f5 | ||
|
|
de913c131e | ||
|
|
63b2e0214d | ||
|
|
26477ca940 | ||
|
|
dae450bc11 | ||
|
|
0cad5acb1f | ||
|
|
29a53c85d5 | ||
|
|
60ae5b7715 | ||
|
|
5eed5fb0d2 | ||
|
|
2fadd15fc8 | ||
|
|
65addde07d | ||
|
|
18260fc741 | ||
|
|
724af372ab | ||
|
|
d7c519ff19 | ||
|
|
c68221dd67 | ||
|
|
8a08827d64 | ||
|
|
a59bb3141a | ||
|
|
9bb1dc474b | ||
|
|
2ec46c7606 | ||
|
|
fb58f383d7 | ||
|
|
b01f55206c | ||
|
|
fdd5d1abca | ||
|
|
7656e0afa4 | ||
|
|
840a179194 | ||
|
|
9975313208 | ||
|
|
c38169974e | ||
|
|
78e7c0741b | ||
|
|
d490865359 | ||
|
|
38b3577de2 | ||
|
|
1db04a5725 | ||
|
|
27529a1537 | ||
|
|
82f705fdfe | ||
|
|
53943aabf5 | ||
|
|
52ed2266d7 | ||
|
|
91617fb004 | ||
|
|
7a8e956b72 | ||
|
|
f62e835010 | ||
|
|
24eacc2054 | ||
|
|
32e2fa8793 | ||
|
|
2d33d23586 | ||
|
|
f7d1cb161e | ||
|
|
d4286e8547 | ||
|
|
57fff653b5 | ||
|
|
f418a2afbb | ||
|
|
15ab24a070 | ||
|
|
1857e5ea35 | ||
|
|
88b8cc033d | ||
|
|
4006d1c7fb | ||
|
|
926851ca25 | ||
|
|
47f94b367e | ||
|
|
7cd11810bf | ||
|
|
706663aa59 | ||
|
|
3d2c905580 | ||
|
|
0f6f1d0f3e | ||
|
|
4e9c3ba25e | ||
|
|
3d067dd736 | ||
|
|
62e82a6c1e | ||
|
|
e2b759a783 | ||
|
|
658653bd7d | ||
|
|
ddc8bf79df | ||
|
|
404f16fa88 | ||
|
|
ca84d79658 | ||
|
|
4d0ac3fa5d | ||
|
|
7823cd3bed | ||
|
|
190bd71c32 | ||
|
|
3ad078819c | ||
|
|
50a43c1357 | ||
|
|
e45c0727bd | ||
|
|
09c407b904 | ||
|
|
07926924e1 | ||
|
|
d0915d8140 | ||
|
|
8d4a2c22ad | ||
|
|
db0ebac216 | ||
|
|
e7efbeed67 | ||
|
|
80357e8175 | ||
|
|
64edea9e85 | ||
|
|
1d1fa58d87 | ||
|
|
7516311242 | ||
|
|
9bbf4e2486 | ||
|
|
70e6e3e05f | ||
|
|
c5182f37cf | ||
|
|
c49ce635d0 | ||
|
|
1fbb294c59 | ||
|
|
5f80e0a2ba | ||
|
|
2acb957cab | ||
|
|
97371dd60c | ||
|
|
96467b414f | ||
|
|
3e1dbcbff4 | ||
|
|
cb19d9f778 | ||
|
|
a9ecee158f | ||
|
|
f3cdb0ecf4 | ||
|
|
566c40a6e6 | ||
|
|
68c5bb1424 | ||
|
|
6eb339828f | ||
|
|
e6e313ed79 | ||
|
|
ed4f196a37 | ||
|
|
f030d64ebf | ||
|
|
8ba6cf44e5 | ||
|
|
5830c14e30 | ||
|
|
5264336c0f | ||
|
|
831b0e152c | ||
|
|
db39a57518 | ||
|
|
8d549c63c7 | ||
|
|
9f8aa5137e | ||
|
|
b9e2d37fe4 | ||
|
|
013a318299 | ||
|
|
8d6c03f433 | ||
|
|
bd58410b95 |
@@ -1,35 +0,0 @@
|
||||
image: nixos/unstable
|
||||
sources:
|
||||
- https://git.sr.ht/~rycee/home-manager
|
||||
secrets:
|
||||
- 01ad357c-3214-4f73-bb7e-2441e440cc51
|
||||
- 7d16ccc0-1c4f-4fd6-91c1-c54fc0f5807f
|
||||
- bd5f26ee-78b8-4a6f-9d68-8d8f53a068f1
|
||||
environment:
|
||||
NIX_CONFIG: "experimental-features = nix-command flakes"
|
||||
packages:
|
||||
- nixos.cachix
|
||||
- nixos.jq
|
||||
tasks:
|
||||
- setup: |
|
||||
cachix use rycee
|
||||
- build: |
|
||||
cd ./home-manager
|
||||
gitBranch="$(git show -s --pretty=%D HEAD | sed '{ s/.*, //; s!origin/!!; }')"
|
||||
[[ $gitBranch == master || $gitBranch == release-??.?? ]] || exit 0
|
||||
nix build -L .#docs-html
|
||||
cachix push rycee ./result
|
||||
- deploy: |
|
||||
cd ./home-manager
|
||||
gitBranch="$(git show -s --pretty=%D HEAD | sed '{ s/.*, //; s!origin/!!; }')"
|
||||
[[ $gitBranch == master || $gitBranch == release-??.?? ]] || exit 0
|
||||
|
||||
if [[ $gitBranch == master ]]; then
|
||||
dirName="unstable"
|
||||
else
|
||||
dirName="$(jq -r .release < release.json)"
|
||||
fi
|
||||
|
||||
rsync --delete -r --info=stats \
|
||||
"result/share/doc/home-manager/" \
|
||||
"hm-web:/srv/www/home-manager.dev/manual/$dirName"
|
||||
@@ -1,24 +0,0 @@
|
||||
# http://editorconfig.org
|
||||
root = true
|
||||
|
||||
[*]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
|
||||
# The JSON files contain newlines inconsistently
|
||||
[*.json]
|
||||
insert_final_newline = unset
|
||||
|
||||
# Makefiles always use tabs for indentation
|
||||
[Makefile]
|
||||
indent_style = tab
|
||||
|
||||
[*.md]
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
[*.plist]
|
||||
insert_final_newline = false
|
||||
@@ -1,61 +0,0 @@
|
||||
# This file contains a list of commits that are not likely what you
|
||||
# are looking for in a blame, such as mass reformatting or renaming.
|
||||
#
|
||||
# $ git config blame.ignoreRevsFile .git-blame-ignore-revs
|
||||
|
||||
# Treewide nixfmt-rfc-style
|
||||
cba2f9ce95c8d10b66cacf05a275e3ad71959638
|
||||
|
||||
# Treewide remove with lib
|
||||
0b491b460f52e87e23eb17bbf59c6ae64b7664c1
|
||||
95711f926676018d279ba09fe7530d03b5d5b3e2
|
||||
5e193cdcab61b5e7096ef3c132fdc0149e14f2d9
|
||||
55cf1f16324e694c991e846ad5fc897f0f75ac64
|
||||
a710f337d6f541f5ba50bc2d5daa6c34e9ee5834
|
||||
10dca990ae02aaf41ff12c5b18dd3dcf258c0d04
|
||||
d7f451d7b13bbe075abecfd345f8b149a000216a
|
||||
65413f297f8c4c42a99270c15bce7bda1bfea724
|
||||
b5976017741653251258112f7e6ee5d8b9e3a832
|
||||
e0be70bcf94be20f8f0f6d215d909b614ab6ebeb
|
||||
e30c6a41bc8548738341d10c0b17f8fead8e55ee
|
||||
b5142d46a3f912ef99e9cec3e51d757fbeaf14ea
|
||||
56374cc64d58451b359bb4e8502387d3a96e7c7b
|
||||
32531e457215000b739da6cd40acfb080823f396
|
||||
34d524f3edcf3a04c00ad2c09c24ec9d35d937f9
|
||||
439a125afef8c97308ec0c6db75d38e15d92208d
|
||||
5031c6d2978109336637977c165f82aa49fa16a7
|
||||
b34b56689dcc75294e14e8c95db4e054a4e9573f
|
||||
234613d77c939ff2e2c0f2c476a56d80930e5b8b
|
||||
e3baf274f47678df6289c7482353cb6d38b7be5d
|
||||
c90cd85b04ff3348978b05ba73ffc8e1b74b9fce
|
||||
2d731a33b193209cb88b874e508ea912765f7d99
|
||||
20fd9686b85dc64657a176466e23d0f3a5e1f760
|
||||
96dee79b178d295b716052feca3ee46abc085abe
|
||||
97d7946b5e107dd03cc82f21165251d4e0159655
|
||||
0dfec9deb275854a56c97c356c40ef72e3a2e632
|
||||
4b2d3b03becc184f2d1485e109c6a55f94d5f886
|
||||
|
||||
# Treewide remove lib.mdDoc
|
||||
9f9e277b60a6e6915ad3a129e06861044b50fdf2
|
||||
|
||||
# Treewide replace usage of literalExample
|
||||
bd11e2c5e67385970e59e55ba7a4c35d1ffaee4d
|
||||
|
||||
# Treewide nix fmt change
|
||||
b4752b0eda6302b92a6d5dd554c83f188bc3ae6d
|
||||
9136120c369d91144910a985262e3c3b8e8872d6
|
||||
|
||||
# Treewide remove noops
|
||||
f2f1076c1f789595c2a2b18b76466fbd691025dd
|
||||
|
||||
# Treewide statix cleanup
|
||||
01ea51d7065e0ab06a09df9db4d1c17f6eb2675f
|
||||
74d8d470345b9324f89e14d675c14b92dc4a091d
|
||||
5209a256fd507322b0dd09ade7bc61923da948cf
|
||||
11ad9d2e42ebf6d00db4d7bae252f1c6b7dd36a4
|
||||
74b0e979375b0ed469e2394820aa50ba2114800b
|
||||
de90ee24082bb8dd44145f5c733b807467856820
|
||||
|
||||
# Deadnix cleanup
|
||||
71402c5df34df5ee7b6c10d738018f9f0c8bde2b
|
||||
a93d80bcec089abf80894c25ee3934b7e196bbd9
|
||||
@@ -1,38 +0,0 @@
|
||||
name: "✨ Feature Request"
|
||||
description: "Suggest an improvement to Home Manager"
|
||||
title: "[Feature Request] "
|
||||
labels: ["feature request"]
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Thank you for contributing to Home Manager!
|
||||
|
||||
Before you open a new issue, please search the existing issues to see if your feature has already been requested or discussed.
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: "## 🔧 Existing Module Improvement"
|
||||
- type: input
|
||||
id: existing-module-name
|
||||
attributes:
|
||||
label: Module Name
|
||||
description: "What is the name of the module?"
|
||||
placeholder: "e.g., programs.git"
|
||||
- type: textarea
|
||||
id: existing-module-feature
|
||||
attributes:
|
||||
label: Requested Feature
|
||||
description: "Please describe the new feature or improvement in detail."
|
||||
- type: textarea
|
||||
id: existing-module-limitation
|
||||
attributes:
|
||||
label: Current Limitations
|
||||
description: "Why can't your goal be achieved with the current implementation? Please be specific."
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: "---"
|
||||
- type: textarea
|
||||
id: additional-context
|
||||
attributes:
|
||||
label: Additional Context
|
||||
description: Add any other context, screenshots, or configuration examples about the feature request here.
|
||||
@@ -1,50 +0,0 @@
|
||||
name: Bug Report
|
||||
description: File a bug/issue
|
||||
title: 'bug: '
|
||||
labels: [bug, triage]
|
||||
|
||||
body:
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: Are you following the right branch?
|
||||
description: |
|
||||
You should follow the branch of Home Manager that corresponds to your
|
||||
version of Nixpkgs; see [the README](https://github.com/nix-community/home-manager#releases) for details.
|
||||
options:
|
||||
- label: My Nixpkgs and Home Manager versions are in sync
|
||||
required: true
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: Is there an existing issue for this?
|
||||
description: |
|
||||
Please search to see if an issue already exists for the bug you encountered.
|
||||
options:
|
||||
- label: I have searched the existing issues
|
||||
required: true
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Issue description
|
||||
description: |
|
||||
Please describe the issue.
|
||||
|
||||
For support and help please use the IRC channel #home-manager at irc.oftc.net or
|
||||
Matrix room <https://matrix.to/#/#hm:rycee.net> instead.
|
||||
validations:
|
||||
required: false
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Maintainer CC
|
||||
description: |
|
||||
Please @ people who are in the `meta.maintainers` list of the offending module.
|
||||
validations:
|
||||
required: false
|
||||
- type: textarea
|
||||
id: system
|
||||
attributes:
|
||||
label: System information
|
||||
description: |
|
||||
Please run `nix-shell -p nix-info --run "nix-info -m"` and paste the result.
|
||||
render: markdown
|
||||
validations:
|
||||
required: true
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
name: "✨ New Module Request"
|
||||
description: "Suggest an addition to Home Manager"
|
||||
title: "[New Module Request] "
|
||||
labels: ["new module request"]
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Thank you for contributing to Home Manager!
|
||||
|
||||
Before you open a new issue, please search the existing issues to see if your feature has already been requested or discussed.
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: "## ➕ New Program or Service"
|
||||
- type: input
|
||||
id: new-program-name
|
||||
attributes:
|
||||
label: Program/Service Name
|
||||
description: "What is the name of the program or service you would like to add?"
|
||||
placeholder: "e.g., my-cool-cli-tool"
|
||||
- type: input
|
||||
id: new-program-repo
|
||||
attributes:
|
||||
label: Upstream Repository
|
||||
description: "Please provide a link to the source code repository."
|
||||
placeholder: "https://github.com/user/repo"
|
||||
- type: textarea
|
||||
id: new-program-docs
|
||||
attributes:
|
||||
label: Configuration Documentation
|
||||
description: "Please provide links to any relevant documentation for configuring this program."
|
||||
placeholder: "e.g., man page, project wiki, configuration file examples, etc."
|
||||
- type: textarea
|
||||
id: new-program-reason
|
||||
attributes:
|
||||
label: Reason for Addition
|
||||
description: "**Why do you want this program or service added to Home Manager?"
|
||||
@@ -1,49 +0,0 @@
|
||||
### Description
|
||||
|
||||
<!--
|
||||
|
||||
Please provide a brief description of your change.
|
||||
|
||||
-->
|
||||
|
||||
### Checklist
|
||||
|
||||
<!--
|
||||
|
||||
Please go through the following checklist before opening a non-WIP
|
||||
pull-request.
|
||||
|
||||
Also make sure to read the guidelines found at
|
||||
|
||||
https://nix-community.github.io/home-manager/#sec-guidelines
|
||||
|
||||
-->
|
||||
|
||||
- [ ] Change is backwards compatible.
|
||||
|
||||
- [ ] Code formatted with `nix fmt` or
|
||||
`nix-shell -A dev --run treefmt`.
|
||||
|
||||
- [ ] Code tested through `nix build .#test-all`
|
||||
or a targeted `nix run .#tests -- <pattern>`.
|
||||
|
||||
- [ ] Test cases updated/added. See [example](https://github.com/nix-community/home-manager/commit/f3fbb50b68df20da47f9b0def5607857fcc0d021#diff-b61a6d542f9036550ba9c401c80f00ef).
|
||||
|
||||
- [ ] Commit messages are formatted like
|
||||
|
||||
```
|
||||
{component}: {description}
|
||||
|
||||
{long description}
|
||||
```
|
||||
|
||||
See [CONTRIBUTING](https://nix-community.github.io/home-manager/#sec-commit-style) for more information and [recent commit messages](https://github.com/nix-community/home-manager/commits/master) for examples.
|
||||
|
||||
- If this PR adds a new module
|
||||
|
||||
- [ ] Added myself as module maintainer. See [example](https://github.com/nix-community/home-manager/blob/a51598236f23c89e59ee77eb8e0614358b0e896c/modules/programs/lesspipe.nix#L11).
|
||||
- [ ] Generate a news entry. See [News](https://nix-community.github.io/home-manager/index.xhtml#sec-news)
|
||||
- [ ] Basic tests added. See [Tests](https://nix-community.github.io/home-manager/index.xhtml#sec-tests)
|
||||
|
||||
- If this PR adds an exciting new feature or contains a breaking change.
|
||||
- [ ] Generate a news entry. See [News](https://nix-community.github.io/home-manager/index.xhtml#sec-news)
|
||||
@@ -1,30 +0,0 @@
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
target-branch: "master"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
commit-message:
|
||||
prefix: "ci:"
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
target-branch: "release-26.05"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
commit-message:
|
||||
prefix: "ci:"
|
||||
- package-ecosystem: "nix"
|
||||
directory: "/"
|
||||
target-branch: "master"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
commit-message:
|
||||
prefix: "flake:"
|
||||
- package-ecosystem: "nix"
|
||||
directory: "/"
|
||||
target-branch: "release-26.05"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
commit-message:
|
||||
prefix: "flake:"
|
||||
@@ -1,744 +0,0 @@
|
||||
"release":
|
||||
- base-branch:
|
||||
- '^release-.*'
|
||||
"ai":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/aiac.nix
|
||||
- modules/programs/aichat.nix
|
||||
- modules/programs/aider-chat.nix
|
||||
- modules/programs/claude-code/**/*
|
||||
- modules/programs/codex.nix
|
||||
- modules/programs/fabric-ai.nix
|
||||
- modules/programs/antigravity-cli.nix
|
||||
- modules/programs/mcp.nix
|
||||
- modules/programs/mistral-vibe.nix
|
||||
- modules/programs/mods.nix
|
||||
- modules/programs/opencode.nix
|
||||
- modules/services/local-ai.nix
|
||||
- modules/services/ollama.nix
|
||||
"audio":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/beets.nix
|
||||
- modules/programs/cava.nix
|
||||
- modules/programs/cavalier.nix
|
||||
- modules/programs/cmus.nix
|
||||
- modules/programs/ncmpcpp.nix
|
||||
- modules/programs/ncspot.nix
|
||||
- modules/programs/pianobar.nix
|
||||
- modules/programs/pyradio.nix
|
||||
- modules/programs/radio-active.nix
|
||||
- modules/programs/radio-cli.nix
|
||||
- modules/programs/rmpc.nix
|
||||
- modules/programs/spotify-player.nix
|
||||
- modules/programs/timidity.nix
|
||||
- modules/services/amberol.nix
|
||||
- modules/services/easyeffects.nix
|
||||
- modules/services/fluidsynth.nix
|
||||
- modules/services/librespot.nix
|
||||
- modules/services/listenbrainz-mpd.nix
|
||||
- modules/services/mopidy.nix
|
||||
- modules/services/mpd-discord-rpc.nix
|
||||
- modules/services/mpd-mpris.nix
|
||||
- modules/services/mpd.nix
|
||||
- modules/services/mpdris2-rs.nix
|
||||
- modules/services/mpdris2.nix
|
||||
- modules/services/mpdscribble.nix
|
||||
- modules/services/mpris-proxy.nix
|
||||
- modules/services/pasystray.nix
|
||||
- modules/services/playerctld.nix
|
||||
- modules/services/pulseeffects.nix
|
||||
- modules/services/rescrobbled.nix
|
||||
- modules/services/spotifyd.nix
|
||||
- tests/modules/services/mpd/**/*
|
||||
"automation":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/services/autotiling.nix
|
||||
- modules/services/caffeine.nix
|
||||
- modules/services/darkman.nix
|
||||
- modules/services/devilspie2.nix
|
||||
- modules/services/espanso.nix
|
||||
- modules/services/keynav.nix
|
||||
- modules/services/skhd.nix
|
||||
"backup":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/borgmatic.nix
|
||||
- modules/programs/rclone.nix
|
||||
- modules/services/borgmatic.nix
|
||||
- modules/services/restic.nix
|
||||
- tests/modules/programs/borgmatic/**/*
|
||||
- tests/modules/services/borgmatic/**/*
|
||||
"bars":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/ashell.nix
|
||||
- modules/programs/eww.nix
|
||||
- modules/programs/hyprpanel/default.nix
|
||||
- modules/programs/i3bar-river.nix
|
||||
- modules/programs/sketchybar.nix
|
||||
- modules/programs/tray-tui.nix
|
||||
- modules/programs/waybar.nix
|
||||
- modules/programs/xmobar.nix
|
||||
- modules/programs/yambar.nix
|
||||
- modules/services/polybar.nix
|
||||
- modules/services/taffybar.nix
|
||||
- tests/modules/programs/ashell/**/*
|
||||
- tests/modules/programs/i3bar-river/**/*
|
||||
- tests/modules/programs/waybar/**/*
|
||||
- tests/modules/services/polybar/**/*
|
||||
"browsers":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/misc/mozilla-messaging-hosts.nix
|
||||
- modules/programs/amfora.nix
|
||||
- modules/programs/chawan.nix
|
||||
- modules/programs/chromium.nix
|
||||
- modules/programs/firefox/**/*
|
||||
- modules/programs/firefoxpwa.nix
|
||||
- modules/programs/floorp.nix
|
||||
- modules/programs/librewolf.nix
|
||||
- modules/programs/nyxt.nix
|
||||
- modules/programs/qutebrowser.nix
|
||||
- modules/programs/w3m.nix
|
||||
- tests/modules/programs/chromium/**/*
|
||||
- tests/modules/programs/firefox/**/*
|
||||
- tests/modules/programs/qutebrowser/**/*
|
||||
"calendar":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/*/vdirsyncer*.nix
|
||||
- modules/accounts/calendar.nix
|
||||
- modules/programs/khal/**/*
|
||||
- modules/programs/pimsync/**/*
|
||||
- modules/programs/qcal.nix
|
||||
- modules/programs/vdirsyncer/**/*
|
||||
- modules/services/pimsync.nix
|
||||
- tests/modules/programs/khal/**/*
|
||||
"clipboard":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/services/clipcat.nix
|
||||
- modules/services/cliphist.nix
|
||||
- modules/services/clipman.nix
|
||||
- modules/services/clipmenu.nix
|
||||
- modules/services/clipse.nix
|
||||
- modules/services/copyq.nix
|
||||
- modules/services/parcellite.nix
|
||||
- modules/services/pbgopy.nix
|
||||
- modules/services/wl-clip-persist.nix
|
||||
- tests/modules/services/clipman/**/*
|
||||
- tests/modules/services/copyq/**/*
|
||||
- tests/modules/services/wl-clip-persist/**/*
|
||||
"cli-tools":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/aliae.nix
|
||||
- modules/programs/amoco.nix
|
||||
- modules/programs/antidote.nix
|
||||
- modules/programs/atool.nix
|
||||
- modules/programs/atuin.nix
|
||||
- modules/programs/autojump.nix
|
||||
- modules/programs/bashmount.nix
|
||||
- modules/programs/bat.nix
|
||||
- modules/programs/bottom.nix
|
||||
- modules/programs/boxxy.nix
|
||||
- modules/programs/broot.nix
|
||||
- modules/programs/btop.nix
|
||||
- modules/programs/carapace.nix
|
||||
- modules/programs/clock-rs.nix
|
||||
- modules/programs/delta.nix
|
||||
- modules/programs/diff-highlight.nix
|
||||
- modules/programs/diff-so-fancy.nix
|
||||
- modules/programs/difftastic.nix
|
||||
- modules/programs/dircolors.nix
|
||||
- modules/programs/direnv.nix
|
||||
- modules/programs/eza.nix
|
||||
- modules/programs/fastfetch.nix
|
||||
- modules/programs/fd.nix
|
||||
- modules/programs/fzf.nix
|
||||
- modules/programs/goto.nix
|
||||
- modules/programs/grep.nix
|
||||
- modules/programs/hstr.nix
|
||||
- modules/programs/htop.nix
|
||||
- modules/programs/hwatch.nix
|
||||
- modules/programs/hyfetch.nix
|
||||
- modules/programs/infat.nix
|
||||
- modules/programs/inori.nix
|
||||
- modules/programs/jq*.nix
|
||||
- modules/programs/keychain.nix
|
||||
- modules/programs/less.nix
|
||||
- modules/programs/lesspipe.nix
|
||||
- modules/programs/lsd.nix
|
||||
- modules/programs/man.nix
|
||||
- modules/programs/mc.nix
|
||||
- modules/programs/mcfly.nix
|
||||
- modules/programs/navi.nix
|
||||
- modules/programs/nix-your-shell.nix
|
||||
- modules/programs/nom.nix
|
||||
- modules/programs/parallel.nix
|
||||
- modules/programs/patdiff.nix
|
||||
- modules/programs/pay-respects.nix
|
||||
- modules/programs/pazi.nix
|
||||
- modules/programs/pet.nix
|
||||
- modules/programs/pistol.nix
|
||||
- modules/programs/pls.nix
|
||||
- modules/programs/readline.nix
|
||||
- modules/programs/riff.nix
|
||||
- modules/programs/ripgrep*.nix
|
||||
- modules/programs/scmpuff.nix
|
||||
- modules/programs/screen.nix
|
||||
- modules/programs/script-directory.nix
|
||||
- modules/programs/sesh.nix
|
||||
- modules/programs/sherlock.nix
|
||||
- modules/programs/skim.nix
|
||||
- modules/programs/superfile.nix
|
||||
- modules/programs/tealdeer.nix
|
||||
- modules/programs/television.nix
|
||||
- modules/programs/tmate.nix
|
||||
- modules/programs/tmux.nix
|
||||
- modules/programs/topgrade.nix
|
||||
- modules/programs/translate-shell.nix
|
||||
- modules/programs/ty.nix
|
||||
- modules/programs/uv.nix
|
||||
- modules/programs/vivid.nix
|
||||
- modules/programs/watson.nix
|
||||
- modules/programs/z-lua.nix
|
||||
- modules/programs/zellij.nix
|
||||
- modules/programs/zk.nix
|
||||
- modules/programs/zoxide.nix
|
||||
- modules/programs/zplug.nix
|
||||
- tests/modules/programs/fzf/**/*
|
||||
- tests/modules/programs/tmux/**/*
|
||||
"contacts":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/accounts/contacts.nix
|
||||
- modules/programs/abook.nix
|
||||
- modules/programs/khard.nix
|
||||
- tests/modules/programs/abook/**/*
|
||||
- tests/modules/programs/khard/**/*
|
||||
"containers":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/distrobox.nix
|
||||
- modules/programs/docker-cli.nix
|
||||
- modules/services/colima.nix
|
||||
- modules/services/podman/**/*
|
||||
- modules/services/podman/linux/**/*
|
||||
"desktop-ui":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/desktoppr.nix
|
||||
- modules/programs/gnome-shell.nix
|
||||
- modules/programs/hyprshot.nix
|
||||
- modules/programs/quickshell.nix
|
||||
- modules/programs/satty.nix
|
||||
- modules/programs/swappy.nix
|
||||
- modules/services/avizo.nix
|
||||
- modules/services/blanket.nix
|
||||
- modules/services/flameshot.nix
|
||||
- modules/services/gromit-mpx.nix
|
||||
- modules/services/linux-wallpaperengine.nix
|
||||
- modules/services/picom.nix
|
||||
- modules/services/random-background.nix
|
||||
- modules/services/volnoti.nix
|
||||
- modules/services/wob.nix
|
||||
- modules/services/wpaperd.nix
|
||||
"desktop-utilities":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/autorandr.nix
|
||||
- modules/programs/bluetuith.nix
|
||||
- modules/services/autorandr.nix
|
||||
- modules/services/blueman-applet.nix
|
||||
- modules/services/gnome-keyring.nix
|
||||
- modules/services/lxqt-policykit-agent.nix
|
||||
- modules/services/network-manager-applet.nix
|
||||
- modules/services/polkit-gnome.nix
|
||||
- modules/services/redshift-gammastep/**/*
|
||||
- modules/services/sctd.nix
|
||||
- modules/services/snixembed.nix
|
||||
- modules/services/status-notifier-watcher.nix
|
||||
- modules/services/systembus-notify.nix
|
||||
- modules/services/tailscale-systray.nix
|
||||
- modules/services/trayscale.nix
|
||||
- modules/services/udiskie.nix
|
||||
- modules/services/unclutter.nix
|
||||
- modules/services/xembed-sni-proxy.nix
|
||||
"dev-tools":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/amber.nix
|
||||
- modules/programs/awscli.nix
|
||||
- modules/programs/bacon.nix
|
||||
- modules/programs/bun.nix
|
||||
- modules/programs/cargo.nix
|
||||
- modules/programs/darcs.nix
|
||||
- modules/programs/earthly.nix
|
||||
- modules/programs/eclipse.nix
|
||||
- modules/programs/gcc.nix
|
||||
- modules/programs/go.nix
|
||||
- modules/programs/gradle.nix
|
||||
- modules/programs/granted.nix
|
||||
- modules/programs/grype.nix
|
||||
- modules/programs/java.nix
|
||||
- modules/programs/jetbrains-remote.nix
|
||||
- modules/programs/k9s.nix
|
||||
- modules/programs/kraftkit.nix
|
||||
- modules/programs/kubecolor.nix
|
||||
- modules/programs/kubeswitch.nix
|
||||
- modules/programs/lazydocker.nix
|
||||
- modules/programs/lazysql.nix
|
||||
- modules/programs/matplotlib.nix
|
||||
- modules/programs/mercurial.nix
|
||||
- modules/programs/mergiraf.nix
|
||||
- modules/programs/mise.nix
|
||||
- modules/programs/mr.nix
|
||||
- modules/programs/mypy.nix
|
||||
- modules/programs/nh.nix
|
||||
- modules/programs/nix-index.nix
|
||||
- modules/programs/nix-init.nix
|
||||
- modules/programs/nix-search-tv.nix
|
||||
- modules/programs/npm.nix
|
||||
- modules/programs/numbat.nix
|
||||
- modules/programs/nvchecker.nix
|
||||
- modules/programs/opam.nix
|
||||
- modules/programs/openstackclient.nix
|
||||
- modules/programs/pgcli.nix
|
||||
- modules/programs/piston-cli.nix
|
||||
- modules/programs/poetry.nix
|
||||
- modules/programs/pyenv.nix
|
||||
- modules/programs/pylint.nix
|
||||
- modules/programs/pywal.nix
|
||||
- modules/programs/rbenv.nix
|
||||
- modules/programs/rizin.nix
|
||||
- modules/programs/ruff.nix
|
||||
- modules/programs/sagemath.nix
|
||||
- modules/programs/sbt.nix
|
||||
- modules/programs/sftpman.nix
|
||||
- modules/programs/smug.nix
|
||||
- modules/programs/sqls.nix
|
||||
- modules/programs/tex-fmt.nix
|
||||
- modules/programs/texlive.nix
|
||||
- modules/programs/tirith.nix
|
||||
- modules/programs/vim-vint.nix
|
||||
- modules/programs/visidata.nix
|
||||
- modules/programs/yarn/default.nix
|
||||
- modules/services/lorri.nix
|
||||
- tests/modules/programs/go/**/*
|
||||
- tests/modules/programs/java/**/*
|
||||
"editors":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/amp.nix
|
||||
- modules/programs/anvil-editor.nix
|
||||
- modules/programs/cudatext.nix
|
||||
- modules/programs/emacs.nix
|
||||
- modules/programs/formiko.nix
|
||||
- modules/programs/fresh-editor.nix
|
||||
- modules/programs/helix.nix
|
||||
- modules/programs/kakoune.nix
|
||||
- modules/programs/lapce.nix
|
||||
- modules/programs/micro.nix
|
||||
- modules/programs/ne.nix
|
||||
- modules/programs/neovide.nix
|
||||
- modules/programs/neovim.nix
|
||||
- modules/programs/retext.nix
|
||||
- modules/programs/vim.nix
|
||||
- modules/programs/vscode/**/*
|
||||
- modules/programs/zed-editor.nix
|
||||
- modules/services/emacs.nix
|
||||
- tests/modules/programs/emacs/**/*
|
||||
- tests/modules/programs/helix/**/*
|
||||
- tests/modules/programs/neovim/**/*
|
||||
- tests/modules/programs/vim/**/*
|
||||
"file-manager":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/joshuto.nix
|
||||
- modules/programs/lf.nix
|
||||
- modules/programs/nnn.nix
|
||||
- modules/programs/ranger.nix
|
||||
- modules/programs/vifm.nix
|
||||
- modules/programs/xplr.nix
|
||||
- modules/programs/yazi.nix
|
||||
- tests/modules/programs/lf/**/*
|
||||
- tests/modules/programs/nnn/**/*
|
||||
- tests/modules/programs/ranger/**/*
|
||||
- tests/modules/programs/yazi/**/*
|
||||
"gaming":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/am2rlauncher.nix
|
||||
- modules/programs/kodi.nix
|
||||
- modules/programs/lutris.nix
|
||||
- modules/programs/mangohud.nix
|
||||
- modules/programs/prismlauncher.nix
|
||||
- modules/programs/retroarch.nix
|
||||
- modules/programs/sm64ex.nix
|
||||
- modules/programs/ttyper.nix
|
||||
- modules/programs/vinegar.nix
|
||||
- modules/services/ludusavi.nix
|
||||
"git":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/gh.nix
|
||||
- modules/programs/gh-dash.nix
|
||||
- modules/programs/git*.nix
|
||||
- modules/programs/jjui.nix
|
||||
- modules/programs/jujutsu.nix
|
||||
- modules/programs/lazygit.nix
|
||||
- modules/programs/lazyworktree.nix
|
||||
- modules/programs/radicle.nix
|
||||
- modules/programs/sapling.nix
|
||||
- modules/services/git-sync.nix
|
||||
- modules/services/radicle.nix
|
||||
- tests/modules/programs/gh/**/*
|
||||
- tests/modules/programs/gh-dash/**/*
|
||||
- tests/modules/programs/git/**/*
|
||||
"mail":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/*/mbsync*
|
||||
- modules/programs/aerc/**/*
|
||||
- modules/programs/afew.nix
|
||||
- modules/programs/alot/**/*
|
||||
- modules/programs/astroid/**/*
|
||||
- modules/programs/getmail*
|
||||
- modules/programs/getmail/**/*
|
||||
- modules/programs/himalaya.nix
|
||||
- modules/programs/lieer.nix
|
||||
- modules/programs/mbsync/**/*
|
||||
- modules/programs/meli.nix
|
||||
- modules/programs/msmtp*
|
||||
- modules/programs/msmtp/**/*
|
||||
- modules/programs/mu.nix
|
||||
- modules/programs/mujmap.nix
|
||||
- modules/programs/neomutt*
|
||||
- modules/programs/neomutt/**/*
|
||||
- modules/programs/notmuch/**/*
|
||||
- modules/programs/offlineimap/**/*
|
||||
- modules/programs/thunderbird.nix
|
||||
- modules/services/getmail.nix
|
||||
- modules/services/imapnotify/**/*
|
||||
- modules/services/lieer.nix
|
||||
- modules/services/muchsync.nix
|
||||
- modules/services/protonmail-bridge.nix
|
||||
- tests/modules/programs/aerc/*
|
||||
- tests/modules/programs/alot/*
|
||||
- tests/modules/programs/himalaya/*
|
||||
- tests/modules/programs/mbsync/*
|
||||
- tests/modules/programs/mujmap/*
|
||||
- tests/modules/programs/neomutt/*
|
||||
- tests/modules/programs/thunderbird/*
|
||||
"messaging":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/abaddon.nix
|
||||
- modules/programs/algia.nix
|
||||
- modules/programs/discocss.nix
|
||||
- modules/programs/discord.nix
|
||||
- modules/programs/element-desktop.nix
|
||||
- modules/programs/gurk-rs.nix
|
||||
- modules/programs/halloy.nix
|
||||
- modules/programs/havoc.nix
|
||||
- modules/programs/hexchat.nix
|
||||
- modules/programs/iamb.nix
|
||||
- modules/programs/irssi.nix
|
||||
- modules/programs/nheko.nix
|
||||
- modules/programs/pidgin.nix
|
||||
- modules/programs/senpai.nix
|
||||
- modules/programs/tiny.nix
|
||||
- modules/programs/vesktop.nix
|
||||
- modules/programs/zapzap.nix
|
||||
- modules/services/pantalaimon.nix
|
||||
- tests/modules/programs/gurk-rs/**/*
|
||||
- tests/modules/programs/irssi/**/*
|
||||
- tests/modules/programs/nheko/**/*
|
||||
"monitoring":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/services/activitywatch.nix
|
||||
- modules/services/batsignal.nix
|
||||
- modules/services/cbatticon.nix
|
||||
- modules/services/conky.nix
|
||||
- modules/services/glance.nix
|
||||
- modules/services/poweralertd.nix
|
||||
"notification":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/noti.nix
|
||||
- modules/services/dunst.nix
|
||||
- modules/services/fnott.nix
|
||||
- modules/services/mako.nix
|
||||
- modules/services/notify-osd.nix
|
||||
- modules/services/swaync.nix
|
||||
- modules/services/twmn.nix
|
||||
- tests/modules/services/dunst/**/*
|
||||
- tests/modules/services/mako/**/*
|
||||
"productivity":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/anki/**/*
|
||||
- modules/programs/aphorme.nix
|
||||
- modules/programs/calibre.nix
|
||||
- modules/programs/comodoro.nix
|
||||
- modules/programs/foliate.nix
|
||||
- modules/programs/info.nix
|
||||
- modules/programs/joplin-desktop.nix
|
||||
- modules/programs/jrnl.nix
|
||||
- modules/programs/ledger.nix
|
||||
- modules/programs/newsboat.nix
|
||||
- modules/programs/obsidian.nix
|
||||
- modules/programs/onlyoffice.nix
|
||||
- modules/programs/pandoc.nix
|
||||
- modules/programs/papis.nix
|
||||
- modules/programs/pubs.nix
|
||||
- modules/programs/sioyek.nix
|
||||
- modules/programs/taskwarrior.nix
|
||||
- modules/programs/todoman.nix
|
||||
- modules/programs/zathura.nix
|
||||
- modules/services/comodoro.nix
|
||||
- modules/services/rsibreak.nix
|
||||
- modules/services/safeeyes.nix
|
||||
- modules/services/taskwarrior-sync.nix
|
||||
- modules/services/tomat.nix
|
||||
"password-manager":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/browserpass.nix
|
||||
- modules/programs/keepassxc.nix
|
||||
- modules/programs/password-store.nix
|
||||
- modules/programs/rbw.nix
|
||||
- modules/programs/rofi-pass.nix
|
||||
- modules/services/pass-secret-service.nix
|
||||
- modules/services/proton-pass-agent.nix
|
||||
- tests/modules/programs/keepassxc/**/*
|
||||
- tests/modules/programs/password-store/**/*
|
||||
- tests/modules/programs/rofi-pass/**/*
|
||||
"photo":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/ahoviewer.nix
|
||||
- modules/programs/feh.nix
|
||||
- modules/programs/gallery-dl.nix
|
||||
- modules/programs/imv.nix
|
||||
- modules/programs/pqiv.nix
|
||||
- modules/programs/swayimg.nix
|
||||
- modules/programs/wallust.nix
|
||||
"shell":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/lib/zsh.nix
|
||||
- modules/programs/bash.nix
|
||||
- modules/programs/fish.nix
|
||||
- modules/programs/intelli-shell.nix
|
||||
- modules/programs/ion.nix
|
||||
- modules/programs/nushell.nix
|
||||
- modules/programs/oh-my-posh.nix
|
||||
- modules/programs/powerline-go.nix
|
||||
- modules/programs/sheldon.nix
|
||||
- modules/programs/starship.nix
|
||||
- modules/programs/zsh/**/*
|
||||
- tests/modules/programs/bash/**/*
|
||||
- tests/modules/programs/fish/**/*
|
||||
- tests/modules/programs/nushell/**/*
|
||||
- tests/modules/programs/zsh/**/*
|
||||
"sync":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/acd-cli.nix
|
||||
- modules/programs/airlift.nix
|
||||
- modules/programs/alistral.nix
|
||||
- modules/programs/onedrive.nix
|
||||
- modules/programs/rtorrent.nix
|
||||
- modules/services/davmail.nix
|
||||
- modules/services/dropbox.nix
|
||||
- modules/services/etesync-dav.nix
|
||||
- modules/services/kdeconnect.nix
|
||||
- modules/services/megasync.nix
|
||||
- modules/services/nextcloud-client.nix
|
||||
- modules/services/owncloud-client.nix
|
||||
- modules/services/pizauth.nix
|
||||
- modules/services/syncthing.nix
|
||||
- modules/services/unison.nix
|
||||
- tests/modules/services/dropbox/**/*
|
||||
- tests/modules/services/syncthing/**/*
|
||||
"system":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/anup.nix
|
||||
- modules/programs/command-not-found/**/*
|
||||
- modules/programs/gpg.nix
|
||||
- modules/programs/home-manager.nix
|
||||
- modules/programs/mullvad-vpn.nix
|
||||
- modules/programs/opkssh.nix
|
||||
- modules/programs/ssh.nix
|
||||
- modules/services/gpg-agent.nix
|
||||
- modules/services/home-manager*.nix
|
||||
- modules/services/kbfs.nix
|
||||
- modules/services/keybase.nix
|
||||
- modules/services/macos-remap-keys/**/*
|
||||
- modules/services/nix-gc.nix
|
||||
- modules/services/ssh-agent.nix
|
||||
- modules/services/ssh-tpm-agent.nix
|
||||
- modules/services/yubikey-agent.nix
|
||||
- tests/modules/services/home-manager*/**/*
|
||||
"system-tools":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/andcli.nix
|
||||
- modules/programs/aria2.nix
|
||||
- modules/programs/aria2p.nix
|
||||
- modules/programs/trippy.nix
|
||||
- modules/services/arrpc.nix
|
||||
- modules/services/cachix-agent.nix
|
||||
- modules/services/fusuma.nix
|
||||
- modules/services/grobi.nix
|
||||
- modules/services/hound.nix
|
||||
- modules/services/jankyborders.nix
|
||||
- modules/services/opensnitch-ui.nix
|
||||
- modules/services/osmscout-server.nix
|
||||
- modules/services/plan9port.nix
|
||||
- modules/services/psd.nix
|
||||
- modules/services/pueue.nix
|
||||
- modules/services/recoll.nix
|
||||
- modules/services/signaturepdf.nix
|
||||
- modules/services/tahoe-lafs.nix
|
||||
- modules/services/tldr-update.nix
|
||||
"terminal":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/alacritty.nix
|
||||
- modules/programs/foot.nix
|
||||
- modules/programs/ghostty.nix
|
||||
- modules/programs/gnome-terminal.nix
|
||||
- modules/programs/kitty.nix
|
||||
- modules/programs/macchina/**/*
|
||||
- modules/programs/ptyxis.nix
|
||||
- modules/programs/rio.nix
|
||||
- modules/programs/terminator.nix
|
||||
- modules/programs/termite.nix
|
||||
- modules/programs/urxvt.nix
|
||||
- modules/programs/waveterm.nix
|
||||
- modules/programs/wezterm.nix
|
||||
- modules/services/shpool.nix
|
||||
- tests/modules/programs/alacritty/**/*
|
||||
- tests/modules/programs/foot/**/*
|
||||
- tests/modules/programs/ghostty/**/*
|
||||
- tests/modules/programs/kitty/**/*
|
||||
"video":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/animdl.nix
|
||||
- modules/programs/anime-downloader.nix
|
||||
- modules/programs/aperture.nix
|
||||
- modules/programs/asciinema.nix
|
||||
- modules/programs/freetube.nix
|
||||
- modules/programs/mpv.nix
|
||||
- modules/programs/mpvpaper.nix
|
||||
- modules/programs/obs-studio.nix
|
||||
- modules/programs/streamlink.nix
|
||||
- modules/programs/twitch-tui.nix
|
||||
- modules/programs/yt-dlp.nix
|
||||
- modules/services/jellyfin-mpv-shim.nix
|
||||
- modules/services/plex-mpv-shim.nix
|
||||
- tests/modules/programs/mpv/**/*
|
||||
"remote-desktop":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/looking-glass-client.nix
|
||||
- modules/services/remmina.nix
|
||||
- modules/services/wayvnc.nix
|
||||
"wayland":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/ashell.nix
|
||||
- modules/programs/anyrun.nix
|
||||
- modules/services/awww.nix
|
||||
- modules/programs/bemenu.nix
|
||||
- modules/programs/fuzzel.nix
|
||||
- modules/programs/hyprlock.nix
|
||||
- modules/programs/kickoff.nix
|
||||
- modules/programs/onagre.nix
|
||||
- modules/programs/sway-easyfocus.nix
|
||||
- modules/programs/swaylock.nix
|
||||
- modules/programs/swayr.nix
|
||||
- modules/programs/tofi.nix
|
||||
- modules/programs/waybar.nix
|
||||
- modules/programs/waylogout.nix
|
||||
- modules/programs/wayprompt.nix
|
||||
- modules/programs/wleave.nix
|
||||
- modules/programs/wlogout.nix
|
||||
- modules/programs/wofi.nix
|
||||
- modules/programs/workstyle.nix
|
||||
- modules/programs/yofi.nix
|
||||
- modules/programs/vicinae/**/*
|
||||
- modules/programs/i3bar-river.nix
|
||||
- modules/services/fnott.nix
|
||||
- modules/services/hypridle.nix
|
||||
- modules/services/hyprlauncher.nix
|
||||
- modules/services/hyprpaper.nix
|
||||
- modules/services/hyprpolkitagent.nix
|
||||
- modules/services/hyprshell.nix
|
||||
- modules/services/hyprsunset.nix
|
||||
- modules/services/kanshi.nix
|
||||
- modules/services/mako.nix
|
||||
- modules/services/shikane.nix
|
||||
- modules/services/swayidle.nix
|
||||
- modules/services/swaync.nix
|
||||
- modules/services/swayosd.nix
|
||||
- modules/services/walker.nix
|
||||
- modules/services/way-displays.nix
|
||||
- modules/services/wlsunset.nix
|
||||
- modules/services/wluma.nix
|
||||
- modules/services/wpaperd.nix
|
||||
- tests/modules/programs/ashell/**/*
|
||||
- tests/modules/programs/i3bar-river/**/*
|
||||
- tests/modules/programs/swaylock/**/*
|
||||
- tests/modules/programs/vicinae/**/*
|
||||
- tests/modules/programs/waybar/**/*
|
||||
"window-managers":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/aerospace.nix
|
||||
- modules/programs/i3bar-river.nix
|
||||
- modules/programs/i3blocks.nix
|
||||
- modules/programs/i3status-rust.nix
|
||||
- modules/programs/i3status.nix
|
||||
- modules/services/window-managers/**/*
|
||||
"x11":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/i3blocks.nix
|
||||
- modules/programs/i3status-rust.nix
|
||||
- modules/programs/i3status.nix
|
||||
- modules/programs/rofi.nix
|
||||
- modules/programs/tint2.nix
|
||||
- modules/programs/xmobar.nix
|
||||
- modules/programs/yambar.nix
|
||||
- modules/services/betterlockscreen.nix
|
||||
- modules/services/dunst.nix
|
||||
- modules/services/dwm-status.nix
|
||||
- modules/services/picom.nix
|
||||
- modules/services/polybar.nix
|
||||
- modules/services/screen-locker.nix
|
||||
- modules/services/stalonetray.nix
|
||||
- modules/services/sxhkd.nix
|
||||
- modules/services/taffybar.nix
|
||||
- modules/services/trayer.nix
|
||||
- modules/services/xcape.nix
|
||||
- modules/services/xembed-sni-proxy.nix
|
||||
- modules/services/xidlehook.nix
|
||||
- modules/services/xscreensaver.nix
|
||||
- modules/services/xsettingsd.nix
|
||||
- modules/services/xsuspender.nix
|
||||
- tests/modules/programs/i3blocks/**/*
|
||||
- tests/modules/programs/i3status-rust/**/*
|
||||
- tests/modules/programs/i3status/**/*
|
||||
- tests/modules/programs/rofi/**/*
|
||||
- tests/modules/services/picom/**/*
|
||||
- tests/modules/services/polybar/**/*
|
||||
@@ -1,45 +0,0 @@
|
||||
# Based on
|
||||
# https://github.com/NixOS/nixpkgs/blob/2566f9dc/.github/workflows/backport.yml
|
||||
name: Backport
|
||||
on:
|
||||
pull_request_target:
|
||||
types:
|
||||
- closed
|
||||
- labeled
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
|
||||
jobs:
|
||||
backport:
|
||||
name: Backport Pull Request
|
||||
if: >
|
||||
vars.CI_APP_ID
|
||||
&& github.event.pull_request.merged == true
|
||||
&& (
|
||||
github.event.action != 'labeled'
|
||||
|| startsWith(github.event.label.name, 'backport')
|
||||
)
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Create GitHub App token
|
||||
uses: actions/create-github-app-token@v3
|
||||
if: vars.CI_APP_ID
|
||||
id: app-token
|
||||
with:
|
||||
app-id: ${{ vars.CI_APP_ID }}
|
||||
private-key: ${{ secrets.CI_APP_PRIVATE_KEY }}
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
token: ${{ steps.app-token.outputs.token || secrets.GITHUB_TOKEN }}
|
||||
ref: ${{ github.event.pull_request.base.sha }}
|
||||
- name: Create backport PRs
|
||||
id: backport
|
||||
uses: korthout/backport-action@v4
|
||||
with:
|
||||
# See https://github.com/korthout/backport-action#inputs
|
||||
github_token: ${{ steps.app-token.outputs.token || secrets.GITHUB_TOKEN }}
|
||||
branch_name: backport/${target_branch}/${pull_number}
|
||||
copy_labels_pattern: .*
|
||||
@@ -1,15 +0,0 @@
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
jobs:
|
||||
triage:
|
||||
runs-on: ubuntu-latest
|
||||
if: github.repository_owner == 'nix-community'
|
||||
steps:
|
||||
- uses: mschilde/auto-label-merge-conflicts@master
|
||||
with:
|
||||
CONFLICT_LABEL_NAME: "merge conflict"
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
MAX_RETRIES: 5
|
||||
WAIT_MS: 10000
|
||||
@@ -1,30 +0,0 @@
|
||||
name: GitHub Pages
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
workflow_dispatch:
|
||||
jobs:
|
||||
publish:
|
||||
if: github.event_name != 'schedule' || github.repository_owner == 'nix-community'
|
||||
strategy:
|
||||
matrix:
|
||||
os: [ubuntu-latest]
|
||||
runs-on: ${{ matrix.os }}
|
||||
steps:
|
||||
- uses: actions/checkout@v7
|
||||
- uses: cachix/install-nix-action@v31
|
||||
with:
|
||||
nix_path: nixpkgs=channel:nixpkgs-unstable
|
||||
- uses: cachix/cachix-action@v17
|
||||
with:
|
||||
name: nix-community
|
||||
authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}'
|
||||
- run: |
|
||||
nix-build -A docs.html
|
||||
cp -r result/share/doc/home-manager public
|
||||
- name: Deploy
|
||||
uses: peaceiris/actions-gh-pages@v4
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
publish_dir: ./public
|
||||
@@ -1,35 +0,0 @@
|
||||
name: "Label PR"
|
||||
|
||||
on:
|
||||
- pull_request_target
|
||||
|
||||
# WARNING:
|
||||
# When extending this action, be aware that $GITHUB_TOKEN allows some write
|
||||
# access to the GitHub API. This means that it should not evaluate user input in
|
||||
# a way that allows code injection.
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: write
|
||||
issues: write
|
||||
|
||||
jobs:
|
||||
labels:
|
||||
runs-on: ubuntu-latest
|
||||
if: github.repository_owner == 'nix-community'
|
||||
steps:
|
||||
- name: Get changed files count
|
||||
id: count
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
PR_NUMBER: ${{ github.event.pull_request.number }}
|
||||
run: |
|
||||
COUNT=$(gh api "repos/${{ github.repository }}/pulls/$PR_NUMBER/files" --paginate --jq '.[].filename' | grep -c '^modules/' || true)
|
||||
echo "Found $COUNT changed module files."
|
||||
echo "count=$COUNT" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- uses: actions/labeler@v6
|
||||
if: steps.count.outputs.count <= 10
|
||||
with:
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
sync-labels: true
|
||||
@@ -1,81 +0,0 @@
|
||||
name: Tag Module Maintainers
|
||||
on:
|
||||
pull_request_target:
|
||||
types: [opened, ready_for_review, reopened, synchronize]
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.head_ref || github.run_id }}
|
||||
cancel-in-progress: true
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: write
|
||||
jobs:
|
||||
tag-maintainers:
|
||||
runs-on: ubuntu-latest
|
||||
if: |
|
||||
github.event.pull_request.draft == false &&
|
||||
github.event.pull_request.state == 'open'
|
||||
steps:
|
||||
- name: Create GitHub App token
|
||||
uses: actions/create-github-app-token@v3
|
||||
if: vars.CI_APP_ID
|
||||
id: app-token
|
||||
with:
|
||||
app-id: ${{ vars.CI_APP_ID }}
|
||||
private-key: ${{ secrets.CI_APP_PRIVATE_KEY }}
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v7
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.base.sha }}
|
||||
- name: Get Nixpkgs revision from flake.lock
|
||||
id: get-nixpkgs
|
||||
run: |
|
||||
echo "rev=$(jq -r '.nodes.nixpkgs.locked.rev' flake.lock)" >> "$GITHUB_OUTPUT"
|
||||
- name: Install Nix
|
||||
uses: cachix/install-nix-action@v31
|
||||
with:
|
||||
nix_path: nixpkgs=https://github.com/NixOS/nixpkgs/archive/${{ steps.get-nixpkgs.outputs.rev }}.tar.gz
|
||||
extra_nix_config: |
|
||||
experimental-features = nix-command flakes
|
||||
- name: Get changed files
|
||||
id: changed-files
|
||||
env:
|
||||
GH_TOKEN: ${{ steps.app-token.outputs.token || secrets.GITHUB_TOKEN }}
|
||||
PR_NUMBER: ${{ github.event.pull_request.number }}
|
||||
run: |
|
||||
CHANGED_FILES=$(gh pr diff "$PR_NUMBER" --name-only | grep '^modules/' | grep -v '^modules/\(po\|.*\/news\)/' || true)
|
||||
echo "Changed files:"
|
||||
echo "$CHANGED_FILES"
|
||||
echo "changed_files<<EOF" >> "$GITHUB_OUTPUT"
|
||||
echo "$CHANGED_FILES" >> "$GITHUB_OUTPUT"
|
||||
echo "EOF" >> "$GITHUB_OUTPUT"
|
||||
- name: Extract Maintainers
|
||||
id: extract-maintainers
|
||||
env:
|
||||
CHANGED_FILES: ${{ steps.changed-files.outputs.changed_files }}
|
||||
PR_AUTHOR: ${{ github.event.pull_request.user.login }}
|
||||
run: |
|
||||
echo "Extracting maintainers from changed files..."
|
||||
MAINTAINERS=$(lib/python/extract-maintainers.py \
|
||||
--changed-files "$CHANGED_FILES" \
|
||||
--pr-author "$PR_AUTHOR")
|
||||
echo "maintainers=$MAINTAINERS" >> "$GITHUB_OUTPUT"
|
||||
echo "Found maintainers: $MAINTAINERS"
|
||||
- name: Manage Reviewers
|
||||
env:
|
||||
GH_TOKEN: ${{ steps.app-token.outputs.token || secrets.GITHUB_TOKEN }}
|
||||
OWNER: ${{ github.repository_owner }}
|
||||
REPO: ${{ github.event.repository.name }}
|
||||
PR_NUMBER: ${{ github.event.pull_request.number }}
|
||||
PR_AUTHOR: ${{ github.event.pull_request.user.login }}
|
||||
MAINTAINERS: ${{ steps.extract-maintainers.outputs.maintainers }}
|
||||
CHANGED_FILES: ${{ steps.changed-files.outputs.changed_files }}
|
||||
BOT_NAME: ${{ steps.app-token.outputs.app-slug || 'github-actions' }}
|
||||
run: |
|
||||
./lib/python/manage-reviewers.py \
|
||||
--owner "$OWNER" \
|
||||
--repo "$REPO" \
|
||||
--pr-number "$PR_NUMBER" \
|
||||
--pr-author "$PR_AUTHOR" \
|
||||
--current-maintainers "$MAINTAINERS" \
|
||||
--changed-files "$CHANGED_FILES" \
|
||||
--bot-user-name "$BOT_NAME"
|
||||
@@ -1,128 +0,0 @@
|
||||
name: Test
|
||||
on:
|
||||
pull_request:
|
||||
schedule:
|
||||
- cron: "30 2 * * *"
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.head_ref || github.run_id }}
|
||||
cancel-in-progress: true
|
||||
permissions: {}
|
||||
jobs:
|
||||
changes:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 5
|
||||
outputs:
|
||||
docs: ${{ steps.changes.outputs.docs }}
|
||||
format: ${{ steps.changes.outputs.format }}
|
||||
hm: ${{ steps.changes.outputs.hm }}
|
||||
parse: ${{ steps.changes.outputs.parse }}
|
||||
tests: ${{ steps.changes.outputs.tests }}
|
||||
steps:
|
||||
- uses: actions/checkout@v7
|
||||
- uses: dorny/paths-filter@v4
|
||||
id: changes
|
||||
with:
|
||||
filters: |
|
||||
tests:
|
||||
- 'flake.lock'
|
||||
- 'flake.nix'
|
||||
- 'modules/**'
|
||||
- 'nix-darwin/**'
|
||||
- 'nixos/**'
|
||||
- 'tests/**'
|
||||
docs:
|
||||
- '**.md'
|
||||
- 'docs/**'
|
||||
- 'flake.lock'
|
||||
- 'flake.nix'
|
||||
- 'modules/**'
|
||||
format:
|
||||
- '**/*.nix'
|
||||
hm:
|
||||
- 'flake.lock'
|
||||
- 'flake.nix'
|
||||
- 'home-manager/**'
|
||||
parse:
|
||||
- '**/*.nix'
|
||||
- 'flake.lock'
|
||||
tests:
|
||||
needs: changes
|
||||
timeout-minutes: 15
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [ubuntu-latest, macos-latest]
|
||||
runs-on: ${{ matrix.os }}
|
||||
steps:
|
||||
- uses: actions/checkout@v7
|
||||
- name: Get Nixpkgs revision from flake.lock
|
||||
id: get-nixpkgs
|
||||
run: |
|
||||
echo "rev=$(jq -r '.nodes.nixpkgs.locked.rev' flake.lock)" >> "$GITHUB_OUTPUT"
|
||||
- uses: cachix/install-nix-action@v31
|
||||
if: github.event_name == 'schedule' || needs.changes.outputs.docs == 'true' || needs.changes.outputs.tests == 'true' || needs.changes.outputs.hm == 'true' || needs.changes.outputs.parse == 'true' || needs.changes.outputs.format == 'true'
|
||||
with:
|
||||
nix_path: nixpkgs=https://github.com/NixOS/nixpkgs/archive/${{ steps.get-nixpkgs.outputs.rev }}.tar.gz
|
||||
extra_nix_config: |
|
||||
sandbox = true
|
||||
- name: Build docs
|
||||
if: github.event_name == 'schedule' || needs.changes.outputs.docs == 'true'
|
||||
run: nix build --show-trace .#docs-jsonModuleMaintainers
|
||||
- name: Parse Nix files with nix and Lix
|
||||
if: >-
|
||||
matrix.os == 'ubuntu-latest' &&
|
||||
(github.event_name == 'schedule' || needs.changes.outputs.parse == 'true')
|
||||
run: nix build --show-trace --keep-going .#ci-parse .#ci-parse-lix
|
||||
- name: Format Check
|
||||
if: >-
|
||||
matrix.os == 'ubuntu-latest' &&
|
||||
(github.event_name == 'schedule' || needs.changes.outputs.format == 'true')
|
||||
run: nix fmt -- --ci
|
||||
- name: Test init --switch with locked inputs
|
||||
if: github.event_name == 'schedule' || needs.changes.outputs.hm == 'true'
|
||||
run: |
|
||||
# Copy lock file to home directory for consistent testing
|
||||
mkdir -p ~/.config/home-manager
|
||||
cp flake.lock ~/.config/home-manager/
|
||||
nix run .#home-manager -- init --switch --override-input home-manager .
|
||||
- name: Uninstall
|
||||
if: github.event_name == 'schedule' || needs.changes.outputs.hm == 'true'
|
||||
run: yes | nix run . -- uninstall
|
||||
- name: Generate Job Summary
|
||||
if: github.event_name == 'pull_request'
|
||||
shell: bash
|
||||
run: |
|
||||
echo "### Test Job Summary" >> "$GITHUB_STEP_SUMMARY"
|
||||
echo "" >> "$GITHUB_STEP_SUMMARY"
|
||||
echo "A summary of tasks triggered by file changes in this PR:" >> "$GITHUB_STEP_SUMMARY"
|
||||
echo "" >> "$GITHUB_STEP_SUMMARY"
|
||||
|
||||
if [[ "${{ needs.changes.outputs.docs }}" == "true" ]]; then
|
||||
echo "- ✅ **Docs Build:** Triggered" >> "$GITHUB_STEP_SUMMARY"
|
||||
else
|
||||
echo "- ☑️ **Docs Build:** Skipped (no relevant files changed)" >> "$GITHUB_STEP_SUMMARY"
|
||||
fi
|
||||
|
||||
if [[ "${{ needs.changes.outputs.format }}" == "true" ]]; then
|
||||
echo "- ✅ **Format Check:** Triggered" >> "$GITHUB_STEP_SUMMARY"
|
||||
else
|
||||
echo "- ☑️ **Format Check:** Skipped (no relevant files changed)" >> "$GITHUB_STEP_SUMMARY"
|
||||
fi
|
||||
|
||||
if [[ "${{ needs.changes.outputs.parse }}" == "true" ]]; then
|
||||
echo "- ✅ **Nix Parse (nix + Lix):** Triggered" >> "$GITHUB_STEP_SUMMARY"
|
||||
else
|
||||
echo "- ☑️ **Nix Parse (nix + Lix):** Skipped (no relevant files changed)" >> "$GITHUB_STEP_SUMMARY"
|
||||
fi
|
||||
|
||||
if [[ "${{ needs.changes.outputs.hm }}" == "true" ]]; then
|
||||
echo "- ✅ **Home Manager Tests:** Triggered" >> "$GITHUB_STEP_SUMMARY"
|
||||
else
|
||||
echo "- ☑️ **Home Manager Tests:** Skipped (no relevant files changed)" >> "$GITHUB_STEP_SUMMARY"
|
||||
fi
|
||||
|
||||
if [[ "${{ needs.changes.outputs.tests }}" == "true" ]]; then
|
||||
echo "- ✅ **General Tests:** Triggered" >> "$GITHUB_STEP_SUMMARY"
|
||||
else
|
||||
echo "- ☑️ **General Tests:** Skipped (no relevant files changed)" >> "$GITHUB_STEP_SUMMARY"
|
||||
fi
|
||||
@@ -1,286 +0,0 @@
|
||||
name: Update maintainers list
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
paths:
|
||||
- lib/maintainers.nix
|
||||
schedule:
|
||||
# Update every Monday at 9 AM UTC
|
||||
- cron: "0 9 * * 1"
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
create_pr:
|
||||
description: "Create PR even if no changes"
|
||||
required: false
|
||||
default: false
|
||||
type: boolean
|
||||
jobs:
|
||||
update-maintainers:
|
||||
runs-on: ubuntu-latest
|
||||
if: github.repository_owner == 'nix-community' || github.event_name == 'workflow_dispatch'
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
issues: write
|
||||
env:
|
||||
pr_branch: update/maintainers-${{ github.ref_name }}
|
||||
steps:
|
||||
- name: Create GitHub App token
|
||||
uses: actions/create-github-app-token@v3
|
||||
if: vars.CI_APP_ID
|
||||
id: app-token
|
||||
with:
|
||||
app-id: ${{ vars.CI_APP_ID }}
|
||||
private-key: ${{ secrets.CI_APP_PRIVATE_KEY }}
|
||||
- name: Get GitHub App user info
|
||||
id: user-info
|
||||
if: vars.CI_APP_ID
|
||||
env:
|
||||
GH_TOKEN: ${{ steps.app-token.outputs.token }}
|
||||
slug: ${{ steps.app-token.outputs.app-slug }}
|
||||
run: |
|
||||
name="$slug[bot]"
|
||||
id=$(gh api "/users/$name" --jq .id)
|
||||
{
|
||||
echo "id=$id"
|
||||
echo "name=$name"
|
||||
echo "email=$id+$name@users.noreply.github.com"
|
||||
} >> "$GITHUB_OUTPUT"
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v7
|
||||
with:
|
||||
token: ${{ steps.app-token.outputs.token || github.token }}
|
||||
- name: Get Nixpkgs revision from flake.lock
|
||||
id: get-nixpkgs
|
||||
run: |
|
||||
echo "rev=$(jq -r '.nodes.nixpkgs.locked.rev' flake.lock)" >> "$GITHUB_OUTPUT"
|
||||
- name: Install Nix
|
||||
uses: cachix/install-nix-action@v31
|
||||
with:
|
||||
nix_path: nixpkgs=https://github.com/NixOS/nixpkgs/archive/${{ steps.get-nixpkgs.outputs.rev }}.tar.gz
|
||||
- name: Setup Git
|
||||
env:
|
||||
name: ${{ steps.user-info.outputs.name || 'github-actions[bot]' }}
|
||||
email: ${{ steps.user-info.outputs.email || '41898282+github-actions[bot]@users.noreply.github.com' }}
|
||||
run: |
|
||||
git config user.name "$name"
|
||||
git config user.email "$email"
|
||||
- name: Save old maintainers
|
||||
id: old-maintainers
|
||||
run: |
|
||||
echo "📄 Saving old maintainers file for comparison..."
|
||||
echo "old_maintainers=$(nix eval --file all-maintainers.nix --apply 'builtins.attrNames' --json 2>/dev/null || echo '[]')" >> "$GITHUB_OUTPUT"
|
||||
- name: Generate updated maintainers list
|
||||
run: |
|
||||
echo "::group::📋 Generating updated generated/all-maintainers.nix..."
|
||||
./lib/python/generate-all-maintainers.py
|
||||
echo "::endgroup::"
|
||||
echo "::group::🎨 Formatting with nixfmt..."
|
||||
nix fmt all-maintainers.nix
|
||||
echo "::endgroup::"
|
||||
- name: Check for changes and compare maintainers
|
||||
id: check-changes
|
||||
env:
|
||||
old_maintainers: ${{ steps.old-maintainers.outputs.old_maintainers }}
|
||||
run: |
|
||||
if git diff --quiet all-maintainers.nix; then
|
||||
echo "No changes to all-maintainers.nix"
|
||||
echo "has_changes=false" >> "$GITHUB_OUTPUT"
|
||||
echo "maintainer_changes=No changes detected" >> "$GITHUB_OUTPUT"
|
||||
else
|
||||
echo "Changes detected in all-maintainers.nix"
|
||||
echo "has_changes=true" >> "$GITHUB_OUTPUT"
|
||||
# Get change statistics
|
||||
added=$(git diff --numstat all-maintainers.nix | cut -f1)
|
||||
removed=$(git diff --numstat all-maintainers.nix | cut -f2)
|
||||
echo "changes_summary=+$added -$removed lines" >> "$GITHUB_OUTPUT"
|
||||
|
||||
# Compare old and new maintainers using nix eval
|
||||
echo "🔍 Comparing maintainers..."
|
||||
|
||||
# Extract maintainer names from new file
|
||||
new_maintainers=$(nix eval --file all-maintainers.nix --apply 'builtins.attrNames' --json)
|
||||
|
||||
# Compare using nix eval
|
||||
comparison=$(nix eval --expr "
|
||||
let
|
||||
old = builtins.fromJSON ''$old_maintainers'';
|
||||
new = builtins.fromJSON ''$new_maintainers'';
|
||||
oldSet = builtins.listToAttrs (map (name: { name = name; value = true; }) old);
|
||||
newSet = builtins.listToAttrs (map (name: { name = name; value = true; }) new);
|
||||
added = builtins.filter (name: !(oldSet ? \${name})) new;
|
||||
removed = builtins.filter (name: !(newSet ? \${name})) old;
|
||||
in {
|
||||
added = added;
|
||||
removed = removed;
|
||||
total_old = builtins.length old;
|
||||
total_new = builtins.length new;
|
||||
}
|
||||
" --json)
|
||||
|
||||
# Format comparison output
|
||||
added_count=$(echo "$comparison" | jq '.added | length')
|
||||
removed_count=$(echo "$comparison" | jq '.removed | length')
|
||||
total_old=$(echo "$comparison" | jq '.total_old')
|
||||
total_new=$(echo "$comparison" | jq '.total_new')
|
||||
|
||||
maintainer_summary="**Added:** $added_count maintainers"
|
||||
maintainer_summary="$maintainer_summary\n**Removed:** $removed_count maintainers"
|
||||
maintainer_summary="$maintainer_summary\n**Total:** $total_old → $total_new maintainers"
|
||||
|
||||
if [ "$added_count" -gt 0 ]; then
|
||||
added_names=$(echo "$comparison" | jq -r '.added | join(", ")')
|
||||
maintainer_summary="$maintainer_summary\n\n**✅ Added:** $added_names"
|
||||
fi
|
||||
|
||||
if [ "$removed_count" -gt 0 ]; then
|
||||
removed_names=$(echo "$comparison" | jq -r '.removed | join(", ")')
|
||||
maintainer_summary="$maintainer_summary\n\n**❌ Removed:** $removed_names"
|
||||
fi
|
||||
|
||||
echo "maintainer_changes<<EOF" >> "$GITHUB_OUTPUT"
|
||||
echo -e "$maintainer_summary" >> "$GITHUB_OUTPUT"
|
||||
echo "EOF" >> "$GITHUB_OUTPUT"
|
||||
fi
|
||||
- name: Validate generated file
|
||||
if: steps.check-changes.outputs.has_changes == 'true'
|
||||
run: |
|
||||
echo "🔍 Validating generated all-maintainers.nix..."
|
||||
if nix-instantiate --eval ./all-maintainers.nix --strict > /dev/null; then
|
||||
echo "✅ Generated file has valid Nix syntax"
|
||||
else
|
||||
echo "❌ Generated file has invalid Nix syntax"
|
||||
exit 1
|
||||
fi
|
||||
- name: Create update branch
|
||||
run: |
|
||||
git branch -D "$pr_branch" || echo "Nothing to delete"
|
||||
git switch -c "$pr_branch"
|
||||
- name: Get info on the current PR
|
||||
id: open_pr_info
|
||||
env:
|
||||
GH_TOKEN: ${{ steps.app-token.outputs.token || github.token }}
|
||||
run: |
|
||||
# Query for info about the already open update PR
|
||||
info=$(
|
||||
gh api graphql -F owner='{owner}' -F repo='{repo}' -F branch="$pr_branch" -f query='
|
||||
query($owner:String!, $repo:String!, $branch:String!) {
|
||||
repository(owner: $owner, name: $repo) {
|
||||
pullRequests(first: 1, states: OPEN, headRefName: $branch) {
|
||||
nodes {
|
||||
number
|
||||
url
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
' | jq --raw-output '
|
||||
.data.repository.pullRequests.nodes[]
|
||||
| to_entries[]
|
||||
| "\(.key)=\(.value)"
|
||||
'
|
||||
)
|
||||
if [[ -n "$info" ]]; then
|
||||
echo "PR info:"
|
||||
echo "$info"
|
||||
echo "$info" >> "$GITHUB_OUTPUT"
|
||||
else
|
||||
echo "No PR is currently open"
|
||||
fi
|
||||
- name: Fetch current PR's branch
|
||||
if: steps.open_pr_info.outputs.number
|
||||
run: |
|
||||
git fetch origin "$pr_branch"
|
||||
git branch --set-upstream-to "origin/$pr_branch"
|
||||
- name: Create Pull Request
|
||||
id: create-pr
|
||||
if: steps.check-changes.outputs.has_changes == 'true' || github.event.inputs.create_pr == 'true'
|
||||
env:
|
||||
GH_TOKEN: ${{ steps.app-token.outputs.token || github.token }}
|
||||
title: "maintainers: update all-maintainers.nix"
|
||||
commit_body: |
|
||||
Automated update of the master maintainers list combining:
|
||||
- Home Manager specific maintainers from modules/lib/maintainers.nix
|
||||
- Nixpkgs maintainers referenced in Home Manager modules
|
||||
|
||||
${{ steps.check-changes.outputs.maintainer_changes }}
|
||||
|
||||
Generated by: lib/python/generate-all-maintainers.py
|
||||
pr_url: ${{ steps.open_pr_info.outputs.url }}
|
||||
pr_num: ${{ steps.open_pr_info.outputs.number }}
|
||||
pr_body: |
|
||||
## 📋 Summary
|
||||
|
||||
This PR updates the master maintainers list (`all-maintainers.nix`) which combines:
|
||||
- **Home Manager specific maintainers** from `modules/lib/maintainers.nix`
|
||||
- **Nixpkgs maintainers** referenced in Home Manager modules
|
||||
|
||||
## 🔄 Changes
|
||||
|
||||
**Statistics:** ${{ steps.check-changes.outputs.changes_summary || 'No content changes (format/comment updates only)' }}
|
||||
|
||||
${{ steps.check-changes.outputs.maintainer_changes }}
|
||||
|
||||
The updated list includes all maintainers needed for review assignments across the Home Manager project.
|
||||
|
||||
## 🤖 Automation
|
||||
|
||||
- **Generated by:** `lib/python/generate-all-maintainers.py`
|
||||
- **Trigger:** ${{ github.event_name == 'schedule' && 'Scheduled weekly update' || 'Manual workflow dispatch' }}
|
||||
- **Validation:** File syntax verified with `nix eval`
|
||||
|
||||
---
|
||||
🤖 *This PR was automatically created by the [update-maintainers workflow](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})*
|
||||
run: |
|
||||
# Commit the changes
|
||||
git add all-maintainers.nix
|
||||
git commit -m "$title" -m "$commit_body"
|
||||
|
||||
echo "Pushing to remote branch $pr_branch"
|
||||
git push --force --set-upstream origin "$pr_branch"
|
||||
|
||||
if [ -z "$pr_num" ]; then
|
||||
echo "Creating new pull request."
|
||||
PR_URL=$(
|
||||
gh pr create \
|
||||
--title "$title" \
|
||||
--body "$pr_body"
|
||||
)
|
||||
else
|
||||
PR_URL=$pr_url
|
||||
echo "Pull request already exists: $PR_URL"
|
||||
gh pr edit "$pr_num" --body "$pr_body"
|
||||
fi
|
||||
|
||||
echo "pr_url=$PR_URL" >> "$GITHUB_OUTPUT"
|
||||
- name: Summary
|
||||
env:
|
||||
has_changes: ${{ steps.check-changes.outputs.has_changes }}
|
||||
changes: ${{ steps.check-changes.outputs.changes_summary }}
|
||||
pr_url: ${{ steps.create-pr.outputs.pr_url}}
|
||||
pr_num: ${{ steps.open_pr_info.outputs.number }}
|
||||
run: |
|
||||
if [[ "$has_changes" == "true" ]]; then
|
||||
if [[ -n "$pr_num" ]]; then
|
||||
echo "✅ Successfully updated PR with new changes."
|
||||
echo "$changes"
|
||||
echo "🔗 PR URL: $pr_url"
|
||||
echo "### ✅ PR Updated" >> "$GITHUB_STEP_SUMMARY"
|
||||
echo "[$pr_url]($pr_url)" >> "$GITHUB_STEP_SUMMARY"
|
||||
elif [[ -n "$pr_url" ]]; then
|
||||
echo "✅ Successfully created PR with maintainer updates."
|
||||
echo "$changes"
|
||||
echo "🔗 PR URL: $pr_url"
|
||||
echo "### ✅ PR Created" >> "$GITHUB_STEP_SUMMARY"
|
||||
echo "[$pr_url]($pr_url)" >> "$GITHUB_STEP_SUMMARY"
|
||||
else
|
||||
echo "❌ Failed to create or update pull request."
|
||||
echo "### ❌ PR Operation Failed" >> "$GITHUB_STEP_SUMMARY"
|
||||
echo "A pull request was intended but the URL was not captured. Please check the logs." >> "$GITHUB_STEP_SUMMARY"
|
||||
fi
|
||||
else
|
||||
echo "ℹ️ No changes detected - maintainers list is up to date."
|
||||
echo "### ℹ️ No Changes" >> "$GITHUB_STEP_SUMMARY"
|
||||
echo "The maintainers list is up-to-date. No PR was created." >> "$GITHUB_STEP_SUMMARY"
|
||||
fi
|
||||
@@ -1,52 +0,0 @@
|
||||
name: Validate maintainers.nix
|
||||
on:
|
||||
pull_request:
|
||||
paths:
|
||||
- "modules/lib/maintainers.nix"
|
||||
- "flake.lock"
|
||||
- "all-maintainers.nix"
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
run_tests:
|
||||
description: 'Run validation tests'
|
||||
required: false
|
||||
default: true
|
||||
type: boolean
|
||||
jobs:
|
||||
validate-maintainers:
|
||||
runs-on: ubuntu-latest
|
||||
if: github.repository_owner == 'nix-community'
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v7
|
||||
- name: Get Nixpkgs revision from flake.lock
|
||||
id: get-nixpkgs
|
||||
run: |
|
||||
echo "rev=$(jq -r '.nodes.nixpkgs.locked.rev' flake.lock)" >> "$GITHUB_OUTPUT"
|
||||
- name: Install Nix
|
||||
uses: cachix/install-nix-action@v31
|
||||
with:
|
||||
nix_path: nixpkgs=https://github.com/NixOS/nixpkgs/archive/${{ steps.get-nixpkgs.outputs.rev }}.tar.gz
|
||||
- name: Validate Nix syntax
|
||||
run: ./lib/python/validate-maintainers-syntax.py
|
||||
- name: Validate maintainer entries
|
||||
run: ./lib/python/validate-maintainer-entries.py
|
||||
- name: Check for duplicate maintainers
|
||||
run: ./lib/python/check-duplicate-maintainers.py
|
||||
- name: Test generation
|
||||
if: inputs.run_tests == true
|
||||
run: |
|
||||
echo "🔍 Testing all-maintainers.nix generation..."
|
||||
./lib/python/generate-all-maintainers.py
|
||||
|
||||
echo "🔍 Validating generated file..."
|
||||
if nix eval --file ./all-maintainers.nix --json > /dev/null; then
|
||||
echo "✅ Generated file has valid Nix syntax"
|
||||
else
|
||||
echo "❌ Generated file has invalid Nix syntax"
|
||||
exit 1
|
||||
fi
|
||||
- name: Summary
|
||||
run: |
|
||||
echo "✅ All validation checks passed!"
|
||||
echo "📋 The maintainers.nix file is ready for merge"
|
||||
@@ -1,3 +0,0 @@
|
||||
/result*
|
||||
/tests/flake.lock
|
||||
.DS_Store
|
||||
@@ -1,20 +0,0 @@
|
||||
image: nixos/nix:latest
|
||||
|
||||
variables:
|
||||
NIX_PATH: "nixpkgs=channel:nixos-unstable"
|
||||
|
||||
stages:
|
||||
- deploy
|
||||
|
||||
pages:
|
||||
stage: deploy
|
||||
script:
|
||||
- nix-build -A docs.html
|
||||
- mkdir public
|
||||
- cp -r ./result/share/doc/home-manager/* public/
|
||||
artifacts:
|
||||
paths:
|
||||
- public
|
||||
rules:
|
||||
- if: $CI_COMMIT_BRANCH == "master"
|
||||
when: always
|
||||
@@ -1 +0,0 @@
|
||||
Noah Biewesch <dev@noahbiewesch.com> <90870942+trueNAHO@users.noreply.github.com>
|
||||
+246
@@ -0,0 +1,246 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html lang="en" class="light sidebar-visible" dir="ltr">
|
||||
<head>
|
||||
<!-- Book generated using mdBook -->
|
||||
<meta charset="UTF-8">
|
||||
<title>Third-Party Tools and Extensions - Home Manager Manual</title>
|
||||
|
||||
|
||||
<!-- Custom HTML head -->
|
||||
|
||||
<meta name="description" content="">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
<link rel="icon" href="favicon-de23e50b.svg">
|
||||
<link rel="shortcut icon" href="favicon-8114d1fc.png">
|
||||
<link rel="stylesheet" href="css/variables-8adf115d.css">
|
||||
<link rel="stylesheet" href="css/general-e96d0476.css">
|
||||
<link rel="stylesheet" href="css/chrome-d279d366.css">
|
||||
<link rel="stylesheet" href="css/print-9e4910d8.css" media="print">
|
||||
|
||||
<!-- Fonts -->
|
||||
<link rel="stylesheet" href="fonts/fonts-9644e21d.css">
|
||||
|
||||
<!-- Highlight.js Stylesheets -->
|
||||
<link rel="stylesheet" id="mdbook-highlight-css" href="highlight-493f70e1.css">
|
||||
<link rel="stylesheet" id="mdbook-tomorrow-night-css" href="tomorrow-night-4c0ae647.css">
|
||||
<link rel="stylesheet" id="mdbook-ayu-highlight-css" href="ayu-highlight-3fdfc3ac.css">
|
||||
|
||||
<!-- Custom theme stylesheets -->
|
||||
|
||||
|
||||
<!-- Provide site root and default themes to javascript -->
|
||||
<script>
|
||||
const path_to_root = "";
|
||||
const default_light_theme = "light";
|
||||
const default_dark_theme = "navy";
|
||||
window.path_to_searchindex_js = "searchindex-542a1820.js";
|
||||
</script>
|
||||
<!-- Start loading toc.js asap -->
|
||||
<script src="toc-a22c24be.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="mdbook-help-container">
|
||||
<div id="mdbook-help-popup">
|
||||
<h2 class="mdbook-help-title">Keyboard shortcuts</h2>
|
||||
<div>
|
||||
<p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
|
||||
<p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
|
||||
<p>Press <kbd>?</kbd> to show this help</p>
|
||||
<p>Press <kbd>Esc</kbd> to hide this help</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="mdbook-body-container">
|
||||
<!-- Work around some values being stored in localStorage wrapped in quotes -->
|
||||
<script>
|
||||
try {
|
||||
let theme = localStorage.getItem('mdbook-theme');
|
||||
let sidebar = localStorage.getItem('mdbook-sidebar');
|
||||
|
||||
if (theme.startsWith('"') && theme.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
|
||||
}
|
||||
|
||||
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
|
||||
}
|
||||
} catch (e) { }
|
||||
</script>
|
||||
|
||||
<!-- Set the theme before any content is loaded, prevents flash -->
|
||||
<script>
|
||||
const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
|
||||
let theme;
|
||||
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
|
||||
if (theme === null || theme === undefined) { theme = default_theme; }
|
||||
const html = document.documentElement;
|
||||
html.classList.remove('light')
|
||||
html.classList.add(theme);
|
||||
html.classList.add("js");
|
||||
</script>
|
||||
|
||||
<input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
|
||||
|
||||
<!-- Hide / unhide sidebar before it is displayed -->
|
||||
<script>
|
||||
let sidebar = null;
|
||||
const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
|
||||
if (document.body.clientWidth >= 1080) {
|
||||
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
|
||||
sidebar = sidebar || 'visible';
|
||||
} else {
|
||||
sidebar = 'hidden';
|
||||
sidebar_toggle.checked = false;
|
||||
}
|
||||
if (sidebar === 'visible') {
|
||||
sidebar_toggle.checked = true;
|
||||
} else {
|
||||
html.classList.remove('sidebar-visible');
|
||||
}
|
||||
</script>
|
||||
|
||||
<nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
|
||||
<!-- populated by js -->
|
||||
<mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
|
||||
<noscript>
|
||||
<iframe class="sidebar-iframe-outer" src="toc.html"></iframe>
|
||||
</noscript>
|
||||
<div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
|
||||
<div class="sidebar-resize-indicator"></div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div id="mdbook-page-wrapper" class="page-wrapper">
|
||||
|
||||
<div class="page">
|
||||
<div id="mdbook-menu-bar-hover-placeholder"></div>
|
||||
<div id="mdbook-menu-bar" class="menu-bar sticky">
|
||||
<div class="left-buttons">
|
||||
<label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
|
||||
</label>
|
||||
<button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
|
||||
</button>
|
||||
<ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
|
||||
</ul>
|
||||
<button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<h1 class="menu-title">Home Manager Manual</h1>
|
||||
|
||||
<div class="right-buttons">
|
||||
<a href="print.html" title="Print this book" aria-label="Print this book">
|
||||
<span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
|
||||
</a>
|
||||
<a href="https://github.com/nix-community/home-manager" title="Git repository" aria-label="Git repository">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="mdbook-search-wrapper" class="hidden">
|
||||
<form id="mdbook-searchbar-outer" class="searchbar-outer">
|
||||
<div class="search-wrapper">
|
||||
<input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
|
||||
<div class="spinner-wrapper">
|
||||
<span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
|
||||
<div id="mdbook-searchresults-header" class="searchresults-header"></div>
|
||||
<ul id="mdbook-searchresults">
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
|
||||
<script>
|
||||
document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
|
||||
document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
|
||||
Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
|
||||
link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
|
||||
});
|
||||
</script>
|
||||
|
||||
<div id="mdbook-content" class="content">
|
||||
<main>
|
||||
<p><a id="ch-3rd-party"></a></p>
|
||||
<h1 id="third-party-tools-and-extensions"><a class="header" href="#third-party-tools-and-extensions">Third-Party Tools and Extensions</a></h1>
|
||||
<p>Here is a collection of tools and extensions that relate to Home
|
||||
Manager. Note, these are maintained outside the regular Home Manager
|
||||
flow so quality and support may vary wildly. If you encounter problems
|
||||
then please raise them in the corresponding project, not as issues in
|
||||
the Home Manager tracker.</p>
|
||||
<p>If you have made something interesting related to Home Manager then you
|
||||
are encouraged to create a PR that expands this chapter.</p>
|
||||
|
||||
</main>
|
||||
|
||||
<nav class="nav-wrapper" aria-label="Page navigation">
|
||||
<!-- Mobile navigation buttons -->
|
||||
<a rel="prev" href="internals/activation.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
|
||||
</a>
|
||||
|
||||
<a rel="next prefetch" href="3rd-party/collections.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
|
||||
</a>
|
||||
|
||||
<div style="clear: both"></div>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<nav class="nav-wide-wrapper" aria-label="Page navigation">
|
||||
<a rel="prev" href="internals/activation.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
|
||||
</a>
|
||||
|
||||
<a rel="next prefetch" href="3rd-party/collections.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
|
||||
</a>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
|
||||
<template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
|
||||
<template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
|
||||
<template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
|
||||
<template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
|
||||
<template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
window.playground_copyable = true;
|
||||
</script>
|
||||
|
||||
|
||||
<script src="elasticlunr-ef4e11c1.min.js"></script>
|
||||
<script src="mark-09e88c2c.min.js"></script>
|
||||
<script src="searcher-09f2665d.js"></script>
|
||||
|
||||
<script src="clipboard-1626706a.min.js"></script>
|
||||
<script src="highlight-abc7f01d.js"></script>
|
||||
<script src="book-609e4cb8.js"></script>
|
||||
|
||||
<!-- Custom JS scripts -->
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
Vendored
+251
@@ -0,0 +1,251 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html lang="en" class="light sidebar-visible" dir="ltr">
|
||||
<head>
|
||||
<!-- Book generated using mdBook -->
|
||||
<meta charset="UTF-8">
|
||||
<title>Module Collections - Home Manager Manual</title>
|
||||
|
||||
|
||||
<!-- Custom HTML head -->
|
||||
|
||||
<meta name="description" content="">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
<link rel="icon" href="../favicon-de23e50b.svg">
|
||||
<link rel="shortcut icon" href="../favicon-8114d1fc.png">
|
||||
<link rel="stylesheet" href="../css/variables-8adf115d.css">
|
||||
<link rel="stylesheet" href="../css/general-e96d0476.css">
|
||||
<link rel="stylesheet" href="../css/chrome-d279d366.css">
|
||||
<link rel="stylesheet" href="../css/print-9e4910d8.css" media="print">
|
||||
|
||||
<!-- Fonts -->
|
||||
<link rel="stylesheet" href="../fonts/fonts-9644e21d.css">
|
||||
|
||||
<!-- Highlight.js Stylesheets -->
|
||||
<link rel="stylesheet" id="mdbook-highlight-css" href="../highlight-493f70e1.css">
|
||||
<link rel="stylesheet" id="mdbook-tomorrow-night-css" href="../tomorrow-night-4c0ae647.css">
|
||||
<link rel="stylesheet" id="mdbook-ayu-highlight-css" href="../ayu-highlight-3fdfc3ac.css">
|
||||
|
||||
<!-- Custom theme stylesheets -->
|
||||
|
||||
|
||||
<!-- Provide site root and default themes to javascript -->
|
||||
<script>
|
||||
const path_to_root = "../";
|
||||
const default_light_theme = "light";
|
||||
const default_dark_theme = "navy";
|
||||
window.path_to_searchindex_js = "../searchindex-542a1820.js";
|
||||
</script>
|
||||
<!-- Start loading toc.js asap -->
|
||||
<script src="../toc-a22c24be.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="mdbook-help-container">
|
||||
<div id="mdbook-help-popup">
|
||||
<h2 class="mdbook-help-title">Keyboard shortcuts</h2>
|
||||
<div>
|
||||
<p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
|
||||
<p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
|
||||
<p>Press <kbd>?</kbd> to show this help</p>
|
||||
<p>Press <kbd>Esc</kbd> to hide this help</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="mdbook-body-container">
|
||||
<!-- Work around some values being stored in localStorage wrapped in quotes -->
|
||||
<script>
|
||||
try {
|
||||
let theme = localStorage.getItem('mdbook-theme');
|
||||
let sidebar = localStorage.getItem('mdbook-sidebar');
|
||||
|
||||
if (theme.startsWith('"') && theme.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
|
||||
}
|
||||
|
||||
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
|
||||
}
|
||||
} catch (e) { }
|
||||
</script>
|
||||
|
||||
<!-- Set the theme before any content is loaded, prevents flash -->
|
||||
<script>
|
||||
const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
|
||||
let theme;
|
||||
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
|
||||
if (theme === null || theme === undefined) { theme = default_theme; }
|
||||
const html = document.documentElement;
|
||||
html.classList.remove('light')
|
||||
html.classList.add(theme);
|
||||
html.classList.add("js");
|
||||
</script>
|
||||
|
||||
<input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
|
||||
|
||||
<!-- Hide / unhide sidebar before it is displayed -->
|
||||
<script>
|
||||
let sidebar = null;
|
||||
const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
|
||||
if (document.body.clientWidth >= 1080) {
|
||||
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
|
||||
sidebar = sidebar || 'visible';
|
||||
} else {
|
||||
sidebar = 'hidden';
|
||||
sidebar_toggle.checked = false;
|
||||
}
|
||||
if (sidebar === 'visible') {
|
||||
sidebar_toggle.checked = true;
|
||||
} else {
|
||||
html.classList.remove('sidebar-visible');
|
||||
}
|
||||
</script>
|
||||
|
||||
<nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
|
||||
<!-- populated by js -->
|
||||
<mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
|
||||
<noscript>
|
||||
<iframe class="sidebar-iframe-outer" src="../toc.html"></iframe>
|
||||
</noscript>
|
||||
<div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
|
||||
<div class="sidebar-resize-indicator"></div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div id="mdbook-page-wrapper" class="page-wrapper">
|
||||
|
||||
<div class="page">
|
||||
<div id="mdbook-menu-bar-hover-placeholder"></div>
|
||||
<div id="mdbook-menu-bar" class="menu-bar sticky">
|
||||
<div class="left-buttons">
|
||||
<label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
|
||||
</label>
|
||||
<button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
|
||||
</button>
|
||||
<ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
|
||||
</ul>
|
||||
<button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<h1 class="menu-title">Home Manager Manual</h1>
|
||||
|
||||
<div class="right-buttons">
|
||||
<a href="../print.html" title="Print this book" aria-label="Print this book">
|
||||
<span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
|
||||
</a>
|
||||
<a href="https://github.com/nix-community/home-manager" title="Git repository" aria-label="Git repository">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="mdbook-search-wrapper" class="hidden">
|
||||
<form id="mdbook-searchbar-outer" class="searchbar-outer">
|
||||
<div class="search-wrapper">
|
||||
<input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
|
||||
<div class="spinner-wrapper">
|
||||
<span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
|
||||
<div id="mdbook-searchresults-header" class="searchresults-header"></div>
|
||||
<ul id="mdbook-searchresults">
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
|
||||
<script>
|
||||
document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
|
||||
document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
|
||||
Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
|
||||
link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
|
||||
});
|
||||
</script>
|
||||
|
||||
<div id="mdbook-content" class="content">
|
||||
<main>
|
||||
<p><a id="sec-3rd-party-module-collections"></a></p>
|
||||
<h1 id="module-collections"><a class="header" href="#module-collections">Module Collections</a></h1>
|
||||
<ul>
|
||||
<li>
|
||||
<p><a href="https://github.com/schuelermine/xhmm">xhmm — extra Home Manager
|
||||
modules</a></p>
|
||||
<p>A collection of modules maintained by Anselm Schüler.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><a href="https://github.com/danth/stylix/">Stylix — System-wide colorscheming and
|
||||
typography</a></p>
|
||||
<p>Configure your applications to get coherent color scheme and font.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
</main>
|
||||
|
||||
<nav class="nav-wrapper" aria-label="Page navigation">
|
||||
<!-- Mobile navigation buttons -->
|
||||
<a rel="prev" href="../3rd-party.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
|
||||
</a>
|
||||
|
||||
<a rel="next prefetch" href="../faq.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
|
||||
</a>
|
||||
|
||||
<div style="clear: both"></div>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<nav class="nav-wide-wrapper" aria-label="Page navigation">
|
||||
<a rel="prev" href="../3rd-party.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
|
||||
</a>
|
||||
|
||||
<a rel="next prefetch" href="../faq.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
|
||||
</a>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
|
||||
<template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
|
||||
<template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
|
||||
<template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
|
||||
<template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
|
||||
<template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
window.playground_copyable = true;
|
||||
</script>
|
||||
|
||||
|
||||
<script src="../elasticlunr-ef4e11c1.min.js"></script>
|
||||
<script src="../mark-09e88c2c.min.js"></script>
|
||||
<script src="../searcher-09f2665d.js"></script>
|
||||
|
||||
<script src="../clipboard-1626706a.min.js"></script>
|
||||
<script src="../highlight-abc7f01d.js"></script>
|
||||
<script src="../book-609e4cb8.js"></script>
|
||||
|
||||
<!-- Custom JS scripts -->
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,228 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html lang="en" class="light sidebar-visible" dir="ltr">
|
||||
<head>
|
||||
<!-- Book generated using mdBook -->
|
||||
<meta charset="UTF-8">
|
||||
<title>Page not found - Home Manager Manual</title>
|
||||
<base href="/">
|
||||
|
||||
|
||||
<!-- Custom HTML head -->
|
||||
|
||||
<meta name="description" content="">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
<link rel="icon" href="favicon-de23e50b.svg">
|
||||
<link rel="shortcut icon" href="favicon-8114d1fc.png">
|
||||
<link rel="stylesheet" href="css/variables-8adf115d.css">
|
||||
<link rel="stylesheet" href="css/general-e96d0476.css">
|
||||
<link rel="stylesheet" href="css/chrome-d279d366.css">
|
||||
<link rel="stylesheet" href="css/print-9e4910d8.css" media="print">
|
||||
|
||||
<!-- Fonts -->
|
||||
<link rel="stylesheet" href="fonts/fonts-9644e21d.css">
|
||||
|
||||
<!-- Highlight.js Stylesheets -->
|
||||
<link rel="stylesheet" id="mdbook-highlight-css" href="highlight-493f70e1.css">
|
||||
<link rel="stylesheet" id="mdbook-tomorrow-night-css" href="tomorrow-night-4c0ae647.css">
|
||||
<link rel="stylesheet" id="mdbook-ayu-highlight-css" href="ayu-highlight-3fdfc3ac.css">
|
||||
|
||||
<!-- Custom theme stylesheets -->
|
||||
|
||||
|
||||
<!-- Provide site root and default themes to javascript -->
|
||||
<script>
|
||||
const path_to_root = "";
|
||||
const default_light_theme = "light";
|
||||
const default_dark_theme = "navy";
|
||||
window.path_to_searchindex_js = "searchindex-542a1820.js";
|
||||
</script>
|
||||
<!-- Start loading toc.js asap -->
|
||||
<script src="toc-a22c24be.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="mdbook-help-container">
|
||||
<div id="mdbook-help-popup">
|
||||
<h2 class="mdbook-help-title">Keyboard shortcuts</h2>
|
||||
<div>
|
||||
<p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
|
||||
<p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
|
||||
<p>Press <kbd>?</kbd> to show this help</p>
|
||||
<p>Press <kbd>Esc</kbd> to hide this help</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="mdbook-body-container">
|
||||
<!-- Work around some values being stored in localStorage wrapped in quotes -->
|
||||
<script>
|
||||
try {
|
||||
let theme = localStorage.getItem('mdbook-theme');
|
||||
let sidebar = localStorage.getItem('mdbook-sidebar');
|
||||
|
||||
if (theme.startsWith('"') && theme.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
|
||||
}
|
||||
|
||||
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
|
||||
}
|
||||
} catch (e) { }
|
||||
</script>
|
||||
|
||||
<!-- Set the theme before any content is loaded, prevents flash -->
|
||||
<script>
|
||||
const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
|
||||
let theme;
|
||||
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
|
||||
if (theme === null || theme === undefined) { theme = default_theme; }
|
||||
const html = document.documentElement;
|
||||
html.classList.remove('light')
|
||||
html.classList.add(theme);
|
||||
html.classList.add("js");
|
||||
</script>
|
||||
|
||||
<input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
|
||||
|
||||
<!-- Hide / unhide sidebar before it is displayed -->
|
||||
<script>
|
||||
let sidebar = null;
|
||||
const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
|
||||
if (document.body.clientWidth >= 1080) {
|
||||
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
|
||||
sidebar = sidebar || 'visible';
|
||||
} else {
|
||||
sidebar = 'hidden';
|
||||
sidebar_toggle.checked = false;
|
||||
}
|
||||
if (sidebar === 'visible') {
|
||||
sidebar_toggle.checked = true;
|
||||
} else {
|
||||
html.classList.remove('sidebar-visible');
|
||||
}
|
||||
</script>
|
||||
|
||||
<nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
|
||||
<!-- populated by js -->
|
||||
<mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
|
||||
<noscript>
|
||||
<iframe class="sidebar-iframe-outer" src="toc.html"></iframe>
|
||||
</noscript>
|
||||
<div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
|
||||
<div class="sidebar-resize-indicator"></div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div id="mdbook-page-wrapper" class="page-wrapper">
|
||||
|
||||
<div class="page">
|
||||
<div id="mdbook-menu-bar-hover-placeholder"></div>
|
||||
<div id="mdbook-menu-bar" class="menu-bar sticky">
|
||||
<div class="left-buttons">
|
||||
<label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
|
||||
</label>
|
||||
<button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
|
||||
</button>
|
||||
<ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
|
||||
</ul>
|
||||
<button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<h1 class="menu-title">Home Manager Manual</h1>
|
||||
|
||||
<div class="right-buttons">
|
||||
<a href="print.html" title="Print this book" aria-label="Print this book">
|
||||
<span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
|
||||
</a>
|
||||
<a href="https://github.com/nix-community/home-manager" title="Git repository" aria-label="Git repository">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="mdbook-search-wrapper" class="hidden">
|
||||
<form id="mdbook-searchbar-outer" class="searchbar-outer">
|
||||
<div class="search-wrapper">
|
||||
<input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
|
||||
<div class="spinner-wrapper">
|
||||
<span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
|
||||
<div id="mdbook-searchresults-header" class="searchresults-header"></div>
|
||||
<ul id="mdbook-searchresults">
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
|
||||
<script>
|
||||
document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
|
||||
document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
|
||||
Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
|
||||
link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
|
||||
});
|
||||
</script>
|
||||
|
||||
<div id="mdbook-content" class="content">
|
||||
<main>
|
||||
<h1 id="document-not-found-404"><a class="header" href="#document-not-found-404">Document not found (404)</a></h1>
|
||||
<p>This URL is invalid, sorry. Please use the navigation bar or search to continue.</p>
|
||||
|
||||
</main>
|
||||
|
||||
<nav class="nav-wrapper" aria-label="Page navigation">
|
||||
<!-- Mobile navigation buttons -->
|
||||
|
||||
|
||||
<div style="clear: both"></div>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<nav class="nav-wide-wrapper" aria-label="Page navigation">
|
||||
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
|
||||
<template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
|
||||
<template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
|
||||
<template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
|
||||
<template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
|
||||
<template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
window.playground_copyable = true;
|
||||
</script>
|
||||
|
||||
|
||||
<script src="elasticlunr-ef4e11c1.min.js"></script>
|
||||
<script src="mark-09e88c2c.min.js"></script>
|
||||
<script src="searcher-09f2665d.js"></script>
|
||||
|
||||
<script src="clipboard-1626706a.min.js"></script>
|
||||
<script src="highlight-abc7f01d.js"></script>
|
||||
<script src="book-609e4cb8.js"></script>
|
||||
|
||||
<!-- Custom JS scripts -->
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,8 +0,0 @@
|
||||
# Contributing
|
||||
|
||||
Home Manager contribution guidelines live in the manual:
|
||||
|
||||
- [`docs/manual/contributing.md`](docs/manual/contributing.md)
|
||||
- <https://nix-community.github.io/home-manager/#ch-contributing>
|
||||
|
||||
Read those docs before changing modules, tests, news entries, or release notes.
|
||||
@@ -1,28 +0,0 @@
|
||||
# Common commands
|
||||
#
|
||||
# Contributing manual:
|
||||
# - https://nix-community.github.io/home-manager/#ch-contributing
|
||||
|
||||
# List tests matching a pattern `pattern`
|
||||
list *pattern:
|
||||
nix run .#tests -- -l {{pattern}}
|
||||
|
||||
# Run all tests matching a pattern `pattern`
|
||||
test *pattern:
|
||||
nix run .#tests -- {{pattern}}
|
||||
|
||||
# List integration tests
|
||||
list_integration_tests:
|
||||
nix run .#tests -- -t -l
|
||||
|
||||
# Run integration tests
|
||||
integration_tests:
|
||||
nix run .#tests -- -t integration-test-
|
||||
|
||||
# Create a news entry
|
||||
create-news-entry:
|
||||
modules/misc/news/create-news-entry.sh
|
||||
|
||||
# format codebase with treefmt
|
||||
format:
|
||||
treefmt
|
||||
@@ -1,21 +0,0 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2017-2026 Home Manager contributors
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
-255
@@ -1,255 +0,0 @@
|
||||
# Maintaining Home Manager
|
||||
|
||||
This file is intended as a reference for Home Manager's core maintainers,
|
||||
although it may be interesting for anyone curious how we do certain things.
|
||||
|
||||
## Releasing
|
||||
|
||||
Home Manager releases stable versions in sync with NixOS/nixpkgs. A _`YY.05`_
|
||||
version is released in May and a _`YY.11`_ version is released in November.
|
||||
|
||||
We do not need to wait for the release to come out of _"beta"_ before creating a
|
||||
branch, however we _should_ wait before updating links and references on the
|
||||
`master` branch.
|
||||
|
||||
Creating a stable branch may require temporarily disabling branch protection.
|
||||
This can only be done by an "admin" or "owner".
|
||||
|
||||
Once a stable branch is created, its flake inputs should be updated to point to
|
||||
the corresponding stable versions. The branch can be created before these exist,
|
||||
in which case they should be updated when the corresponding stable inputs become
|
||||
available.
|
||||
|
||||
Once a stable version is considered "out of beta", references to Home Manager's
|
||||
stable branch should be updated on the `master` branch to reference the new
|
||||
version.
|
||||
|
||||
### Release Workflow
|
||||
|
||||
The release process involves four phases in a specific order:
|
||||
|
||||
1. **On master - Mark current as stable**: Update all documentation and examples
|
||||
to reflect the current release (e.g., 25.11) as stable, removing "(unstable)"
|
||||
tags
|
||||
2. **Cut the release branch**: Create the new release branch from master (e.g.,
|
||||
`release-25.11`)
|
||||
3. **On release branch - Mark as release branch**: Set `isReleaseBranch: true`
|
||||
in `release.json`
|
||||
4. **On master - Prepare for next**: Bump version to next release (e.g., 26.05)
|
||||
and add "(unstable)" tag back
|
||||
|
||||
**Important**: The `isReleaseBranch` field in `release.json` is managed
|
||||
differently on each branch:
|
||||
|
||||
- On **master**: Always remains `false`
|
||||
- On **release branches**: Set to `true` in a separate commit after cutting the
|
||||
branch from master
|
||||
|
||||
This workflow ensures that the release branch captures a stable snapshot of
|
||||
master, which then moves forward to the next development cycle.
|
||||
|
||||
### Release Preparation Checklist
|
||||
|
||||
#### Step 1: On master - Mark Current as Stable
|
||||
|
||||
**When**: When ready to cut a new release branch (e.g., when preparing to
|
||||
release 25.11)
|
||||
|
||||
Reference commits:
|
||||
|
||||
- `e08e6e2389234000b0447e57abf61d8ccd59a68e` (home-manager: set 25.05 as stable)
|
||||
|
||||
1. **README.md**
|
||||
- Update example release branch references (e.g., `release-24.11` →
|
||||
`release-25.05`)
|
||||
- Update current stable version references (e.g., `24.11` → `25.05`)
|
||||
|
||||
2. **docs/manual/installation/nix-darwin.md**
|
||||
- Update channel version in example commands
|
||||
- Update `home.stateVersion` in examples
|
||||
|
||||
3. **docs/manual/installation/nixos.md**
|
||||
- Update channel version in example commands
|
||||
- Update tarball URLs
|
||||
- Update `home.stateVersion` in examples
|
||||
|
||||
4. **docs/manual/installation/standalone.md**
|
||||
- Update channel version in example commands
|
||||
|
||||
5. **docs/manual/manual.md**
|
||||
- Remove `(unstable)` suffix from version
|
||||
|
||||
6. **docs/manual/nix-flakes/standalone.md**
|
||||
- Update flake references (e.g., `home-manager/release-24.11` →
|
||||
`home-manager/release-25.05`)
|
||||
- Update `$branch` examples
|
||||
|
||||
7. **docs/manual/usage/configuration.md**
|
||||
- Update `home.stateVersion` in example configurations
|
||||
|
||||
8. **docs/release-notes/rl-YYMM.md**
|
||||
- Replace "This is the current unstable branch and the information in this
|
||||
section is therefore not final."
|
||||
- With: "The YY.MM release branch became stable in <Month>, YYYY."
|
||||
|
||||
9. **home-manager/home-manager** script
|
||||
- Update default `home.stateVersion` in generated configurations
|
||||
- Update `home.stateVersion` in uninstall function
|
||||
|
||||
10. **modules/misc/uninstall.nix**
|
||||
- Update `home.stateVersion` in uninstall config
|
||||
|
||||
**Note**: Do NOT change `isReleaseBranch` in `release.json` - keep it as `false`
|
||||
|
||||
#### Step 2: Cut the release branch
|
||||
|
||||
**When**: After Step 1 is merged to master
|
||||
|
||||
1. Create the new release branch from master
|
||||
- Example: `git checkout -b release-25.11 master`
|
||||
2. Push the branch to the repository
|
||||
|
||||
#### Step 3: On the release branch - Mark as Release Branch
|
||||
|
||||
**When**: Immediately after creating the release branch
|
||||
|
||||
Reference commits:
|
||||
|
||||
- `70a787cc5` (release: set release branch)
|
||||
|
||||
1. **release.json**
|
||||
- Change `isReleaseBranch` from `false` to `true`
|
||||
- Do NOT change the `release` field (it's already correct from Step 1)
|
||||
|
||||
2. **flake.nix**
|
||||
- Update the nixpkgs input to track the corresponding stable branch
|
||||
- Example: For `release-25.11`, change from:
|
||||
```nix
|
||||
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
|
||||
```
|
||||
to:
|
||||
```nix
|
||||
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11";
|
||||
```
|
||||
- Run `nix flake update` to update flake.lock to the stable branch
|
||||
- Commit the flake.nix and flake.lock changes
|
||||
|
||||
**Note**: The release branch should track the stable NixOS release channel
|
||||
(e.g., `nixos-25.11`), while master continues to track `nixpkgs-unstable`.
|
||||
|
||||
#### Step 3.5: On master - Update CI for the New Release Branch
|
||||
|
||||
**When**: After marking the release branch as a release branch (Step 3)
|
||||
|
||||
**Where**: On the **master** branch (CI workflows run from master)
|
||||
|
||||
**What**: Update GitHub Actions workflows to include the new stable branch
|
||||
|
||||
1. **.github/workflows/update-flake.yml** (on master)
|
||||
- Replace the old stable branch with the new release branch in the matrix
|
||||
- Example: When creating `release-25.11`, update the matrix from:
|
||||
|
||||
```yaml
|
||||
strategy:
|
||||
matrix:
|
||||
branch: [master, release-25.05]
|
||||
```
|
||||
|
||||
to:
|
||||
|
||||
```yaml
|
||||
strategy:
|
||||
matrix:
|
||||
branch: [master, release-25.11]
|
||||
```
|
||||
|
||||
- This ensures automated flake.lock updates run on the current stable branch
|
||||
- Note: We only maintain CI for the latest stable release, not older releases
|
||||
|
||||
2. **.github/dependabot.yml** (on master)
|
||||
- Replace the old stable branch with the new release branch
|
||||
- Example: When creating `release-25.11`, update the target-branch from:
|
||||
|
||||
```yaml
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
target-branch: "release-25.05"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
commit-message:
|
||||
prefix: "ci:"
|
||||
```
|
||||
|
||||
to:
|
||||
|
||||
```yaml
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
target-branch: "release-25.11"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
commit-message:
|
||||
prefix: "ci:"
|
||||
```
|
||||
|
||||
- This ensures automated dependency updates for GitHub Actions on the current
|
||||
stable branch
|
||||
- Note: We only maintain dependabot for the latest stable release, not older
|
||||
releases
|
||||
|
||||
**Important**: CI workflows are executed from master, so this change must be
|
||||
committed to the master branch.
|
||||
|
||||
#### Step 4: On master - Prepare for Next Release
|
||||
|
||||
**When**: After cutting the release branch, prepare master for the next
|
||||
development cycle
|
||||
|
||||
Reference commits:
|
||||
|
||||
- `9a4a9f1d6e43fe4044f6715ae7cc85ccb1d2fe09` (home-manager: prepare 25.11)
|
||||
|
||||
1. **docs/release-notes/rl-YYMM.md** (CREATE NEW)
|
||||
- Create new release notes file for next version with unstable warning
|
||||
- Example: Create `rl-2605.md` when preparing for 26.05
|
||||
|
||||
2. **docs/manual/manual.md**
|
||||
- Update version to next release with `(unstable)` tag
|
||||
- Example: `25.11` → `26.05 (unstable)`
|
||||
|
||||
3. **docs/release-notes/release-notes.md**
|
||||
- Add new release notes file `rl-YYMM.md` at the top of the chapters list
|
||||
|
||||
4. **home-manager/home-manager** script
|
||||
- Update `--version` output to next version
|
||||
- Example: `echo 25.11-pre` → `echo 26.05-pre`
|
||||
|
||||
5. **modules/misc/version.nix**
|
||||
- Add new version string to `stateVersion` enum list
|
||||
- Example: Add `"26.05"` after `"25.11"`
|
||||
|
||||
6. **release.json**
|
||||
- Update `release` field to next version (e.g., `"25.11"` → `"26.05"`)
|
||||
- **IMPORTANT**: Keep `isReleaseBranch` as `false` on master
|
||||
|
||||
### Version State Changes
|
||||
|
||||
Each release may introduce state version changes that affect the default
|
||||
behavior of Home Manager for users who set `home.stateVersion` to that version.
|
||||
|
||||
State version changes should be documented in the release notes under a "State
|
||||
Version Changes" section, explaining what behavior changes for users who set
|
||||
their state version to the new release.
|
||||
|
||||
### Backporting
|
||||
|
||||
Stable branches get bug fixes and security updates, but usually not new modules
|
||||
or features. When backporting:
|
||||
|
||||
1. Use `git cherry-pick -x <commit>` to preserve the original commit reference
|
||||
2. Test that the backport builds successfully
|
||||
3. Consider whether the change might affect existing stable users
|
||||
4. Update the PR/commit message to indicate it's a backport
|
||||
|
||||
If a user needs a module backported, they should open an issue explaining the
|
||||
use case.
|
||||
@@ -1,21 +0,0 @@
|
||||
.PHONY: all all-tests test test-install format
|
||||
NIXPKGS_REV := nixpkgs-unstable
|
||||
NIX_PATH := nixpkgs=https://github.com/NixOS/nixpkgs/archive/${NIXPKGS_REV}.tar.gz
|
||||
|
||||
all: all-tests test-install
|
||||
|
||||
all-tests:
|
||||
$(MAKE) test TEST=all
|
||||
|
||||
test:
|
||||
ifndef TEST
|
||||
$(error Use 'make test TEST=<test_name>' to run desired test)
|
||||
endif
|
||||
nix-shell --pure tests -I ${NIX_PATH} -A run.${TEST}
|
||||
|
||||
test-install:
|
||||
HOME=$(shell mktemp -d) NIX_PATH=${NIX_PATH} nix-shell . -A install
|
||||
|
||||
format:
|
||||
# added 2026-03-01
|
||||
@echo "run \"nix-shell -A dev --run 'just format'\" instead"
|
||||
@@ -1,124 +0,0 @@
|
||||
Home Manager using Nix
|
||||
======================
|
||||
|
||||
This project provides a basic system for managing a user environment using the
|
||||
[Nix][] package manager together with the Nix libraries found in [Nixpkgs][]. It
|
||||
allows declarative configuration of user specific (non-global) packages and
|
||||
dotfiles.
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
Before attempting to use Home Manager please read [the warning
|
||||
below](#words-of-warning).
|
||||
|
||||
For a systematic overview of Home Manager and its available options, please see:
|
||||
|
||||
- [Home Manager manual][manual]
|
||||
- [Home Manager configuration options][configuration options]
|
||||
- [3rd party Home Manager option
|
||||
search](https://home-manager-options.extranix.com/)
|
||||
|
||||
If you would like to contribute to Home Manager, then please have a look at
|
||||
["Contributing" in the manual][contributing].
|
||||
|
||||
Releases
|
||||
--------
|
||||
|
||||
Home Manager is developed against the `nixpkgs-unstable` branch, which often
|
||||
causes it to contain tweaks for changes/packages not yet released in stable
|
||||
[NixOS][].
|
||||
To avoid breaking users' configurations, Home Manager is released in branches
|
||||
corresponding to NixOS releases (e.g. `release-26.05`). These branches get
|
||||
fixes, but usually not new modules. If you need a module to be backported, then
|
||||
feel free to open an issue.
|
||||
|
||||
Words of warning
|
||||
----------------
|
||||
|
||||
Unfortunately, it is quite possible to get difficult to understand errors when
|
||||
working with Home Manager. You should therefore be comfortable using the [Nix][]
|
||||
language and the various tools in the Nix ecosystem.
|
||||
|
||||
If you are not very familiar with Nix but still want to use Home Manager then
|
||||
you are strongly encouraged to start with a small and very simple configuration
|
||||
and gradually make it more elaborate as you learn.
|
||||
|
||||
In some cases Home Manager cannot detect whether it will overwrite a previous
|
||||
manual configuration. For example, the Gnome Terminal module will write to your
|
||||
dconf store and cannot tell whether a configuration that is about to be
|
||||
overwritten was from a previous Home Manager generation or from manual
|
||||
configuration.
|
||||
|
||||
Home Manager targets `nixpkgs-unstable` and NixOS version 26.05 (the current
|
||||
stable version), it may or may not work on other Linux distributions and NixOS
|
||||
versions.
|
||||
|
||||
Now when your expectations have been built up and you are eager to try all this
|
||||
out you can go ahead and read the rest of this text.
|
||||
|
||||
Contact
|
||||
-------
|
||||
|
||||
You can chat with us on IRC in the channel [#home-manager][] on [OFTC][]. There
|
||||
is also a [Matrix room](https://matrix.to/#/#hm:rycee.net), which is bridged to
|
||||
the IRC channel.
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
Home Manager can be used in three primary ways:
|
||||
|
||||
1. Using the standalone `home-manager` tool. For platforms other than NixOS and
|
||||
Darwin, this is the only available choice. It is also recommended for people
|
||||
on [NixOS][] or Darwin that want to manage their home directory independently
|
||||
of the system as a whole. See ["Standalone installation" in the
|
||||
manual][manual standalone install] for instructions on how to perform this
|
||||
installation.
|
||||
|
||||
1. As a module within a NixOS system configuration. This allows the user
|
||||
profiles to be built together with the system when running `nixos-rebuild`.
|
||||
See ["NixOS module" in the manual][manual nixos install] for a description of
|
||||
this setup.
|
||||
|
||||
1. As a module within a [nix-darwin] system configuration. This allows the user
|
||||
profiles to be built together with the system when running `darwin-rebuild`.
|
||||
See ["nix-darwin module" in the manual][manual nix-darwin install] for a
|
||||
description of this setup.
|
||||
|
||||
Home Manager provides both the channel-based setup and the flake-based one. See
|
||||
[Nix Flakes][manual nix flakes] for a description of the flake-based setup.
|
||||
|
||||
Translations
|
||||
------------
|
||||
|
||||
Home Manager has basic support for internationalization through
|
||||
[gettext](https://www.gnu.org/software/gettext/). The translations are hosted by
|
||||
[Weblate](https://weblate.org/). If you would like to contribute to the
|
||||
translation effort then start by going to the [Home Manager Weblate
|
||||
project](https://hosted.weblate.org/engage/home-manager/).
|
||||
|
||||
<a href="https://hosted.weblate.org/engage/home-manager/">
|
||||
<img src="https://hosted.weblate.org/widgets/home-manager/-/multi-auto.svg" alt="Translation status" />
|
||||
</a>
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
This project is licensed under the terms of the [MIT license](LICENSE).
|
||||
|
||||
[#home-manager]: https://webchat.oftc.net/?channels=home-manager
|
||||
[Nix Flakes]: https://wiki.nixos.org/wiki/Flakes
|
||||
[NixOS]: https://nixos.org/
|
||||
[Nix]: https://nixos.org/explore.html
|
||||
[Nixpkgs]: https://github.com/NixOS/nixpkgs
|
||||
[OFTC]: https://oftc.net/
|
||||
[configuration options]: https://nix-community.github.io/home-manager/options.xhtml
|
||||
[contributing]: https://nix-community.github.io/home-manager/#ch-contributing
|
||||
[manual nix flakes]: https://nix-community.github.io/home-manager/#ch-nix-flakes
|
||||
[manual nix-darwin install]: https://nix-community.github.io/home-manager/#sec-install-nix-darwin-module
|
||||
[manual nixos install]: https://nix-community.github.io/home-manager/#sec-install-nixos-module
|
||||
[manual standalone install]: https://nix-community.github.io/home-manager/#sec-install-standalone
|
||||
[manual]: https://nix-community.github.io/home-manager/
|
||||
[nix-darwin]: https://github.com/nix-darwin/nix-darwin
|
||||
[rollbacks]: https://nix-community.github.io/home-manager/index.xhtml#sec-usage-rollbacks
|
||||
-2537
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,77 @@
|
||||
/*
|
||||
Based off of the Ayu theme
|
||||
Original by Dempfi (https://github.com/dempfi/ayu)
|
||||
*/
|
||||
|
||||
.hljs {
|
||||
display: block;
|
||||
overflow-x: auto;
|
||||
background: #191f26;
|
||||
color: #e6e1cf;
|
||||
}
|
||||
|
||||
.hljs-comment,
|
||||
.hljs-quote {
|
||||
color: #5c6773;
|
||||
}
|
||||
|
||||
.hljs-variable,
|
||||
.hljs-template-variable,
|
||||
.hljs-attribute,
|
||||
.hljs-attr,
|
||||
.hljs-regexp,
|
||||
.hljs-link,
|
||||
.hljs-selector-id,
|
||||
.hljs-selector-class {
|
||||
color: #ff7733;
|
||||
}
|
||||
|
||||
.hljs-number,
|
||||
.hljs-meta,
|
||||
.hljs-builtin-name,
|
||||
.hljs-literal,
|
||||
.hljs-type,
|
||||
.hljs-params {
|
||||
color: #ffee99;
|
||||
}
|
||||
|
||||
.hljs-string,
|
||||
.hljs-bullet {
|
||||
color: #b8cc52;
|
||||
}
|
||||
|
||||
.hljs-title,
|
||||
.hljs-built_in,
|
||||
.hljs-section {
|
||||
color: #ffb454;
|
||||
}
|
||||
|
||||
.hljs-keyword,
|
||||
.hljs-selector-tag,
|
||||
.hljs-symbol {
|
||||
color: #ff7733;
|
||||
}
|
||||
|
||||
.hljs-name {
|
||||
color: #36a3d9;
|
||||
}
|
||||
|
||||
.hljs-tag {
|
||||
color: #00568d;
|
||||
}
|
||||
|
||||
.hljs-emphasis {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.hljs-strong {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.hljs-addition {
|
||||
color: #91b362;
|
||||
}
|
||||
|
||||
.hljs-deletion {
|
||||
color: #d96c75;
|
||||
}
|
||||
@@ -0,0 +1,870 @@
|
||||
'use strict';
|
||||
|
||||
/* global default_theme, default_dark_theme, default_light_theme, hljs, ClipboardJS */
|
||||
|
||||
// Fix back button cache problem
|
||||
window.onunload = function() { };
|
||||
|
||||
// Global variable, shared between modules
|
||||
function playground_text(playground, hidden = true) {
|
||||
const code_block = playground.querySelector('code');
|
||||
|
||||
if (window.ace && code_block.classList.contains('editable')) {
|
||||
const editor = window.ace.edit(code_block);
|
||||
return editor.getValue();
|
||||
} else if (hidden) {
|
||||
return code_block.textContent;
|
||||
} else {
|
||||
return code_block.innerText;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper for global keypress handlers so they don't trigger when certain elements are active.
|
||||
* @returns {boolean} True if the keypress handler should be skipped.
|
||||
*/
|
||||
function mdbook_something_else_has_focus(e) {
|
||||
// Check composedPath in case the event happened from something generated
|
||||
// from the shadowDOM.
|
||||
const target = e.composedPath()[0] || e.target;
|
||||
// If this is the `checkbox-img` input which has the focus, we want to handle it here.
|
||||
if (target.classList.contains('checkbox-img')) {
|
||||
return false;
|
||||
}
|
||||
return /^(?:input|select|textarea)$/i.test(target.nodeName);
|
||||
}
|
||||
|
||||
(function codeSnippets() {
|
||||
function fetch_with_timeout(url, options, timeout = 6000) {
|
||||
return Promise.race([
|
||||
fetch(url, options),
|
||||
new Promise((_, reject) => setTimeout(() => reject(new Error('timeout')), timeout)),
|
||||
]);
|
||||
}
|
||||
|
||||
const playgrounds = Array.from(document.querySelectorAll('.playground'));
|
||||
if (playgrounds.length > 0) {
|
||||
fetch_with_timeout('https://play.rust-lang.org/meta/crates', {
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
method: 'POST',
|
||||
mode: 'cors',
|
||||
})
|
||||
.then(response => response.json())
|
||||
.then(response => {
|
||||
// get list of crates available in the rust playground
|
||||
const playground_crates = response.crates.map(item => item['id']);
|
||||
playgrounds.forEach(block => handle_crate_list_update(block, playground_crates));
|
||||
});
|
||||
}
|
||||
|
||||
function handle_crate_list_update(playground_block, playground_crates) {
|
||||
// update the play buttons after receiving the response
|
||||
update_play_button(playground_block, playground_crates);
|
||||
|
||||
// and install on change listener to dynamically update ACE editors
|
||||
if (window.ace) {
|
||||
const code_block = playground_block.querySelector('code');
|
||||
if (code_block.classList.contains('editable')) {
|
||||
const editor = window.ace.edit(code_block);
|
||||
editor.addEventListener('change', () => {
|
||||
update_play_button(playground_block, playground_crates);
|
||||
});
|
||||
// add Ctrl-Enter command to execute rust code
|
||||
editor.commands.addCommand({
|
||||
name: 'run',
|
||||
bindKey: {
|
||||
win: 'Ctrl-Enter',
|
||||
mac: 'Ctrl-Enter',
|
||||
},
|
||||
exec: _editor => run_rust_code(playground_block),
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// updates the visibility of play button based on `no_run` class and
|
||||
// used crates vs ones available on https://play.rust-lang.org
|
||||
function update_play_button(pre_block, playground_crates) {
|
||||
const play_button = pre_block.querySelector('.play-button');
|
||||
|
||||
// skip if code is `no_run`
|
||||
if (pre_block.querySelector('code').classList.contains('no_run')) {
|
||||
play_button.classList.add('hidden');
|
||||
return;
|
||||
}
|
||||
|
||||
// get list of `extern crate`'s from snippet
|
||||
const txt = playground_text(pre_block);
|
||||
const re = /extern\s+crate\s+([a-zA-Z_0-9]+)\s*;/g;
|
||||
const snippet_crates = [];
|
||||
let item;
|
||||
while (item = re.exec(txt)) {
|
||||
snippet_crates.push(item[1]);
|
||||
}
|
||||
|
||||
// check if all used crates are available on play.rust-lang.org
|
||||
const all_available = snippet_crates.every(function(elem) {
|
||||
return playground_crates.indexOf(elem) > -1;
|
||||
});
|
||||
|
||||
if (all_available) {
|
||||
play_button.classList.remove('hidden');
|
||||
play_button.hidden = false;
|
||||
} else {
|
||||
play_button.classList.add('hidden');
|
||||
}
|
||||
}
|
||||
|
||||
function run_rust_code(code_block) {
|
||||
let result_block = code_block.querySelector('.result');
|
||||
if (!result_block) {
|
||||
result_block = document.createElement('code');
|
||||
result_block.className = 'result hljs language-bash';
|
||||
|
||||
code_block.append(result_block);
|
||||
}
|
||||
|
||||
const text = playground_text(code_block);
|
||||
const classes = code_block.querySelector('code').classList;
|
||||
let edition = '2015';
|
||||
classes.forEach(className => {
|
||||
if (className.startsWith('edition')) {
|
||||
edition = className.slice(7);
|
||||
}
|
||||
});
|
||||
const params = {
|
||||
version: 'stable',
|
||||
optimize: '0',
|
||||
code: text,
|
||||
edition: edition,
|
||||
};
|
||||
|
||||
if (text.indexOf('#![feature') !== -1) {
|
||||
params.version = 'nightly';
|
||||
}
|
||||
|
||||
result_block.innerText = 'Running...';
|
||||
|
||||
fetch_with_timeout('https://play.rust-lang.org/evaluate.json', {
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
method: 'POST',
|
||||
mode: 'cors',
|
||||
body: JSON.stringify(params),
|
||||
})
|
||||
.then(response => response.json())
|
||||
.then(response => {
|
||||
if (response.result.trim() === '') {
|
||||
result_block.innerText = 'No output';
|
||||
result_block.classList.add('result-no-output');
|
||||
} else {
|
||||
result_block.innerText = response.result;
|
||||
result_block.classList.remove('result-no-output');
|
||||
}
|
||||
})
|
||||
.catch(error => result_block.innerText = 'Playground Communication: ' + error.message);
|
||||
}
|
||||
|
||||
// Syntax highlighting Configuration
|
||||
hljs.configure({
|
||||
tabReplace: ' ', // 4 spaces
|
||||
languages: [], // Languages used for auto-detection
|
||||
});
|
||||
|
||||
const code_nodes = Array
|
||||
.from(document.querySelectorAll('code'))
|
||||
// Don't highlight `inline code` blocks in headers.
|
||||
.filter(function(node) {
|
||||
return !node.parentElement.classList.contains('header');
|
||||
});
|
||||
|
||||
if (window.ace) {
|
||||
// language-rust class needs to be removed for editable
|
||||
// blocks or highlightjs will capture events
|
||||
code_nodes
|
||||
.filter(function(node) {
|
||||
return node.classList.contains('editable');
|
||||
})
|
||||
.forEach(function(block) {
|
||||
block.classList.remove('language-rust');
|
||||
});
|
||||
|
||||
code_nodes
|
||||
.filter(function(node) {
|
||||
return !node.classList.contains('editable');
|
||||
})
|
||||
.forEach(function(block) {
|
||||
hljs.highlightBlock(block);
|
||||
});
|
||||
} else {
|
||||
code_nodes.forEach(function(block) {
|
||||
hljs.highlightBlock(block);
|
||||
});
|
||||
}
|
||||
|
||||
// Adding the hljs class gives code blocks the color css
|
||||
// even if highlighting doesn't apply
|
||||
code_nodes.forEach(function(block) {
|
||||
block.classList.add('hljs');
|
||||
});
|
||||
|
||||
Array.from(document.querySelectorAll('code.hljs')).forEach(function(block) {
|
||||
|
||||
const lines = Array.from(block.querySelectorAll('.boring'));
|
||||
// If no lines were hidden, return
|
||||
if (!lines.length) {
|
||||
return;
|
||||
}
|
||||
block.classList.add('hide-boring');
|
||||
|
||||
const buttons = document.createElement('div');
|
||||
buttons.className = 'buttons';
|
||||
buttons.innerHTML = '<button title="Show hidden lines" \
|
||||
aria-label="Show hidden lines"></button>';
|
||||
buttons.firstChild.innerHTML = document.getElementById('fa-eye').innerHTML;
|
||||
|
||||
// add expand button
|
||||
const pre_block = block.parentNode;
|
||||
pre_block.insertBefore(buttons, pre_block.firstChild);
|
||||
|
||||
buttons.firstChild.addEventListener('click', function(e) {
|
||||
if (this.title === 'Show hidden lines') {
|
||||
this.innerHTML = document.getElementById('fa-eye-slash').innerHTML;
|
||||
this.title = 'Hide lines';
|
||||
this.setAttribute('aria-label', e.target.title);
|
||||
|
||||
block.classList.remove('hide-boring');
|
||||
} else if (this.title === 'Hide lines') {
|
||||
this.innerHTML = document.getElementById('fa-eye').innerHTML;
|
||||
this.title = 'Show hidden lines';
|
||||
this.setAttribute('aria-label', e.target.title);
|
||||
|
||||
block.classList.add('hide-boring');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
if (window.playground_copyable) {
|
||||
Array.from(document.querySelectorAll('pre code')).forEach(function(block) {
|
||||
const pre_block = block.parentNode;
|
||||
if (!pre_block.classList.contains('playground')) {
|
||||
let buttons = pre_block.querySelector('.buttons');
|
||||
if (!buttons) {
|
||||
buttons = document.createElement('div');
|
||||
buttons.className = 'buttons';
|
||||
pre_block.insertBefore(buttons, pre_block.firstChild);
|
||||
}
|
||||
|
||||
const clipButton = document.createElement('button');
|
||||
clipButton.className = 'clip-button';
|
||||
clipButton.title = 'Copy to clipboard';
|
||||
clipButton.setAttribute('aria-label', clipButton.title);
|
||||
clipButton.innerHTML = '<i class="tooltiptext"></i>';
|
||||
|
||||
buttons.insertBefore(clipButton, buttons.firstChild);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Process playground code blocks
|
||||
Array.from(document.querySelectorAll('.playground')).forEach(function(pre_block) {
|
||||
// Add play button
|
||||
let buttons = pre_block.querySelector('.buttons');
|
||||
if (!buttons) {
|
||||
buttons = document.createElement('div');
|
||||
buttons.className = 'buttons';
|
||||
pre_block.insertBefore(buttons, pre_block.firstChild);
|
||||
}
|
||||
|
||||
const runCodeButton = document.createElement('button');
|
||||
runCodeButton.className = 'play-button';
|
||||
runCodeButton.hidden = true;
|
||||
runCodeButton.title = 'Run this code';
|
||||
runCodeButton.setAttribute('aria-label', runCodeButton.title);
|
||||
runCodeButton.innerHTML = document.getElementById('fa-play').innerHTML;
|
||||
|
||||
buttons.insertBefore(runCodeButton, buttons.firstChild);
|
||||
runCodeButton.addEventListener('click', () => {
|
||||
run_rust_code(pre_block);
|
||||
});
|
||||
|
||||
if (window.playground_copyable) {
|
||||
const copyCodeClipboardButton = document.createElement('button');
|
||||
copyCodeClipboardButton.className = 'clip-button';
|
||||
copyCodeClipboardButton.innerHTML = '<i class="tooltiptext"></i>';
|
||||
copyCodeClipboardButton.title = 'Copy to clipboard';
|
||||
copyCodeClipboardButton.setAttribute('aria-label', copyCodeClipboardButton.title);
|
||||
|
||||
buttons.insertBefore(copyCodeClipboardButton, buttons.firstChild);
|
||||
}
|
||||
|
||||
const code_block = pre_block.querySelector('code');
|
||||
if (window.ace && code_block.classList.contains('editable')) {
|
||||
const undoChangesButton = document.createElement('button');
|
||||
undoChangesButton.className = 'reset-button';
|
||||
undoChangesButton.title = 'Undo changes';
|
||||
undoChangesButton.setAttribute('aria-label', undoChangesButton.title);
|
||||
undoChangesButton.innerHTML +=
|
||||
document.getElementById('fa-clock-rotate-left').innerHTML;
|
||||
|
||||
buttons.insertBefore(undoChangesButton, buttons.firstChild);
|
||||
|
||||
undoChangesButton.addEventListener('click', function() {
|
||||
const editor = window.ace.edit(code_block);
|
||||
editor.setValue(editor.originalCode);
|
||||
editor.clearSelection();
|
||||
});
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
||||
(function themes() {
|
||||
const html = document.querySelector('html');
|
||||
const themeToggleButton = document.getElementById('mdbook-theme-toggle');
|
||||
const themePopup = document.getElementById('mdbook-theme-list');
|
||||
const themeColorMetaTag = document.querySelector('meta[name="theme-color"]');
|
||||
const themeIds = [];
|
||||
themePopup.querySelectorAll('button.theme').forEach(function(el) {
|
||||
themeIds.push(el.id);
|
||||
});
|
||||
const stylesheets = {
|
||||
ayuHighlight: document.querySelector('#mdbook-ayu-highlight-css'),
|
||||
tomorrowNight: document.querySelector('#mdbook-tomorrow-night-css'),
|
||||
highlight: document.querySelector('#mdbook-highlight-css'),
|
||||
};
|
||||
|
||||
function showThemes() {
|
||||
themePopup.style.display = 'block';
|
||||
themeToggleButton.setAttribute('aria-expanded', true);
|
||||
themePopup.querySelector('button#mdbook-theme-' + get_theme()).focus();
|
||||
}
|
||||
|
||||
function updateThemeSelected() {
|
||||
themePopup.querySelectorAll('.theme-selected').forEach(function(el) {
|
||||
el.classList.remove('theme-selected');
|
||||
});
|
||||
const selected = get_saved_theme() ?? 'default_theme';
|
||||
let element = themePopup.querySelector('button#mdbook-theme-' + selected);
|
||||
if (element === null) {
|
||||
// Fall back in case there is no "Default" item.
|
||||
element = themePopup.querySelector('button#mdbook-theme-' + get_theme());
|
||||
}
|
||||
element.classList.add('theme-selected');
|
||||
}
|
||||
|
||||
function hideThemes() {
|
||||
themePopup.style.display = 'none';
|
||||
themeToggleButton.setAttribute('aria-expanded', false);
|
||||
themeToggleButton.focus();
|
||||
}
|
||||
|
||||
function get_saved_theme() {
|
||||
let theme = null;
|
||||
try {
|
||||
theme = localStorage.getItem('mdbook-theme');
|
||||
} catch {
|
||||
// ignore error.
|
||||
}
|
||||
return theme;
|
||||
}
|
||||
|
||||
function delete_saved_theme() {
|
||||
localStorage.removeItem('mdbook-theme');
|
||||
}
|
||||
|
||||
function get_theme() {
|
||||
const theme = get_saved_theme();
|
||||
if (theme === null || theme === undefined || !themeIds.includes('mdbook-theme-' + theme)) {
|
||||
if (typeof default_dark_theme === 'undefined') {
|
||||
// A customized index.hbs might not define this, so fall back to
|
||||
// old behavior of determining the default on page load.
|
||||
return default_theme;
|
||||
}
|
||||
return window.matchMedia('(prefers-color-scheme: dark)').matches
|
||||
? default_dark_theme
|
||||
: default_light_theme;
|
||||
} else {
|
||||
return theme;
|
||||
}
|
||||
}
|
||||
|
||||
let previousTheme = default_theme;
|
||||
function set_theme(theme, store = true) {
|
||||
let ace_theme;
|
||||
|
||||
if (theme === 'coal' || theme === 'navy') {
|
||||
stylesheets.ayuHighlight.disabled = true;
|
||||
stylesheets.tomorrowNight.disabled = false;
|
||||
stylesheets.highlight.disabled = true;
|
||||
|
||||
ace_theme = 'ace/theme/tomorrow_night';
|
||||
} else if (theme === 'ayu') {
|
||||
stylesheets.ayuHighlight.disabled = false;
|
||||
stylesheets.tomorrowNight.disabled = true;
|
||||
stylesheets.highlight.disabled = true;
|
||||
ace_theme = 'ace/theme/tomorrow_night';
|
||||
} else {
|
||||
stylesheets.ayuHighlight.disabled = true;
|
||||
stylesheets.tomorrowNight.disabled = true;
|
||||
stylesheets.highlight.disabled = false;
|
||||
ace_theme = 'ace/theme/dawn';
|
||||
}
|
||||
|
||||
setTimeout(function() {
|
||||
themeColorMetaTag.content = getComputedStyle(document.documentElement).backgroundColor;
|
||||
}, 1);
|
||||
|
||||
if (window.ace && window.editors) {
|
||||
window.editors.forEach(function(editor) {
|
||||
editor.setTheme(ace_theme);
|
||||
});
|
||||
}
|
||||
|
||||
if (store) {
|
||||
try {
|
||||
localStorage.setItem('mdbook-theme', theme);
|
||||
} catch {
|
||||
// ignore error.
|
||||
}
|
||||
}
|
||||
|
||||
html.classList.remove(previousTheme);
|
||||
html.classList.add(theme);
|
||||
previousTheme = theme;
|
||||
updateThemeSelected();
|
||||
}
|
||||
|
||||
const query = window.matchMedia('(prefers-color-scheme: dark)');
|
||||
query.onchange = function() {
|
||||
set_theme(get_theme(), false);
|
||||
};
|
||||
|
||||
// Set theme.
|
||||
set_theme(get_theme(), false);
|
||||
|
||||
themeToggleButton.addEventListener('click', function() {
|
||||
if (themePopup.style.display === 'block') {
|
||||
hideThemes();
|
||||
} else {
|
||||
showThemes();
|
||||
}
|
||||
});
|
||||
|
||||
themePopup.addEventListener('click', function(e) {
|
||||
let theme;
|
||||
if (e.target.className === 'theme') {
|
||||
theme = e.target.id;
|
||||
} else if (e.target.parentElement.className === 'theme') {
|
||||
theme = e.target.parentElement.id;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
theme = theme.replace(/^mdbook-theme-/, '');
|
||||
|
||||
if (theme === 'default_theme' || theme === null) {
|
||||
delete_saved_theme();
|
||||
set_theme(get_theme(), false);
|
||||
} else {
|
||||
set_theme(theme);
|
||||
}
|
||||
});
|
||||
|
||||
themePopup.addEventListener('focusout', function(e) {
|
||||
// e.relatedTarget is null in Safari and Firefox on macOS (see workaround below)
|
||||
if (!!e.relatedTarget &&
|
||||
!themeToggleButton.contains(e.relatedTarget) &&
|
||||
!themePopup.contains(e.relatedTarget)
|
||||
) {
|
||||
hideThemes();
|
||||
}
|
||||
});
|
||||
|
||||
// Should not be needed, but it works around an issue on macOS & iOS:
|
||||
// https://github.com/rust-lang/mdBook/issues/628
|
||||
document.addEventListener('click', function(e) {
|
||||
if (themePopup.style.display === 'block' &&
|
||||
!themeToggleButton.contains(e.target) &&
|
||||
!themePopup.contains(e.target)
|
||||
) {
|
||||
hideThemes();
|
||||
}
|
||||
});
|
||||
|
||||
document.addEventListener('keydown', function(e) {
|
||||
if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) {
|
||||
return;
|
||||
}
|
||||
if (!themePopup.contains(e.target)) {
|
||||
return;
|
||||
}
|
||||
|
||||
let li;
|
||||
switch (e.key) {
|
||||
case 'Escape':
|
||||
e.preventDefault();
|
||||
hideThemes();
|
||||
break;
|
||||
case 'ArrowUp':
|
||||
e.preventDefault();
|
||||
li = document.activeElement.parentElement;
|
||||
if (li && li.previousElementSibling) {
|
||||
li.previousElementSibling.querySelector('button').focus();
|
||||
}
|
||||
break;
|
||||
case 'ArrowDown':
|
||||
e.preventDefault();
|
||||
li = document.activeElement.parentElement;
|
||||
if (li && li.nextElementSibling) {
|
||||
li.nextElementSibling.querySelector('button').focus();
|
||||
}
|
||||
break;
|
||||
case 'Home':
|
||||
e.preventDefault();
|
||||
themePopup.querySelector('li:first-child button').focus();
|
||||
break;
|
||||
case 'End':
|
||||
e.preventDefault();
|
||||
themePopup.querySelector('li:last-child button').focus();
|
||||
break;
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
||||
(function sidebar() {
|
||||
const sidebar = document.getElementById('mdbook-sidebar');
|
||||
const sidebarLinks = document.querySelectorAll('#mdbook-sidebar a');
|
||||
const sidebarToggleButton = document.getElementById('mdbook-sidebar-toggle');
|
||||
const sidebarResizeHandle = document.getElementById('mdbook-sidebar-resize-handle');
|
||||
const sidebarCheckbox = document.getElementById('mdbook-sidebar-toggle-anchor');
|
||||
let firstContact = null;
|
||||
|
||||
|
||||
/* Because we cannot change the `display` using only CSS after/before the transition, we
|
||||
need JS to do it. We change the display to prevent the browsers search to find text inside
|
||||
the collapsed sidebar. */
|
||||
if (!document.documentElement.classList.contains('sidebar-visible')) {
|
||||
sidebar.style.display = 'none';
|
||||
}
|
||||
sidebar.addEventListener('transitionend', () => {
|
||||
/* We only change the display to "none" if we're collapsing the sidebar. */
|
||||
if (!sidebarCheckbox.checked) {
|
||||
sidebar.style.display = 'none';
|
||||
}
|
||||
});
|
||||
sidebarToggleButton.addEventListener('click', () => {
|
||||
/* To allow the sidebar expansion animation, we first need to put back the display. */
|
||||
if (!sidebarCheckbox.checked) {
|
||||
sidebar.style.display = '';
|
||||
// Workaround for Safari skipping the animation when changing
|
||||
// `display` and a transform in the same event loop. This forces a
|
||||
// reflow after updating the display.
|
||||
sidebar.offsetHeight;
|
||||
}
|
||||
});
|
||||
|
||||
function showSidebar() {
|
||||
document.documentElement.classList.add('sidebar-visible');
|
||||
Array.from(sidebarLinks).forEach(function(link) {
|
||||
link.setAttribute('tabIndex', 0);
|
||||
});
|
||||
sidebarToggleButton.setAttribute('aria-expanded', true);
|
||||
sidebar.setAttribute('aria-hidden', false);
|
||||
try {
|
||||
localStorage.setItem('mdbook-sidebar', 'visible');
|
||||
} catch {
|
||||
// Ignore error.
|
||||
}
|
||||
}
|
||||
|
||||
function hideSidebar() {
|
||||
document.documentElement.classList.remove('sidebar-visible');
|
||||
Array.from(sidebarLinks).forEach(function(link) {
|
||||
link.setAttribute('tabIndex', -1);
|
||||
});
|
||||
sidebarToggleButton.setAttribute('aria-expanded', false);
|
||||
sidebar.setAttribute('aria-hidden', true);
|
||||
try {
|
||||
localStorage.setItem('mdbook-sidebar', 'hidden');
|
||||
} catch {
|
||||
// Ignore error.
|
||||
}
|
||||
}
|
||||
|
||||
// Toggle sidebar
|
||||
sidebarCheckbox.addEventListener('change', function sidebarToggle() {
|
||||
if (sidebarCheckbox.checked) {
|
||||
const current_width = parseInt(
|
||||
document.documentElement.style.getPropertyValue('--sidebar-target-width'), 10);
|
||||
if (current_width < 150) {
|
||||
document.documentElement.style.setProperty('--sidebar-target-width', '150px');
|
||||
}
|
||||
showSidebar();
|
||||
} else {
|
||||
hideSidebar();
|
||||
}
|
||||
});
|
||||
|
||||
sidebarResizeHandle.addEventListener('mousedown', initResize, false);
|
||||
|
||||
function initResize() {
|
||||
window.addEventListener('mousemove', resize, false);
|
||||
window.addEventListener('mouseup', stopResize, false);
|
||||
document.documentElement.classList.add('sidebar-resizing');
|
||||
}
|
||||
function resize(e) {
|
||||
let pos = e.clientX - sidebar.offsetLeft;
|
||||
if (pos < 20) {
|
||||
hideSidebar();
|
||||
} else {
|
||||
if (!document.documentElement.classList.contains('sidebar-visible')) {
|
||||
showSidebar();
|
||||
}
|
||||
pos = Math.min(pos, window.innerWidth - 100);
|
||||
document.documentElement.style.setProperty('--sidebar-target-width', pos + 'px');
|
||||
}
|
||||
}
|
||||
//on mouseup remove windows functions mousemove & mouseup
|
||||
function stopResize() {
|
||||
document.documentElement.classList.remove('sidebar-resizing');
|
||||
window.removeEventListener('mousemove', resize, false);
|
||||
window.removeEventListener('mouseup', stopResize, false);
|
||||
}
|
||||
|
||||
document.addEventListener('touchstart', function(e) {
|
||||
firstContact = {
|
||||
x: e.touches[0].clientX,
|
||||
time: Date.now(),
|
||||
};
|
||||
}, { passive: true });
|
||||
|
||||
document.addEventListener('touchmove', function(e) {
|
||||
if (!firstContact) {
|
||||
return;
|
||||
}
|
||||
|
||||
const curX = e.touches[0].clientX;
|
||||
const xDiff = curX - firstContact.x,
|
||||
tDiff = Date.now() - firstContact.time;
|
||||
|
||||
if (tDiff < 250 && Math.abs(xDiff) >= 150) {
|
||||
if (xDiff >= 0 && firstContact.x < Math.min(document.body.clientWidth * 0.25, 300)) {
|
||||
showSidebar();
|
||||
} else if (xDiff < 0 && curX < 300) {
|
||||
hideSidebar();
|
||||
}
|
||||
|
||||
firstContact = null;
|
||||
}
|
||||
}, { passive: true });
|
||||
})();
|
||||
|
||||
(function chapterNavigation() {
|
||||
function zoomOutImages() {
|
||||
for (const elem of Array.from(document.querySelectorAll('input.checkbox-img'))) {
|
||||
elem.checked = false;
|
||||
}
|
||||
}
|
||||
|
||||
document.addEventListener('keydown', function(e) {
|
||||
if (e.altKey ||
|
||||
e.ctrlKey ||
|
||||
e.metaKey ||
|
||||
window.search && window.search.hasFocus() ||
|
||||
mdbook_something_else_has_focus(e)
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
const html = document.querySelector('html');
|
||||
|
||||
function next() {
|
||||
const nextButton = document.querySelector('.nav-chapters.next');
|
||||
if (nextButton) {
|
||||
window.location.href = nextButton.href;
|
||||
}
|
||||
}
|
||||
function prev() {
|
||||
const previousButton = document.querySelector('.nav-chapters.previous');
|
||||
if (previousButton) {
|
||||
window.location.href = previousButton.href;
|
||||
}
|
||||
}
|
||||
function showHelp() {
|
||||
const container = document.getElementById('mdbook-help-container');
|
||||
const overlay = document.getElementById('mdbook-help-popup');
|
||||
container.style.display = 'flex';
|
||||
|
||||
// Clicking outside the popup will dismiss it.
|
||||
const mouseHandler = event => {
|
||||
if (overlay.contains(event.target)) {
|
||||
return;
|
||||
}
|
||||
if (event.button !== 0) {
|
||||
return;
|
||||
}
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
document.removeEventListener('mousedown', mouseHandler);
|
||||
hideHelp();
|
||||
};
|
||||
|
||||
// Pressing esc will dismiss the popup.
|
||||
const escapeKeyHandler = event => {
|
||||
if (event.key === 'Escape') {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
document.removeEventListener('keydown', escapeKeyHandler, true);
|
||||
hideHelp();
|
||||
}
|
||||
};
|
||||
document.addEventListener('keydown', escapeKeyHandler, true);
|
||||
document.getElementById('mdbook-help-container')
|
||||
.addEventListener('mousedown', mouseHandler);
|
||||
}
|
||||
function hideHelp() {
|
||||
document.getElementById('mdbook-help-container').style.display = 'none';
|
||||
}
|
||||
|
||||
// Usually needs the Shift key to be pressed
|
||||
switch (e.key) {
|
||||
case '?':
|
||||
e.preventDefault();
|
||||
showHelp();
|
||||
break;
|
||||
case 'Escape':
|
||||
zoomOutImages();
|
||||
break;
|
||||
}
|
||||
|
||||
// Rest of the keys are only active when the Shift key is not pressed
|
||||
if (e.shiftKey) {
|
||||
return;
|
||||
}
|
||||
|
||||
switch (e.key) {
|
||||
case 'ArrowRight':
|
||||
e.preventDefault();
|
||||
if (html.dir === 'rtl') {
|
||||
prev();
|
||||
} else {
|
||||
next();
|
||||
}
|
||||
break;
|
||||
case 'ArrowLeft':
|
||||
e.preventDefault();
|
||||
if (html.dir === 'rtl') {
|
||||
next();
|
||||
} else {
|
||||
prev();
|
||||
}
|
||||
break;
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
||||
(function clipboard() {
|
||||
const clipButtons = document.querySelectorAll('.clip-button');
|
||||
|
||||
function hideTooltip(elem) {
|
||||
elem.firstChild.innerText = '';
|
||||
elem.className = 'clip-button';
|
||||
}
|
||||
|
||||
function showTooltip(elem, msg) {
|
||||
elem.firstChild.innerText = msg;
|
||||
elem.className = 'clip-button tooltipped';
|
||||
}
|
||||
|
||||
const clipboardSnippets = new ClipboardJS('.clip-button', {
|
||||
text: function(trigger) {
|
||||
hideTooltip(trigger);
|
||||
const playground = trigger.closest('pre');
|
||||
return playground_text(playground, false);
|
||||
},
|
||||
});
|
||||
|
||||
Array.from(clipButtons).forEach(function(clipButton) {
|
||||
clipButton.addEventListener('mouseout', function(e) {
|
||||
hideTooltip(e.currentTarget);
|
||||
});
|
||||
});
|
||||
|
||||
clipboardSnippets.on('success', function(e) {
|
||||
e.clearSelection();
|
||||
showTooltip(e.trigger, 'Copied!');
|
||||
});
|
||||
|
||||
clipboardSnippets.on('error', function(e) {
|
||||
showTooltip(e.trigger, 'Clipboard error!');
|
||||
});
|
||||
})();
|
||||
|
||||
(function scrollToTop() {
|
||||
const menuTitle = document.querySelector('.menu-title');
|
||||
|
||||
menuTitle.addEventListener('click', function() {
|
||||
document.scrollingElement.scrollTo({ top: 0, behavior: 'smooth' });
|
||||
});
|
||||
})();
|
||||
|
||||
(function controllMenu() {
|
||||
const menu = document.getElementById('mdbook-menu-bar');
|
||||
|
||||
(function controllPosition() {
|
||||
let scrollTop = document.scrollingElement.scrollTop;
|
||||
let prevScrollTop = scrollTop;
|
||||
const minMenuY = -menu.clientHeight - 50;
|
||||
// When the script loads, the page can be at any scroll (e.g. if you refresh it).
|
||||
menu.style.top = scrollTop + 'px';
|
||||
// Same as parseInt(menu.style.top.slice(0, -2), but faster
|
||||
let topCache = menu.style.top.slice(0, -2);
|
||||
menu.classList.remove('sticky');
|
||||
let stickyCache = false; // Same as menu.classList.contains('sticky'), but faster
|
||||
document.addEventListener('scroll', function() {
|
||||
scrollTop = Math.max(document.scrollingElement.scrollTop, 0);
|
||||
// `null` means that it doesn't need to be updated
|
||||
let nextSticky = null;
|
||||
let nextTop = null;
|
||||
const scrollDown = scrollTop > prevScrollTop;
|
||||
const menuPosAbsoluteY = topCache - scrollTop;
|
||||
if (scrollDown) {
|
||||
nextSticky = false;
|
||||
if (menuPosAbsoluteY > 0) {
|
||||
nextTop = prevScrollTop;
|
||||
}
|
||||
} else {
|
||||
if (menuPosAbsoluteY > 0) {
|
||||
nextSticky = true;
|
||||
} else if (menuPosAbsoluteY < minMenuY) {
|
||||
nextTop = prevScrollTop + minMenuY;
|
||||
}
|
||||
}
|
||||
if (nextSticky === true && stickyCache === false) {
|
||||
menu.classList.add('sticky');
|
||||
stickyCache = true;
|
||||
} else if (nextSticky === false && stickyCache === true) {
|
||||
menu.classList.remove('sticky');
|
||||
stickyCache = false;
|
||||
}
|
||||
if (nextTop !== null) {
|
||||
menu.style.top = nextTop + 'px';
|
||||
topCache = nextTop;
|
||||
}
|
||||
prevScrollTop = scrollTop;
|
||||
}, { passive: true });
|
||||
})();
|
||||
(function controllBorder() {
|
||||
function updateBorder() {
|
||||
if (menu.offsetTop === 0) {
|
||||
menu.classList.remove('bordered');
|
||||
} else {
|
||||
menu.classList.add('bordered');
|
||||
}
|
||||
}
|
||||
updateBorder();
|
||||
document.addEventListener('scroll', updateBorder, { passive: true });
|
||||
})();
|
||||
})();
|
||||
@@ -1 +0,0 @@
|
||||
attribute = "buildbot"
|
||||
@@ -1,45 +0,0 @@
|
||||
{
|
||||
lib,
|
||||
nix,
|
||||
runCommand,
|
||||
}:
|
||||
let
|
||||
home-manager =
|
||||
with lib.fileset;
|
||||
toSource {
|
||||
root = ../.;
|
||||
fileset = (fileFilter (file: file.hasExt "nix") ../.);
|
||||
};
|
||||
parseLog = "$TMPDIR/nix-parse.log";
|
||||
in
|
||||
runCommand "nix-parse-${nix.name}"
|
||||
{
|
||||
nativeBuildInputs = [
|
||||
nix
|
||||
];
|
||||
}
|
||||
''
|
||||
export NIX_STORE_DIR=$TMPDIR/store
|
||||
export NIX_STATE_DIR=$TMPDIR/state
|
||||
nix-store --init
|
||||
|
||||
cd "${home-manager}"
|
||||
|
||||
# This will only show the first parse error, not all of them. That's fine, because
|
||||
# the other CI jobs will report in more detail. This job is about checking parsing
|
||||
# across different implementations / versions, not about providing the best DX.
|
||||
# Returning all parse errors requires significantly more resources.
|
||||
if ! find . -type f -iname '*.nix' | xargs -P $(nproc) nix-instantiate --parse 2> "${parseLog}" > /dev/null; then
|
||||
cat "${parseLog}" >&2
|
||||
echo "Parse failed in nix-instantiate." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if grep "warning" "${parseLog}"; then
|
||||
cat "${parseLog}" >&2
|
||||
echo "Failing due to warnings in stderr" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
touch $out
|
||||
''
|
||||
Vendored
+7
File diff suppressed because one or more lines are too long
@@ -0,0 +1,256 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html lang="en" class="light sidebar-visible" dir="ltr">
|
||||
<head>
|
||||
<!-- Book generated using mdBook -->
|
||||
<meta charset="UTF-8">
|
||||
<title>Contributing - Home Manager Manual</title>
|
||||
|
||||
|
||||
<!-- Custom HTML head -->
|
||||
|
||||
<meta name="description" content="">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
<link rel="icon" href="favicon-de23e50b.svg">
|
||||
<link rel="shortcut icon" href="favicon-8114d1fc.png">
|
||||
<link rel="stylesheet" href="css/variables-8adf115d.css">
|
||||
<link rel="stylesheet" href="css/general-e96d0476.css">
|
||||
<link rel="stylesheet" href="css/chrome-d279d366.css">
|
||||
<link rel="stylesheet" href="css/print-9e4910d8.css" media="print">
|
||||
|
||||
<!-- Fonts -->
|
||||
<link rel="stylesheet" href="fonts/fonts-9644e21d.css">
|
||||
|
||||
<!-- Highlight.js Stylesheets -->
|
||||
<link rel="stylesheet" id="mdbook-highlight-css" href="highlight-493f70e1.css">
|
||||
<link rel="stylesheet" id="mdbook-tomorrow-night-css" href="tomorrow-night-4c0ae647.css">
|
||||
<link rel="stylesheet" id="mdbook-ayu-highlight-css" href="ayu-highlight-3fdfc3ac.css">
|
||||
|
||||
<!-- Custom theme stylesheets -->
|
||||
|
||||
|
||||
<!-- Provide site root and default themes to javascript -->
|
||||
<script>
|
||||
const path_to_root = "";
|
||||
const default_light_theme = "light";
|
||||
const default_dark_theme = "navy";
|
||||
window.path_to_searchindex_js = "searchindex-542a1820.js";
|
||||
</script>
|
||||
<!-- Start loading toc.js asap -->
|
||||
<script src="toc-a22c24be.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="mdbook-help-container">
|
||||
<div id="mdbook-help-popup">
|
||||
<h2 class="mdbook-help-title">Keyboard shortcuts</h2>
|
||||
<div>
|
||||
<p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
|
||||
<p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
|
||||
<p>Press <kbd>?</kbd> to show this help</p>
|
||||
<p>Press <kbd>Esc</kbd> to hide this help</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="mdbook-body-container">
|
||||
<!-- Work around some values being stored in localStorage wrapped in quotes -->
|
||||
<script>
|
||||
try {
|
||||
let theme = localStorage.getItem('mdbook-theme');
|
||||
let sidebar = localStorage.getItem('mdbook-sidebar');
|
||||
|
||||
if (theme.startsWith('"') && theme.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
|
||||
}
|
||||
|
||||
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
|
||||
}
|
||||
} catch (e) { }
|
||||
</script>
|
||||
|
||||
<!-- Set the theme before any content is loaded, prevents flash -->
|
||||
<script>
|
||||
const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
|
||||
let theme;
|
||||
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
|
||||
if (theme === null || theme === undefined) { theme = default_theme; }
|
||||
const html = document.documentElement;
|
||||
html.classList.remove('light')
|
||||
html.classList.add(theme);
|
||||
html.classList.add("js");
|
||||
</script>
|
||||
|
||||
<input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
|
||||
|
||||
<!-- Hide / unhide sidebar before it is displayed -->
|
||||
<script>
|
||||
let sidebar = null;
|
||||
const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
|
||||
if (document.body.clientWidth >= 1080) {
|
||||
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
|
||||
sidebar = sidebar || 'visible';
|
||||
} else {
|
||||
sidebar = 'hidden';
|
||||
sidebar_toggle.checked = false;
|
||||
}
|
||||
if (sidebar === 'visible') {
|
||||
sidebar_toggle.checked = true;
|
||||
} else {
|
||||
html.classList.remove('sidebar-visible');
|
||||
}
|
||||
</script>
|
||||
|
||||
<nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
|
||||
<!-- populated by js -->
|
||||
<mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
|
||||
<noscript>
|
||||
<iframe class="sidebar-iframe-outer" src="toc.html"></iframe>
|
||||
</noscript>
|
||||
<div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
|
||||
<div class="sidebar-resize-indicator"></div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div id="mdbook-page-wrapper" class="page-wrapper">
|
||||
|
||||
<div class="page">
|
||||
<div id="mdbook-menu-bar-hover-placeholder"></div>
|
||||
<div id="mdbook-menu-bar" class="menu-bar sticky">
|
||||
<div class="left-buttons">
|
||||
<label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
|
||||
</label>
|
||||
<button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
|
||||
</button>
|
||||
<ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
|
||||
</ul>
|
||||
<button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<h1 class="menu-title">Home Manager Manual</h1>
|
||||
|
||||
<div class="right-buttons">
|
||||
<a href="print.html" title="Print this book" aria-label="Print this book">
|
||||
<span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
|
||||
</a>
|
||||
<a href="https://github.com/nix-community/home-manager" title="Git repository" aria-label="Git repository">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="mdbook-search-wrapper" class="hidden">
|
||||
<form id="mdbook-searchbar-outer" class="searchbar-outer">
|
||||
<div class="search-wrapper">
|
||||
<input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
|
||||
<div class="spinner-wrapper">
|
||||
<span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
|
||||
<div id="mdbook-searchresults-header" class="searchresults-header"></div>
|
||||
<ul id="mdbook-searchresults">
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
|
||||
<script>
|
||||
document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
|
||||
document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
|
||||
Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
|
||||
link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
|
||||
});
|
||||
</script>
|
||||
|
||||
<div id="mdbook-content" class="content">
|
||||
<main>
|
||||
<p><a id="ch-contributing"></a></p>
|
||||
<h1 id="contributing"><a class="header" href="#contributing">Contributing</a></h1>
|
||||
<p>Contributions to Home Manager are very welcome. To make the process as
|
||||
smooth as possible for both you and the Home Manager maintainers we
|
||||
provide some guidelines that we ask you to follow. See <a href="contributing/getting-started.html#sec-contrib-getting-started">Getting
|
||||
started</a> for information on how to set up
|
||||
a suitable development environment and <a href="contributing/guidelines.html#sec-guidelines">Guidelines</a> for
|
||||
the actual guidelines.</p>
|
||||
<p>This text is mainly directed at those who would like to make code
|
||||
contributions to Home Manager. If you just want to report a bug then
|
||||
first look among the already <a href="https://github.com/nix-community/home-manager/issues">open
|
||||
issues</a>, if you
|
||||
find one matching yours then feel free to comment on it to add any
|
||||
additional information you may have. If no matching issue exists then go
|
||||
to the <a href="https://github.com/nix-community/home-manager/issues/new">new
|
||||
issue</a> page
|
||||
and write a description of your problem. Include as much information as
|
||||
you can, ideally also include relevant excerpts from your Home Manager
|
||||
configuration.</p>
|
||||
|
||||
</main>
|
||||
|
||||
<nav class="nav-wrapper" aria-label="Page navigation">
|
||||
<!-- Mobile navigation buttons -->
|
||||
<a rel="prev" href="writing-modules/types.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
|
||||
</a>
|
||||
|
||||
<a rel="next prefetch" href="contributing/getting-started.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
|
||||
</a>
|
||||
|
||||
<div style="clear: both"></div>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<nav class="nav-wide-wrapper" aria-label="Page navigation">
|
||||
<a rel="prev" href="writing-modules/types.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
|
||||
</a>
|
||||
|
||||
<a rel="next prefetch" href="contributing/getting-started.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
|
||||
</a>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
|
||||
<template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
|
||||
<template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
|
||||
<template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
|
||||
<template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
|
||||
<template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
window.playground_copyable = true;
|
||||
</script>
|
||||
|
||||
|
||||
<script src="elasticlunr-ef4e11c1.min.js"></script>
|
||||
<script src="mark-09e88c2c.min.js"></script>
|
||||
<script src="searcher-09f2665d.js"></script>
|
||||
|
||||
<script src="clipboard-1626706a.min.js"></script>
|
||||
<script src="highlight-abc7f01d.js"></script>
|
||||
<script src="book-609e4cb8.js"></script>
|
||||
|
||||
<!-- Custom JS scripts -->
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,272 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html lang="en" class="light sidebar-visible" dir="ltr">
|
||||
<head>
|
||||
<!-- Book generated using mdBook -->
|
||||
<meta charset="UTF-8">
|
||||
<title>Getting started - Home Manager Manual</title>
|
||||
|
||||
|
||||
<!-- Custom HTML head -->
|
||||
|
||||
<meta name="description" content="">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
<link rel="icon" href="../favicon-de23e50b.svg">
|
||||
<link rel="shortcut icon" href="../favicon-8114d1fc.png">
|
||||
<link rel="stylesheet" href="../css/variables-8adf115d.css">
|
||||
<link rel="stylesheet" href="../css/general-e96d0476.css">
|
||||
<link rel="stylesheet" href="../css/chrome-d279d366.css">
|
||||
<link rel="stylesheet" href="../css/print-9e4910d8.css" media="print">
|
||||
|
||||
<!-- Fonts -->
|
||||
<link rel="stylesheet" href="../fonts/fonts-9644e21d.css">
|
||||
|
||||
<!-- Highlight.js Stylesheets -->
|
||||
<link rel="stylesheet" id="mdbook-highlight-css" href="../highlight-493f70e1.css">
|
||||
<link rel="stylesheet" id="mdbook-tomorrow-night-css" href="../tomorrow-night-4c0ae647.css">
|
||||
<link rel="stylesheet" id="mdbook-ayu-highlight-css" href="../ayu-highlight-3fdfc3ac.css">
|
||||
|
||||
<!-- Custom theme stylesheets -->
|
||||
|
||||
|
||||
<!-- Provide site root and default themes to javascript -->
|
||||
<script>
|
||||
const path_to_root = "../";
|
||||
const default_light_theme = "light";
|
||||
const default_dark_theme = "navy";
|
||||
window.path_to_searchindex_js = "../searchindex-542a1820.js";
|
||||
</script>
|
||||
<!-- Start loading toc.js asap -->
|
||||
<script src="../toc-a22c24be.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="mdbook-help-container">
|
||||
<div id="mdbook-help-popup">
|
||||
<h2 class="mdbook-help-title">Keyboard shortcuts</h2>
|
||||
<div>
|
||||
<p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
|
||||
<p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
|
||||
<p>Press <kbd>?</kbd> to show this help</p>
|
||||
<p>Press <kbd>Esc</kbd> to hide this help</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="mdbook-body-container">
|
||||
<!-- Work around some values being stored in localStorage wrapped in quotes -->
|
||||
<script>
|
||||
try {
|
||||
let theme = localStorage.getItem('mdbook-theme');
|
||||
let sidebar = localStorage.getItem('mdbook-sidebar');
|
||||
|
||||
if (theme.startsWith('"') && theme.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
|
||||
}
|
||||
|
||||
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
|
||||
}
|
||||
} catch (e) { }
|
||||
</script>
|
||||
|
||||
<!-- Set the theme before any content is loaded, prevents flash -->
|
||||
<script>
|
||||
const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
|
||||
let theme;
|
||||
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
|
||||
if (theme === null || theme === undefined) { theme = default_theme; }
|
||||
const html = document.documentElement;
|
||||
html.classList.remove('light')
|
||||
html.classList.add(theme);
|
||||
html.classList.add("js");
|
||||
</script>
|
||||
|
||||
<input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
|
||||
|
||||
<!-- Hide / unhide sidebar before it is displayed -->
|
||||
<script>
|
||||
let sidebar = null;
|
||||
const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
|
||||
if (document.body.clientWidth >= 1080) {
|
||||
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
|
||||
sidebar = sidebar || 'visible';
|
||||
} else {
|
||||
sidebar = 'hidden';
|
||||
sidebar_toggle.checked = false;
|
||||
}
|
||||
if (sidebar === 'visible') {
|
||||
sidebar_toggle.checked = true;
|
||||
} else {
|
||||
html.classList.remove('sidebar-visible');
|
||||
}
|
||||
</script>
|
||||
|
||||
<nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
|
||||
<!-- populated by js -->
|
||||
<mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
|
||||
<noscript>
|
||||
<iframe class="sidebar-iframe-outer" src="../toc.html"></iframe>
|
||||
</noscript>
|
||||
<div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
|
||||
<div class="sidebar-resize-indicator"></div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div id="mdbook-page-wrapper" class="page-wrapper">
|
||||
|
||||
<div class="page">
|
||||
<div id="mdbook-menu-bar-hover-placeholder"></div>
|
||||
<div id="mdbook-menu-bar" class="menu-bar sticky">
|
||||
<div class="left-buttons">
|
||||
<label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
|
||||
</label>
|
||||
<button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
|
||||
</button>
|
||||
<ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
|
||||
</ul>
|
||||
<button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<h1 class="menu-title">Home Manager Manual</h1>
|
||||
|
||||
<div class="right-buttons">
|
||||
<a href="../print.html" title="Print this book" aria-label="Print this book">
|
||||
<span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
|
||||
</a>
|
||||
<a href="https://github.com/nix-community/home-manager" title="Git repository" aria-label="Git repository">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="mdbook-search-wrapper" class="hidden">
|
||||
<form id="mdbook-searchbar-outer" class="searchbar-outer">
|
||||
<div class="search-wrapper">
|
||||
<input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
|
||||
<div class="spinner-wrapper">
|
||||
<span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
|
||||
<div id="mdbook-searchresults-header" class="searchresults-header"></div>
|
||||
<ul id="mdbook-searchresults">
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
|
||||
<script>
|
||||
document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
|
||||
document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
|
||||
Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
|
||||
link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
|
||||
});
|
||||
</script>
|
||||
|
||||
<div id="mdbook-content" class="content">
|
||||
<main>
|
||||
<p><a id="sec-contrib-getting-started"></a></p>
|
||||
<h1 id="getting-started"><a class="header" href="#getting-started">Getting started</a></h1>
|
||||
<p>If you have not previously forked Home Manager then you need to do that
|
||||
first. Have a look at GitHub’s <a href="https://help.github.com/articles/fork-a-repo/">Fork a
|
||||
repo</a> for instructions on
|
||||
how to do this.</p>
|
||||
<p>Once you have a fork of Home Manager you should create a branch starting
|
||||
at the most recent <code>master</code> branch. Give your branch a reasonably
|
||||
descriptive name. Commit your changes to this branch and when you are
|
||||
happy with the result and it fulfills <a href="guidelines.html#sec-guidelines">Guidelines</a> then
|
||||
push the branch to GitHub and <a href="https://help.github.com/articles/creating-a-pull-request/">create a pull
|
||||
request</a>.</p>
|
||||
<p>Assuming your clone is at <code>$HOME/devel/home-manager</code> then you can make
|
||||
the <code>home-manager</code> command use it by either</p>
|
||||
<ol>
|
||||
<li>
|
||||
<p>overriding the default path by using the <code>-I</code> command line option:</p>
|
||||
<pre><code class="language-shell">$ home-manager -I home-manager=$HOME/devel/home-manager
|
||||
</code></pre>
|
||||
<p>or, if using <a href="../nix-flakes/standalone.html#sec-flakes-standalone">flakes</a>:</p>
|
||||
<pre><code class="language-shell">$ home-manager --override-input home-manager ~/devel/home-manager
|
||||
</code></pre>
|
||||
<p>or</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>changing the default path by ensuring your configuration includes</p>
|
||||
<pre><code class="language-nix">programs.home-manager.enable = true;
|
||||
programs.home-manager.path = "$HOME/devel/home-manager";
|
||||
</code></pre>
|
||||
<p>and running <code>home-manager switch</code> to activate the change.
|
||||
Afterwards, <code>home-manager build</code> and <code>home-manager switch</code> will use
|
||||
your cloned repository.</p>
|
||||
</li>
|
||||
</ol>
|
||||
<p>The first option is good if you only temporarily want to use your clone.</p>
|
||||
|
||||
</main>
|
||||
|
||||
<nav class="nav-wrapper" aria-label="Page navigation">
|
||||
<!-- Mobile navigation buttons -->
|
||||
<a rel="prev" href="../contributing.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
|
||||
</a>
|
||||
|
||||
<a rel="next prefetch" href="../contributing/guidelines.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
|
||||
</a>
|
||||
|
||||
<div style="clear: both"></div>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<nav class="nav-wide-wrapper" aria-label="Page navigation">
|
||||
<a rel="prev" href="../contributing.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
|
||||
</a>
|
||||
|
||||
<a rel="next prefetch" href="../contributing/guidelines.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
|
||||
</a>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
|
||||
<template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
|
||||
<template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
|
||||
<template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
|
||||
<template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
|
||||
<template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
window.playground_copyable = true;
|
||||
</script>
|
||||
|
||||
|
||||
<script src="../elasticlunr-ef4e11c1.min.js"></script>
|
||||
<script src="../mark-09e88c2c.min.js"></script>
|
||||
<script src="../searcher-09f2665d.js"></script>
|
||||
|
||||
<script src="../clipboard-1626706a.min.js"></script>
|
||||
<script src="../highlight-abc7f01d.js"></script>
|
||||
<script src="../book-609e4cb8.js"></script>
|
||||
|
||||
<!-- Custom JS scripts -->
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,479 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html lang="en" class="light sidebar-visible" dir="ltr">
|
||||
<head>
|
||||
<!-- Book generated using mdBook -->
|
||||
<meta charset="UTF-8">
|
||||
<title>Guidelines - Home Manager Manual</title>
|
||||
|
||||
|
||||
<!-- Custom HTML head -->
|
||||
|
||||
<meta name="description" content="">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
<link rel="icon" href="../favicon-de23e50b.svg">
|
||||
<link rel="shortcut icon" href="../favicon-8114d1fc.png">
|
||||
<link rel="stylesheet" href="../css/variables-8adf115d.css">
|
||||
<link rel="stylesheet" href="../css/general-e96d0476.css">
|
||||
<link rel="stylesheet" href="../css/chrome-d279d366.css">
|
||||
<link rel="stylesheet" href="../css/print-9e4910d8.css" media="print">
|
||||
|
||||
<!-- Fonts -->
|
||||
<link rel="stylesheet" href="../fonts/fonts-9644e21d.css">
|
||||
|
||||
<!-- Highlight.js Stylesheets -->
|
||||
<link rel="stylesheet" id="mdbook-highlight-css" href="../highlight-493f70e1.css">
|
||||
<link rel="stylesheet" id="mdbook-tomorrow-night-css" href="../tomorrow-night-4c0ae647.css">
|
||||
<link rel="stylesheet" id="mdbook-ayu-highlight-css" href="../ayu-highlight-3fdfc3ac.css">
|
||||
|
||||
<!-- Custom theme stylesheets -->
|
||||
|
||||
|
||||
<!-- Provide site root and default themes to javascript -->
|
||||
<script>
|
||||
const path_to_root = "../";
|
||||
const default_light_theme = "light";
|
||||
const default_dark_theme = "navy";
|
||||
window.path_to_searchindex_js = "../searchindex-542a1820.js";
|
||||
</script>
|
||||
<!-- Start loading toc.js asap -->
|
||||
<script src="../toc-a22c24be.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="mdbook-help-container">
|
||||
<div id="mdbook-help-popup">
|
||||
<h2 class="mdbook-help-title">Keyboard shortcuts</h2>
|
||||
<div>
|
||||
<p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
|
||||
<p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
|
||||
<p>Press <kbd>?</kbd> to show this help</p>
|
||||
<p>Press <kbd>Esc</kbd> to hide this help</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="mdbook-body-container">
|
||||
<!-- Work around some values being stored in localStorage wrapped in quotes -->
|
||||
<script>
|
||||
try {
|
||||
let theme = localStorage.getItem('mdbook-theme');
|
||||
let sidebar = localStorage.getItem('mdbook-sidebar');
|
||||
|
||||
if (theme.startsWith('"') && theme.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
|
||||
}
|
||||
|
||||
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
|
||||
}
|
||||
} catch (e) { }
|
||||
</script>
|
||||
|
||||
<!-- Set the theme before any content is loaded, prevents flash -->
|
||||
<script>
|
||||
const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
|
||||
let theme;
|
||||
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
|
||||
if (theme === null || theme === undefined) { theme = default_theme; }
|
||||
const html = document.documentElement;
|
||||
html.classList.remove('light')
|
||||
html.classList.add(theme);
|
||||
html.classList.add("js");
|
||||
</script>
|
||||
|
||||
<input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
|
||||
|
||||
<!-- Hide / unhide sidebar before it is displayed -->
|
||||
<script>
|
||||
let sidebar = null;
|
||||
const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
|
||||
if (document.body.clientWidth >= 1080) {
|
||||
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
|
||||
sidebar = sidebar || 'visible';
|
||||
} else {
|
||||
sidebar = 'hidden';
|
||||
sidebar_toggle.checked = false;
|
||||
}
|
||||
if (sidebar === 'visible') {
|
||||
sidebar_toggle.checked = true;
|
||||
} else {
|
||||
html.classList.remove('sidebar-visible');
|
||||
}
|
||||
</script>
|
||||
|
||||
<nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
|
||||
<!-- populated by js -->
|
||||
<mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
|
||||
<noscript>
|
||||
<iframe class="sidebar-iframe-outer" src="../toc.html"></iframe>
|
||||
</noscript>
|
||||
<div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
|
||||
<div class="sidebar-resize-indicator"></div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div id="mdbook-page-wrapper" class="page-wrapper">
|
||||
|
||||
<div class="page">
|
||||
<div id="mdbook-menu-bar-hover-placeholder"></div>
|
||||
<div id="mdbook-menu-bar" class="menu-bar sticky">
|
||||
<div class="left-buttons">
|
||||
<label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
|
||||
</label>
|
||||
<button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
|
||||
</button>
|
||||
<ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
|
||||
</ul>
|
||||
<button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<h1 class="menu-title">Home Manager Manual</h1>
|
||||
|
||||
<div class="right-buttons">
|
||||
<a href="../print.html" title="Print this book" aria-label="Print this book">
|
||||
<span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
|
||||
</a>
|
||||
<a href="https://github.com/nix-community/home-manager" title="Git repository" aria-label="Git repository">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="mdbook-search-wrapper" class="hidden">
|
||||
<form id="mdbook-searchbar-outer" class="searchbar-outer">
|
||||
<div class="search-wrapper">
|
||||
<input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
|
||||
<div class="spinner-wrapper">
|
||||
<span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
|
||||
<div id="mdbook-searchresults-header" class="searchresults-header"></div>
|
||||
<ul id="mdbook-searchresults">
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
|
||||
<script>
|
||||
document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
|
||||
document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
|
||||
Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
|
||||
link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
|
||||
});
|
||||
</script>
|
||||
|
||||
<div id="mdbook-content" class="content">
|
||||
<main>
|
||||
<p><a id="sec-guidelines"></a></p>
|
||||
<h1 id="guidelines"><a class="header" href="#guidelines">Guidelines</a></h1>
|
||||
<p>If your contribution satisfy the following rules then there is a good
|
||||
chance it will be merged without too much trouble. The rules are
|
||||
enforced by the Home Manager maintainers and to a lesser extent the Home
|
||||
Manager CI system.</p>
|
||||
<p>If you are uncertain how these rules affect the change you would like to
|
||||
make then feel free to start a discussion in the
|
||||
<a href="https://webchat.oftc.net/?channels=home-manager">#home-manager</a> IRC
|
||||
channel, ideally before you start developing.</p>
|
||||
<p><a id="sec-guidelines-back-compat"></a></p>
|
||||
<h2 id="maintain-backward-compatibility"><a class="header" href="#maintain-backward-compatibility">Maintain backward compatibility</a></h2>
|
||||
<p>Your contribution should not cause another user’s existing configuration
|
||||
to break unless there is a very good reason and the change should be
|
||||
announced to the user through an
|
||||
<a href="https://nixos.org/manual/nixos/stable/index.html#sec-assertions">assertion</a>
|
||||
or similar.</p>
|
||||
<p>Remember that Home Manager is used in many different environments and
|
||||
you should consider how your change may effect others. For example,</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>Does your change work for people that do not use NixOS? Consider
|
||||
other GNU/Linux distributions and macOS.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Does your change work for people whose configuration is built on one
|
||||
system and deployed on another system?</p>
|
||||
</li>
|
||||
</ul>
|
||||
<p><a id="sec-guidelines-forward-compat"></a></p>
|
||||
<h2 id="keep-forward-compatibility-in-mind"><a class="header" href="#keep-forward-compatibility-in-mind">Keep forward compatibility in mind</a></h2>
|
||||
<p>The master branch of Home Manager tracks the unstable channel of
|
||||
Nixpkgs, which may update package versions at any time. It is therefore
|
||||
important to consider how a package update may affect your code and try
|
||||
to reduce the risk of breakage.</p>
|
||||
<p>The most effective way to reduce this risk is to follow the advice in
|
||||
<a href="#sec-guidelines-valuable-options">Add only valuable options</a>.</p>
|
||||
<p><a id="sec-guidelines-valuable-options"></a></p>
|
||||
<h2 id="add-only-valuable-options"><a class="header" href="#add-only-valuable-options">Add only valuable options</a></h2>
|
||||
<p>When creating a new module it is tempting to include every option
|
||||
supported by the software. This is <em>strongly</em> discouraged. Providing
|
||||
many options increases maintenance burden and risk of breakage
|
||||
considerably. This is why only the most <a href="https://github.com/NixOS/rfcs/blob/master/rfcs/0042-config-option.md#valuable-options">important software
|
||||
options</a>
|
||||
should be modeled explicitly. Less important options should be
|
||||
expressible through an <code>extraConfig</code> escape hatch.</p>
|
||||
<p>A good rule of thumb for the first implementation of a module is to only
|
||||
add explicit options for those settings that absolutely must be set for
|
||||
the software to function correctly. It follows that a module for
|
||||
software that provides sensible default values for all settings would
|
||||
require no explicit options at all.</p>
|
||||
<p>If the software uses a structured configuration format like a JSON,
|
||||
YAML, INI, TOML, or even a plain list of key/value pairs then consider
|
||||
using a <code>settings</code> option as described in <a href="https://github.com/NixOS/rfcs/blob/master/rfcs/0042-config-option.md">Nix RFC
|
||||
42</a>.</p>
|
||||
<p>These guidelines describe the minimum option design requirements. Before
|
||||
submitting a module, compare it against the upstream documentation or
|
||||
source code and verify that the generated files, services, environment
|
||||
variables, and command line arguments all match the upstream behavior
|
||||
you intend to expose.</p>
|
||||
<p>If a module installs a package, try to make the package option nullable,
|
||||
for example</p>
|
||||
<pre><code class="language-nix">package = lib.mkPackageOption pkgs "xdg-terminal-exec" { nullable = true; };
|
||||
</code></pre>
|
||||
<p>This lets users keep installation outside Home Manager, for example via
|
||||
<code>apt</code> or because the program is built into macOS, while still using the
|
||||
module for configuration. Keeping the package non-nullable is fine when
|
||||
the enabled behavior structurally requires the executable or when
|
||||
package-less support would make the module significantly more complex.</p>
|
||||
<p>Avoid generating files for empty settings, null packages, or optional
|
||||
features that are not configured.</p>
|
||||
<p>If upstream does not use XDG paths by default but supports changing the
|
||||
configuration location with an environment variable, for example
|
||||
<code>FOO_HOME</code>, expose a <code>configDir</code> option and use it to respect
|
||||
<code>home.preferXdgDirectories</code>.</p>
|
||||
<p><a id="sec-guidelines-add-tests"></a></p>
|
||||
<h2 id="add-relevant-tests"><a class="header" href="#add-relevant-tests">Add relevant tests</a></h2>
|
||||
<p>If at all possible, make sure to add new tests and expand existing tests
|
||||
so that your change will keep working in the future. See
|
||||
<a href="tests.html#sec-tests">Tests</a> for more information about the Home Manager test
|
||||
suite.</p>
|
||||
<p>All contributed code <em>must</em> pass the test suite.</p>
|
||||
<p><a id="sec-guidelines-module-maintainer"></a></p>
|
||||
<h2 id="add-relevant-documentation"><a class="header" href="#add-relevant-documentation">Add relevant documentation</a></h2>
|
||||
<p>Many code changes require changing the documentation as well. The
|
||||
documentation is written in
|
||||
<a href="https://nixos.org/manual/nixpkgs/unstable/#sec-contributing-markup">Nixpkgs-flavoured Markdown</a>.
|
||||
All text is hosted in Home Manager’s Git repository.</p>
|
||||
<p>The HTML version of the manual containing both the module option
|
||||
descriptions and the documentation of Home Manager can be generated and
|
||||
opened by typing the following in a shell within a clone of the Home
|
||||
Manager Git repository:</p>
|
||||
<pre><code class="language-shell">$ nix-build -A docs.html
|
||||
$ xdg-open ./result/share/doc/home-manager/index.html
|
||||
</code></pre>
|
||||
<p>When you have made changes to a module, it is a good idea to check that
|
||||
the man page version of the module options looks good:</p>
|
||||
<pre><code class="language-shell">$ nix-build -A docs.manPages
|
||||
$ man ./result/share/man/man5/home-configuration.nix.5
|
||||
</code></pre>
|
||||
<p><a id="sec-module-auto-importing"></a></p>
|
||||
<h2 id="module-auto-importing"><a class="header" href="#module-auto-importing">Module Auto-importing</a></h2>
|
||||
<p>Home Manager automatically imports all modules from the <code>modules/programs/</code> and
|
||||
<code>modules/services/</code> directories. This auto-importing behavior follows these
|
||||
rules:</p>
|
||||
<ul>
|
||||
<li><strong>Nix files</strong>: All <code>.nix</code> files in these directories are automatically
|
||||
imported</li>
|
||||
<li><strong>Directories</strong>: All subdirectories are automatically imported (typically
|
||||
containing a <code>default.nix</code> file)</li>
|
||||
<li><strong>Exclusions</strong>: Files and directories starting with an underscore (<code>_</code>) are
|
||||
excluded from auto-importing</li>
|
||||
</ul>
|
||||
<p>This allows for flexible module organization:</p>
|
||||
<pre><code>modules/programs/
|
||||
├── git.nix # Single-file module (imported)
|
||||
├── firefox/ # Multi-file module (imported)
|
||||
│ ├── default.nix
|
||||
│ └── addons.nix
|
||||
├── _experimental.nix # Excluded (starts with _)
|
||||
└── _wip/ # Excluded directory (starts with _)
|
||||
└── newfeature.nix
|
||||
</code></pre>
|
||||
<p>When adding a new module, simply place it in the appropriate directory
|
||||
(<code>programs/</code> for user programs, <code>services/</code> for user services) and it will be
|
||||
automatically discovered and included in the Home Manager module system.</p>
|
||||
<p><a id="_add_yourself_as_a_module_maintainer"></a></p>
|
||||
<h2 id="add-yourself-as-a-module-maintainer"><a class="header" href="#add-yourself-as-a-module-maintainer">Add yourself as a module maintainer</a></h2>
|
||||
<p>Every new module <em>must</em> include a named maintainer using the
|
||||
<code>meta.maintainers</code> attribute. If you are a user of a module that
|
||||
currently lacks a maintainer then please consider adopting it.</p>
|
||||
<p>If you are present in the nixpkgs maintainer list then you can use that
|
||||
entry. If you are not then you can add yourself to
|
||||
<code>modules/lib/maintainers.nix</code> in the Home Manager project.</p>
|
||||
<p>As a maintainer you are expected to respond to issues and
|
||||
pull-requests associated with your module.</p>
|
||||
<p>Maintainers are encouraged to join the IRC or Matrix channel and
|
||||
participate when they have opportunity.</p>
|
||||
<p><a id="sec-guidelines-code-style"></a></p>
|
||||
<h2 id="format-your-code"><a class="header" href="#format-your-code">Format your code</a></h2>
|
||||
<p>Make sure your code is formatted as described in <a href="#sec-code-style">Code
|
||||
Style</a>. To maintain consistency throughout the project
|
||||
you are encouraged to browse through existing code and adopt its style
|
||||
also in new code.</p>
|
||||
<p><a id="sec-guidelines-commit-message-style"></a></p>
|
||||
<h2 id="format-your-commit-messages"><a class="header" href="#format-your-commit-messages">Format your commit messages</a></h2>
|
||||
<p>Similar to <a href="#sec-guidelines-code-style">Format your code</a> we encourage a
|
||||
consistent commit message format as described in
|
||||
<a href="#sec-commit-style">Commits</a>.</p>
|
||||
<p><a id="sec-guidelines-news-style"></a></p>
|
||||
<h2 id="format-your-news-entries"><a class="header" href="#format-your-news-entries">Format your news entries</a></h2>
|
||||
<p>If your contribution includes a change that should be communicated to
|
||||
users of Home Manager then you can add a news entry. The entry must be
|
||||
formatted as described in <a href="news.html#sec-news">News</a>.</p>
|
||||
<p>When new modules are added a news entry should be included.</p>
|
||||
<p>News entries and release notes serve different purposes. Release notes
|
||||
should be updated separately when a change affects users migrating
|
||||
between stable releases, such as state version default changes, required
|
||||
migration steps, or broad behavior changes. See
|
||||
<a href="release-notes.html#sec-contributing-release-notes">Release Notes</a> and <a href="news.html#sec-news">News</a>
|
||||
for more details.</p>
|
||||
<p><a id="sec-guidelines-conditional-modules"></a></p>
|
||||
<h2 id="use-conditional-modules-and-news"><a class="header" href="#use-conditional-modules-and-news">Use conditional modules and news</a></h2>
|
||||
<p>Home Manager includes a number of modules that are only usable on some
|
||||
of the supported platforms. The most common example of platform specific
|
||||
modules are those that define systemd user services, which only works on
|
||||
Linux systems.</p>
|
||||
<p>If you add a module that is platform specific then make sure the module
|
||||
guards platform-specific configuration with an appropriate condition, for
|
||||
example <code>pkgs.stdenv.hostPlatform.isLinux</code> or
|
||||
<code>pkgs.stdenv.hostPlatform.isDarwin</code>. Modules in <code>modules/programs/</code> and
|
||||
<code>modules/services/</code> are auto-imported, so the platform condition should live
|
||||
in the module behavior and in any platform-specific tests rather than in a
|
||||
separate module discovery call.</p>
|
||||
<p>Similarly, if you are adding a news entry then it should be shown only
|
||||
to users that may find it relevant, see <a href="news.html#sec-news">News</a> for a
|
||||
description of conditional news.</p>
|
||||
<p><a id="sec-guidelines-licensing"></a></p>
|
||||
<h2 id="mind-the-license"><a class="header" href="#mind-the-license">Mind the license</a></h2>
|
||||
<p>The Home Manager project is covered by the MIT license and we can only
|
||||
accept contributions that fall under this license, or are licensed in a
|
||||
compatible way. When you contribute self written code and documentation
|
||||
it is assumed that you are doing so under the MIT license.</p>
|
||||
<p>A potential gotcha with respect to licensing are option descriptions.
|
||||
Often it is convenient to copy from the upstream software documentation.
|
||||
When this is done it is important to verify that the license of the
|
||||
upstream documentation allows redistribution under the terms of the MIT
|
||||
license.</p>
|
||||
<p><a id="sec-commit-style"></a></p>
|
||||
<h2 id="commits"><a class="header" href="#commits">Commits</a></h2>
|
||||
<p>The commits in your pull request should be reasonably self-contained,
|
||||
that is, each commit should make sense in isolation. In particular, you
|
||||
will be asked to amend any commit that introduces syntax errors or
|
||||
similar problems even if they are fixed in a later commit.</p>
|
||||
<p>Keep commits atomic and separated by concern. For example, a new
|
||||
maintainer entry should be a separate first commit, and a shared module
|
||||
should be committed separately from integrations in existing modules.
|
||||
Pull requests should not include merge commits or fixup commits.</p>
|
||||
<p>The commit messages should follow the <a href="https://chris.beams.io/posts/git-commit/#seven-rules">seven
|
||||
rules</a>, except for
|
||||
"Capitalize the subject line". We also ask you to include the affected
|
||||
code component or module in the first line. That is, a commit message
|
||||
should follow the template</p>
|
||||
<pre><code>{component}: {description}
|
||||
|
||||
{long description}
|
||||
</code></pre>
|
||||
<p>where <code>{component}</code> refers to the code component (or module) your change
|
||||
affects, <code>{description}</code> is a very brief description of your change, and
|
||||
<code>{long description}</code> is an optional clarifying description. As a rare
|
||||
exception, if there is no clear component, or your change affects many
|
||||
components, then the <code>{component}</code> part is optional. See
|
||||
<a href="#ex-commit-message">example_title</a> for a commit message that fulfills
|
||||
these requirements.</p>
|
||||
<p><a id="ex-commit-message"></a></p>
|
||||
<h2 id="example-commit"><a class="header" href="#example-commit">Example commit</a></h2>
|
||||
<p>The commit
|
||||
<a href="https://github.com/nix-community/home-manager/commit/69f8e47e9e74c8d3d060ca22e18246b7f7d988ef">69f8e47e9e74c8d3d060ca22e18246b7f7d988ef</a>
|
||||
contains the commit message</p>
|
||||
<pre><code>
|
||||
starship: allow running in Emacs if vterm is used
|
||||
|
||||
The vterm buffer is backed by libvterm and can handle Starship prompts
|
||||
without issues.
|
||||
</code></pre>
|
||||
<p>which ticks all the boxes necessary to be accepted in Home Manager.</p>
|
||||
<p>Finally, when adding a new module, say <code>programs/foo.nix</code>, we use the
|
||||
fixed commit format <code>foo: add module</code>. You can, of course, still include
|
||||
a long description if you wish.</p>
|
||||
<p><a id="sec-code-style"></a></p>
|
||||
<h2 id="code-style"><a class="header" href="#code-style">Code Style</a></h2>
|
||||
<p>The code in Home Manager is formatted by the <a href="https://treefmt.com">treefmt</a> tool
|
||||
and the formatting is checked in the pull request tests. Run <code>nix fmt</code> or
|
||||
<code>treefmt</code> (with required formatters which can be found in <code>treefmt.toml</code> in your
|
||||
<code>$PATH</code>) inside the project repository before submitting your pull request.</p>
|
||||
<p>Keep lines at a reasonable width, ideally 80 characters or less. This
|
||||
also applies to string literals.</p>
|
||||
<p>We prefer <code>lowerCamelCase</code> for variable and attribute names with the
|
||||
accepted exception of variables directly referencing packages in Nixpkgs
|
||||
which use a hyphenated style. For example, the Home Manager option
|
||||
<code>services.gpg-agent.enableSshSupport</code> references the <code>gpg-agent</code> package
|
||||
in Nixpkgs.</p>
|
||||
|
||||
</main>
|
||||
|
||||
<nav class="nav-wrapper" aria-label="Page navigation">
|
||||
<!-- Mobile navigation buttons -->
|
||||
<a rel="prev" href="../contributing/getting-started.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
|
||||
</a>
|
||||
|
||||
<a rel="next prefetch" href="../contributing/release-notes.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
|
||||
</a>
|
||||
|
||||
<div style="clear: both"></div>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<nav class="nav-wide-wrapper" aria-label="Page navigation">
|
||||
<a rel="prev" href="../contributing/getting-started.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
|
||||
</a>
|
||||
|
||||
<a rel="next prefetch" href="../contributing/release-notes.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
|
||||
</a>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
|
||||
<template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
|
||||
<template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
|
||||
<template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
|
||||
<template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
|
||||
<template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
window.playground_copyable = true;
|
||||
</script>
|
||||
|
||||
|
||||
<script src="../elasticlunr-ef4e11c1.min.js"></script>
|
||||
<script src="../mark-09e88c2c.min.js"></script>
|
||||
<script src="../searcher-09f2665d.js"></script>
|
||||
|
||||
<script src="../clipboard-1626706a.min.js"></script>
|
||||
<script src="../highlight-abc7f01d.js"></script>
|
||||
<script src="../book-609e4cb8.js"></script>
|
||||
|
||||
<!-- Custom JS scripts -->
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,312 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html lang="en" class="light sidebar-visible" dir="ltr">
|
||||
<head>
|
||||
<!-- Book generated using mdBook -->
|
||||
<meta charset="UTF-8">
|
||||
<title>News - Home Manager Manual</title>
|
||||
|
||||
|
||||
<!-- Custom HTML head -->
|
||||
|
||||
<meta name="description" content="">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
<link rel="icon" href="../favicon-de23e50b.svg">
|
||||
<link rel="shortcut icon" href="../favicon-8114d1fc.png">
|
||||
<link rel="stylesheet" href="../css/variables-8adf115d.css">
|
||||
<link rel="stylesheet" href="../css/general-e96d0476.css">
|
||||
<link rel="stylesheet" href="../css/chrome-d279d366.css">
|
||||
<link rel="stylesheet" href="../css/print-9e4910d8.css" media="print">
|
||||
|
||||
<!-- Fonts -->
|
||||
<link rel="stylesheet" href="../fonts/fonts-9644e21d.css">
|
||||
|
||||
<!-- Highlight.js Stylesheets -->
|
||||
<link rel="stylesheet" id="mdbook-highlight-css" href="../highlight-493f70e1.css">
|
||||
<link rel="stylesheet" id="mdbook-tomorrow-night-css" href="../tomorrow-night-4c0ae647.css">
|
||||
<link rel="stylesheet" id="mdbook-ayu-highlight-css" href="../ayu-highlight-3fdfc3ac.css">
|
||||
|
||||
<!-- Custom theme stylesheets -->
|
||||
|
||||
|
||||
<!-- Provide site root and default themes to javascript -->
|
||||
<script>
|
||||
const path_to_root = "../";
|
||||
const default_light_theme = "light";
|
||||
const default_dark_theme = "navy";
|
||||
window.path_to_searchindex_js = "../searchindex-542a1820.js";
|
||||
</script>
|
||||
<!-- Start loading toc.js asap -->
|
||||
<script src="../toc-a22c24be.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="mdbook-help-container">
|
||||
<div id="mdbook-help-popup">
|
||||
<h2 class="mdbook-help-title">Keyboard shortcuts</h2>
|
||||
<div>
|
||||
<p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
|
||||
<p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
|
||||
<p>Press <kbd>?</kbd> to show this help</p>
|
||||
<p>Press <kbd>Esc</kbd> to hide this help</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="mdbook-body-container">
|
||||
<!-- Work around some values being stored in localStorage wrapped in quotes -->
|
||||
<script>
|
||||
try {
|
||||
let theme = localStorage.getItem('mdbook-theme');
|
||||
let sidebar = localStorage.getItem('mdbook-sidebar');
|
||||
|
||||
if (theme.startsWith('"') && theme.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
|
||||
}
|
||||
|
||||
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
|
||||
}
|
||||
} catch (e) { }
|
||||
</script>
|
||||
|
||||
<!-- Set the theme before any content is loaded, prevents flash -->
|
||||
<script>
|
||||
const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
|
||||
let theme;
|
||||
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
|
||||
if (theme === null || theme === undefined) { theme = default_theme; }
|
||||
const html = document.documentElement;
|
||||
html.classList.remove('light')
|
||||
html.classList.add(theme);
|
||||
html.classList.add("js");
|
||||
</script>
|
||||
|
||||
<input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
|
||||
|
||||
<!-- Hide / unhide sidebar before it is displayed -->
|
||||
<script>
|
||||
let sidebar = null;
|
||||
const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
|
||||
if (document.body.clientWidth >= 1080) {
|
||||
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
|
||||
sidebar = sidebar || 'visible';
|
||||
} else {
|
||||
sidebar = 'hidden';
|
||||
sidebar_toggle.checked = false;
|
||||
}
|
||||
if (sidebar === 'visible') {
|
||||
sidebar_toggle.checked = true;
|
||||
} else {
|
||||
html.classList.remove('sidebar-visible');
|
||||
}
|
||||
</script>
|
||||
|
||||
<nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
|
||||
<!-- populated by js -->
|
||||
<mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
|
||||
<noscript>
|
||||
<iframe class="sidebar-iframe-outer" src="../toc.html"></iframe>
|
||||
</noscript>
|
||||
<div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
|
||||
<div class="sidebar-resize-indicator"></div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div id="mdbook-page-wrapper" class="page-wrapper">
|
||||
|
||||
<div class="page">
|
||||
<div id="mdbook-menu-bar-hover-placeholder"></div>
|
||||
<div id="mdbook-menu-bar" class="menu-bar sticky">
|
||||
<div class="left-buttons">
|
||||
<label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
|
||||
</label>
|
||||
<button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
|
||||
</button>
|
||||
<ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
|
||||
</ul>
|
||||
<button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<h1 class="menu-title">Home Manager Manual</h1>
|
||||
|
||||
<div class="right-buttons">
|
||||
<a href="../print.html" title="Print this book" aria-label="Print this book">
|
||||
<span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
|
||||
</a>
|
||||
<a href="https://github.com/nix-community/home-manager" title="Git repository" aria-label="Git repository">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="mdbook-search-wrapper" class="hidden">
|
||||
<form id="mdbook-searchbar-outer" class="searchbar-outer">
|
||||
<div class="search-wrapper">
|
||||
<input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
|
||||
<div class="spinner-wrapper">
|
||||
<span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
|
||||
<div id="mdbook-searchresults-header" class="searchresults-header"></div>
|
||||
<ul id="mdbook-searchresults">
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
|
||||
<script>
|
||||
document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
|
||||
document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
|
||||
Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
|
||||
link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
|
||||
});
|
||||
</script>
|
||||
|
||||
<div id="mdbook-content" class="content">
|
||||
<main>
|
||||
<p><a id="sec-news"></a></p>
|
||||
<h1 id="news"><a class="header" href="#news">News</a></h1>
|
||||
<p>Home Manager includes a system for presenting news to the user. When
|
||||
making a change you, therefore, have the option to also include an
|
||||
associated news entry. In general, a news entry should only be added for
|
||||
truly noteworthy news. For example, a bug fix or new option does
|
||||
generally not need a news entry.</p>
|
||||
<p>Release notes and news entries serve different purposes. A news entry is
|
||||
shown during Home Manager activation and is useful for day-to-day
|
||||
communication about noteworthy changes, such as a new module, a new
|
||||
feature, or a specific deprecation. Release notes are read from the
|
||||
website documentation and should summarize what users need to know before
|
||||
or during a stable-release upgrade. See
|
||||
<a href="release-notes.html#sec-contributing-release-notes">Release Notes</a> for guidance on changes
|
||||
that affect stable-release upgrades.</p>
|
||||
<p>If you do have a change worthy of a news entry then please add one in
|
||||
<a href="https://github.com/nix-community/home-manager/blob/master/modules/misc/news"><code>news</code></a>
|
||||
but you should follow some basic guidelines:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>Use the included news entry generator to create a news entry file:</p>
|
||||
<pre><code class="language-shell">$ nix run .#create-news-entry
|
||||
</code></pre>
|
||||
<p>Alternatively, you can directly use the script:</p>
|
||||
<pre><code class="language-shell">$ nix-shell -A dev --run modules/misc/news/create-news-entry.sh
|
||||
</code></pre>
|
||||
<p>This will create a new file inside the <code>modules/misc/news</code> directory
|
||||
with some placeholder information that you can edit.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The entry condition should be as specific as possible for changes
|
||||
affecting existing functionality. For example, if you are changing
|
||||
or deprecating a specific option then you could restrict the news to
|
||||
those users who actually use this option. Prefer a targeted
|
||||
condition over skipping useful news only to avoid notifying
|
||||
unaffected users.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Wrap the news message so that it will fit in the typical terminal,
|
||||
that is, at most 80 characters wide. Ideally a bit less.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Unlike commit messages, news will be read without any connection to
|
||||
the Home Manager source code. It is therefore important to make the
|
||||
message understandable in isolation and to those who do not have
|
||||
knowledge of the Home Manager internals. To this end it should be
|
||||
written in more descriptive, prose like way.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>If you refer to an option then write its full attribute path. That
|
||||
is, instead of writing</p>
|
||||
<pre><code>The option 'foo' has been deprecated, please use 'bar' instead.
|
||||
</code></pre>
|
||||
<p>it should read</p>
|
||||
<pre><code>The option 'services.myservice.foo' has been deprecated, please
|
||||
use 'services.myservice.bar' instead.
|
||||
</code></pre>
|
||||
</li>
|
||||
<li>
|
||||
<p>A new module, say <code>foo.nix</code>, should always include a news entry that
|
||||
has a message along the lines of</p>
|
||||
<pre><code>A new module is available: 'services.foo'.
|
||||
</code></pre>
|
||||
<p>Since this news announces newly available functionality, its
|
||||
condition should not require <code>config.services.foo.enable</code>; otherwise
|
||||
users who may want the new module will not see the news.</p>
|
||||
<p>If the module is platform specific, e.g., a service module using
|
||||
systemd, then a condition like</p>
|
||||
<pre><code class="language-nix">condition = hostPlatform.isLinux;
|
||||
</code></pre>
|
||||
<p>should be added to avoid showing the news on unsupported platforms.
|
||||
Use the <code>create-news-entry</code> generator described above to scaffold
|
||||
this entry as part of your contribution.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
</main>
|
||||
|
||||
<nav class="nav-wrapper" aria-label="Page navigation">
|
||||
<!-- Mobile navigation buttons -->
|
||||
<a rel="prev" href="../contributing/release-notes.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
|
||||
</a>
|
||||
|
||||
<a rel="next prefetch" href="../contributing/tests.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
|
||||
</a>
|
||||
|
||||
<div style="clear: both"></div>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<nav class="nav-wide-wrapper" aria-label="Page navigation">
|
||||
<a rel="prev" href="../contributing/release-notes.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
|
||||
</a>
|
||||
|
||||
<a rel="next prefetch" href="../contributing/tests.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
|
||||
</a>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
|
||||
<template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
|
||||
<template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
|
||||
<template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
|
||||
<template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
|
||||
<template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
window.playground_copyable = true;
|
||||
</script>
|
||||
|
||||
|
||||
<script src="../elasticlunr-ef4e11c1.min.js"></script>
|
||||
<script src="../mark-09e88c2c.min.js"></script>
|
||||
<script src="../searcher-09f2665d.js"></script>
|
||||
|
||||
<script src="../clipboard-1626706a.min.js"></script>
|
||||
<script src="../highlight-abc7f01d.js"></script>
|
||||
<script src="../book-609e4cb8.js"></script>
|
||||
|
||||
<!-- Custom JS scripts -->
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,259 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html lang="en" class="light sidebar-visible" dir="ltr">
|
||||
<head>
|
||||
<!-- Book generated using mdBook -->
|
||||
<meta charset="UTF-8">
|
||||
<title>Release Notes - Home Manager Manual</title>
|
||||
|
||||
|
||||
<!-- Custom HTML head -->
|
||||
|
||||
<meta name="description" content="">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
<link rel="icon" href="../favicon-de23e50b.svg">
|
||||
<link rel="shortcut icon" href="../favicon-8114d1fc.png">
|
||||
<link rel="stylesheet" href="../css/variables-8adf115d.css">
|
||||
<link rel="stylesheet" href="../css/general-e96d0476.css">
|
||||
<link rel="stylesheet" href="../css/chrome-d279d366.css">
|
||||
<link rel="stylesheet" href="../css/print-9e4910d8.css" media="print">
|
||||
|
||||
<!-- Fonts -->
|
||||
<link rel="stylesheet" href="../fonts/fonts-9644e21d.css">
|
||||
|
||||
<!-- Highlight.js Stylesheets -->
|
||||
<link rel="stylesheet" id="mdbook-highlight-css" href="../highlight-493f70e1.css">
|
||||
<link rel="stylesheet" id="mdbook-tomorrow-night-css" href="../tomorrow-night-4c0ae647.css">
|
||||
<link rel="stylesheet" id="mdbook-ayu-highlight-css" href="../ayu-highlight-3fdfc3ac.css">
|
||||
|
||||
<!-- Custom theme stylesheets -->
|
||||
|
||||
|
||||
<!-- Provide site root and default themes to javascript -->
|
||||
<script>
|
||||
const path_to_root = "../";
|
||||
const default_light_theme = "light";
|
||||
const default_dark_theme = "navy";
|
||||
window.path_to_searchindex_js = "../searchindex-542a1820.js";
|
||||
</script>
|
||||
<!-- Start loading toc.js asap -->
|
||||
<script src="../toc-a22c24be.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="mdbook-help-container">
|
||||
<div id="mdbook-help-popup">
|
||||
<h2 class="mdbook-help-title">Keyboard shortcuts</h2>
|
||||
<div>
|
||||
<p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
|
||||
<p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
|
||||
<p>Press <kbd>?</kbd> to show this help</p>
|
||||
<p>Press <kbd>Esc</kbd> to hide this help</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="mdbook-body-container">
|
||||
<!-- Work around some values being stored in localStorage wrapped in quotes -->
|
||||
<script>
|
||||
try {
|
||||
let theme = localStorage.getItem('mdbook-theme');
|
||||
let sidebar = localStorage.getItem('mdbook-sidebar');
|
||||
|
||||
if (theme.startsWith('"') && theme.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
|
||||
}
|
||||
|
||||
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
|
||||
}
|
||||
} catch (e) { }
|
||||
</script>
|
||||
|
||||
<!-- Set the theme before any content is loaded, prevents flash -->
|
||||
<script>
|
||||
const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
|
||||
let theme;
|
||||
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
|
||||
if (theme === null || theme === undefined) { theme = default_theme; }
|
||||
const html = document.documentElement;
|
||||
html.classList.remove('light')
|
||||
html.classList.add(theme);
|
||||
html.classList.add("js");
|
||||
</script>
|
||||
|
||||
<input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
|
||||
|
||||
<!-- Hide / unhide sidebar before it is displayed -->
|
||||
<script>
|
||||
let sidebar = null;
|
||||
const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
|
||||
if (document.body.clientWidth >= 1080) {
|
||||
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
|
||||
sidebar = sidebar || 'visible';
|
||||
} else {
|
||||
sidebar = 'hidden';
|
||||
sidebar_toggle.checked = false;
|
||||
}
|
||||
if (sidebar === 'visible') {
|
||||
sidebar_toggle.checked = true;
|
||||
} else {
|
||||
html.classList.remove('sidebar-visible');
|
||||
}
|
||||
</script>
|
||||
|
||||
<nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
|
||||
<!-- populated by js -->
|
||||
<mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
|
||||
<noscript>
|
||||
<iframe class="sidebar-iframe-outer" src="../toc.html"></iframe>
|
||||
</noscript>
|
||||
<div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
|
||||
<div class="sidebar-resize-indicator"></div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div id="mdbook-page-wrapper" class="page-wrapper">
|
||||
|
||||
<div class="page">
|
||||
<div id="mdbook-menu-bar-hover-placeholder"></div>
|
||||
<div id="mdbook-menu-bar" class="menu-bar sticky">
|
||||
<div class="left-buttons">
|
||||
<label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
|
||||
</label>
|
||||
<button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
|
||||
</button>
|
||||
<ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
|
||||
</ul>
|
||||
<button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<h1 class="menu-title">Home Manager Manual</h1>
|
||||
|
||||
<div class="right-buttons">
|
||||
<a href="../print.html" title="Print this book" aria-label="Print this book">
|
||||
<span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
|
||||
</a>
|
||||
<a href="https://github.com/nix-community/home-manager" title="Git repository" aria-label="Git repository">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="mdbook-search-wrapper" class="hidden">
|
||||
<form id="mdbook-searchbar-outer" class="searchbar-outer">
|
||||
<div class="search-wrapper">
|
||||
<input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
|
||||
<div class="spinner-wrapper">
|
||||
<span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
|
||||
<div id="mdbook-searchresults-header" class="searchresults-header"></div>
|
||||
<ul id="mdbook-searchresults">
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
|
||||
<script>
|
||||
document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
|
||||
document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
|
||||
Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
|
||||
link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
|
||||
});
|
||||
</script>
|
||||
|
||||
<div id="mdbook-content" class="content">
|
||||
<main>
|
||||
<p><a id="sec-contributing-release-notes"></a></p>
|
||||
<h1 id="release-notes"><a class="header" href="#release-notes">Release Notes</a></h1>
|
||||
<p>Home Manager release notes are published as part of the website documentation in
|
||||
<code>docs/release-notes/rl-*.md</code>. They are intended for users migrating from one
|
||||
stable release to another.</p>
|
||||
<p>A change should be mentioned in the release notes when it affects migration
|
||||
between stable releases. This includes changes that require user action or
|
||||
awareness during an upgrade, such as:</p>
|
||||
<ul>
|
||||
<li>breaking changes;</li>
|
||||
<li>default changes guarded by <code>home.stateVersion</code>;</li>
|
||||
<li>required migration steps;</li>
|
||||
<li>broad behavior changes across platform or integration boundaries;</li>
|
||||
<li>compatibility changes that can affect existing configurations.</li>
|
||||
</ul>
|
||||
<p>Do not use the presence or absence of a news entry to decide whether a change
|
||||
belongs in the release notes. A change can require a news entry, a release note,
|
||||
both, or neither.</p>
|
||||
<p>When preparing a release, review the commits since the previous stable release
|
||||
and update the upcoming release note file with the migration impact. Prefer
|
||||
concise user-facing descriptions that name the affected option paths and explain
|
||||
required action.</p>
|
||||
|
||||
</main>
|
||||
|
||||
<nav class="nav-wrapper" aria-label="Page navigation">
|
||||
<!-- Mobile navigation buttons -->
|
||||
<a rel="prev" href="../contributing/guidelines.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
|
||||
</a>
|
||||
|
||||
<a rel="next prefetch" href="../contributing/news.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
|
||||
</a>
|
||||
|
||||
<div style="clear: both"></div>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<nav class="nav-wide-wrapper" aria-label="Page navigation">
|
||||
<a rel="prev" href="../contributing/guidelines.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
|
||||
</a>
|
||||
|
||||
<a rel="next prefetch" href="../contributing/news.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
|
||||
</a>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
|
||||
<template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
|
||||
<template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
|
||||
<template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
|
||||
<template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
|
||||
<template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
window.playground_copyable = true;
|
||||
</script>
|
||||
|
||||
|
||||
<script src="../elasticlunr-ef4e11c1.min.js"></script>
|
||||
<script src="../mark-09e88c2c.min.js"></script>
|
||||
<script src="../searcher-09f2665d.js"></script>
|
||||
|
||||
<script src="../clipboard-1626706a.min.js"></script>
|
||||
<script src="../highlight-abc7f01d.js"></script>
|
||||
<script src="../book-609e4cb8.js"></script>
|
||||
|
||||
<!-- Custom JS scripts -->
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,440 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html lang="en" class="light sidebar-visible" dir="ltr">
|
||||
<head>
|
||||
<!-- Book generated using mdBook -->
|
||||
<meta charset="UTF-8">
|
||||
<title>Tests - Home Manager Manual</title>
|
||||
|
||||
|
||||
<!-- Custom HTML head -->
|
||||
|
||||
<meta name="description" content="">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
<link rel="icon" href="../favicon-de23e50b.svg">
|
||||
<link rel="shortcut icon" href="../favicon-8114d1fc.png">
|
||||
<link rel="stylesheet" href="../css/variables-8adf115d.css">
|
||||
<link rel="stylesheet" href="../css/general-e96d0476.css">
|
||||
<link rel="stylesheet" href="../css/chrome-d279d366.css">
|
||||
<link rel="stylesheet" href="../css/print-9e4910d8.css" media="print">
|
||||
|
||||
<!-- Fonts -->
|
||||
<link rel="stylesheet" href="../fonts/fonts-9644e21d.css">
|
||||
|
||||
<!-- Highlight.js Stylesheets -->
|
||||
<link rel="stylesheet" id="mdbook-highlight-css" href="../highlight-493f70e1.css">
|
||||
<link rel="stylesheet" id="mdbook-tomorrow-night-css" href="../tomorrow-night-4c0ae647.css">
|
||||
<link rel="stylesheet" id="mdbook-ayu-highlight-css" href="../ayu-highlight-3fdfc3ac.css">
|
||||
|
||||
<!-- Custom theme stylesheets -->
|
||||
|
||||
|
||||
<!-- Provide site root and default themes to javascript -->
|
||||
<script>
|
||||
const path_to_root = "../";
|
||||
const default_light_theme = "light";
|
||||
const default_dark_theme = "navy";
|
||||
window.path_to_searchindex_js = "../searchindex-542a1820.js";
|
||||
</script>
|
||||
<!-- Start loading toc.js asap -->
|
||||
<script src="../toc-a22c24be.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="mdbook-help-container">
|
||||
<div id="mdbook-help-popup">
|
||||
<h2 class="mdbook-help-title">Keyboard shortcuts</h2>
|
||||
<div>
|
||||
<p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
|
||||
<p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
|
||||
<p>Press <kbd>?</kbd> to show this help</p>
|
||||
<p>Press <kbd>Esc</kbd> to hide this help</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="mdbook-body-container">
|
||||
<!-- Work around some values being stored in localStorage wrapped in quotes -->
|
||||
<script>
|
||||
try {
|
||||
let theme = localStorage.getItem('mdbook-theme');
|
||||
let sidebar = localStorage.getItem('mdbook-sidebar');
|
||||
|
||||
if (theme.startsWith('"') && theme.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
|
||||
}
|
||||
|
||||
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
|
||||
}
|
||||
} catch (e) { }
|
||||
</script>
|
||||
|
||||
<!-- Set the theme before any content is loaded, prevents flash -->
|
||||
<script>
|
||||
const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
|
||||
let theme;
|
||||
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
|
||||
if (theme === null || theme === undefined) { theme = default_theme; }
|
||||
const html = document.documentElement;
|
||||
html.classList.remove('light')
|
||||
html.classList.add(theme);
|
||||
html.classList.add("js");
|
||||
</script>
|
||||
|
||||
<input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
|
||||
|
||||
<!-- Hide / unhide sidebar before it is displayed -->
|
||||
<script>
|
||||
let sidebar = null;
|
||||
const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
|
||||
if (document.body.clientWidth >= 1080) {
|
||||
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
|
||||
sidebar = sidebar || 'visible';
|
||||
} else {
|
||||
sidebar = 'hidden';
|
||||
sidebar_toggle.checked = false;
|
||||
}
|
||||
if (sidebar === 'visible') {
|
||||
sidebar_toggle.checked = true;
|
||||
} else {
|
||||
html.classList.remove('sidebar-visible');
|
||||
}
|
||||
</script>
|
||||
|
||||
<nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
|
||||
<!-- populated by js -->
|
||||
<mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
|
||||
<noscript>
|
||||
<iframe class="sidebar-iframe-outer" src="../toc.html"></iframe>
|
||||
</noscript>
|
||||
<div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
|
||||
<div class="sidebar-resize-indicator"></div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div id="mdbook-page-wrapper" class="page-wrapper">
|
||||
|
||||
<div class="page">
|
||||
<div id="mdbook-menu-bar-hover-placeholder"></div>
|
||||
<div id="mdbook-menu-bar" class="menu-bar sticky">
|
||||
<div class="left-buttons">
|
||||
<label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
|
||||
</label>
|
||||
<button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
|
||||
</button>
|
||||
<ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
|
||||
</ul>
|
||||
<button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<h1 class="menu-title">Home Manager Manual</h1>
|
||||
|
||||
<div class="right-buttons">
|
||||
<a href="../print.html" title="Print this book" aria-label="Print this book">
|
||||
<span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
|
||||
</a>
|
||||
<a href="https://github.com/nix-community/home-manager" title="Git repository" aria-label="Git repository">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="mdbook-search-wrapper" class="hidden">
|
||||
<form id="mdbook-searchbar-outer" class="searchbar-outer">
|
||||
<div class="search-wrapper">
|
||||
<input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
|
||||
<div class="spinner-wrapper">
|
||||
<span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
|
||||
<div id="mdbook-searchresults-header" class="searchresults-header"></div>
|
||||
<ul id="mdbook-searchresults">
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
|
||||
<script>
|
||||
document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
|
||||
document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
|
||||
Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
|
||||
link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
|
||||
});
|
||||
</script>
|
||||
|
||||
<div id="mdbook-content" class="content">
|
||||
<main>
|
||||
<p><a id="sec-tests"></a></p>
|
||||
<h1 id="tests"><a class="header" href="#tests">Tests</a></h1>
|
||||
<p>Home Manager includes a basic test suite and it is highly recommended to
|
||||
include at least one test when adding a module. Tests are typically in
|
||||
the form of "golden tests" where, for example, a generated
|
||||
configuration file is compared to a known correct file.</p>
|
||||
<p>It is relatively easy to create tests by modeling the existing tests,
|
||||
found in the <code>tests</code> project directory.</p>
|
||||
<p><a id="sec-tests-basic"></a></p>
|
||||
<h2 id="writing-basic-tests"><a class="header" href="#writing-basic-tests">Writing Basic Tests</a></h2>
|
||||
<p>Home Manager tests use the <strong>NMT</strong> framework, which provides
|
||||
a set of assertion functions to verify that modules generate the expected files
|
||||
and configurations. Tests are written as Nix expressions that define both the
|
||||
Home Manager configuration and the test assertions.</p>
|
||||
<p><a id="sec-tests-structure"></a></p>
|
||||
<h3 id="test-structure"><a class="header" href="#test-structure">Test Structure</a></h3>
|
||||
<p>A basic test file structure looks like:</p>
|
||||
<pre><code class="language-nix">{
|
||||
# Home Manager configuration
|
||||
programs.myprogram = {
|
||||
enable = true;
|
||||
settings = {
|
||||
option = "value";
|
||||
};
|
||||
};
|
||||
|
||||
# NMT test script with assertions
|
||||
nmt.script = ''
|
||||
assertFileExists "home-files/.config/myprogram/config.toml"
|
||||
assertFileContent "home-files/.config/myprogram/config.toml" ${./expected-config.toml}
|
||||
'';
|
||||
}
|
||||
</code></pre>
|
||||
<p><a id="sec-tests-organization"></a></p>
|
||||
<h3 id="test-organization"><a class="header" href="#test-organization">Test Organization</a></h3>
|
||||
<p>Tests are organized in the <code>tests</code> directory structure:</p>
|
||||
<ul>
|
||||
<li><code>tests/modules/programs/myprogram/default.nix</code> - Lists all test cases for the module</li>
|
||||
<li><code>tests/modules/programs/myprogram/basic-configuration.nix</code> - A basic test case</li>
|
||||
<li><code>tests/modules/programs/myprogram/expected-config.toml</code> - Expected output file</li>
|
||||
</ul>
|
||||
<p>The <code>default.nix</code> file should list all test cases:</p>
|
||||
<pre><code class="language-nix">{
|
||||
myprogram-basic-configuration = ./basic-configuration.nix;
|
||||
myprogram-empty-settings = ./empty-settings.nix;
|
||||
}
|
||||
</code></pre>
|
||||
<p>Prefer keeping related assertions in as few test files as practical.
|
||||
Exercising several cases in one evaluation keeps the test suite cheaper
|
||||
to evaluate and reduces maintenance burden. Split cases into separate
|
||||
files when they need incompatible module configuration, platform
|
||||
conditions, expected assertion failures, or otherwise cannot share one
|
||||
evaluation.</p>
|
||||
<p><a id="sec-tests-assertions"></a></p>
|
||||
<h3 id="common-nmt-assertions"><a class="header" href="#common-nmt-assertions">Common NMT Assertions</a></h3>
|
||||
<p>NMT provides several assertion functions:</p>
|
||||
<ul>
|
||||
<li><code>assertFileExists "path"</code> - Verify a file was created</li>
|
||||
<li><code>assertPathNotExists "path"</code> - Verify a file was NOT created</li>
|
||||
<li><code>assertFileContent "path" expected-file</code> - Compare file contents</li>
|
||||
<li><code>assertFileRegex "path" "regex"</code> - Check file matches regex</li>
|
||||
</ul>
|
||||
<p>For a full reference to the functions available in test scripts, you can look at NMT’s
|
||||
<a href="https://git.sr.ht/~rycee/nmt/tree/master/item/bash-lib">bash-lib</a>.</p>
|
||||
<p><a id="sec-tests-examples"></a></p>
|
||||
<h3 id="practical-examples"><a class="header" href="#practical-examples">Practical Examples</a></h3>
|
||||
<p>Here are some real-world examples of common test patterns:</p>
|
||||
<p><strong>Testing that a configuration file is generated:</strong></p>
|
||||
<pre><code class="language-nix">{
|
||||
programs.alacritty = {
|
||||
enable = true;
|
||||
settings.font.size = 12;
|
||||
};
|
||||
|
||||
nmt.script = ''
|
||||
assertFileExists "home-files/.config/alacritty/alacritty.yml"
|
||||
assertFileContains "home-files/.config/alacritty/alacritty.yml" "size: 12"
|
||||
'';
|
||||
}
|
||||
</code></pre>
|
||||
<p><strong>Testing that no files are created when disabled:</strong></p>
|
||||
<pre><code class="language-nix">{
|
||||
programs.alacritty.enable = false;
|
||||
|
||||
nmt.script = ''
|
||||
assertPathNotExists "home-files/.config/alacritty"
|
||||
'';
|
||||
}
|
||||
</code></pre>
|
||||
<p><strong>Testing exact file content against expected output:</strong></p>
|
||||
<pre><code class="language-nix">{
|
||||
programs.fastfetch = {
|
||||
enable = true;
|
||||
settings.display.color = "blue";
|
||||
};
|
||||
|
||||
nmt.script =
|
||||
let
|
||||
configFile = "home-files/.config/fastfetch/config.jsonc";
|
||||
in
|
||||
''
|
||||
assertFileExists "${configFile}"
|
||||
assertFileContent "${configFile}" ${./expected-config.jsonc}
|
||||
'';
|
||||
}
|
||||
</code></pre>
|
||||
<p><strong>Testing multiple conditions in one test:</strong></p>
|
||||
<pre><code class="language-nix">{
|
||||
programs.myprogram = {
|
||||
enable = true;
|
||||
configFile = "custom.conf";
|
||||
extraConfig = "debug = true";
|
||||
};
|
||||
|
||||
nmt.script = ''
|
||||
assertFileExists "home-files/.config/myprogram/custom.conf"
|
||||
assertFileRegex "home-files/.config/myprogram/custom.conf" "debug = true"
|
||||
assertFileRegex "home-files/.config/myprogram/custom.conf" "^# Generated by Home Manager"
|
||||
'';
|
||||
}
|
||||
</code></pre>
|
||||
<p><a id="sec-tests-platform-specific"></a></p>
|
||||
<h3 id="platform-specific-tests"><a class="header" href="#platform-specific-tests">Platform-Specific Tests</a></h3>
|
||||
<p>When a module is platform-specific (Linux-only or Darwin-only), the test’s <code>default.nix</code>
|
||||
file should use <code>lib.optionalAttrs</code> to conditionally expose tests based on the platform.
|
||||
This prevents evaluation errors on unsupported platforms during the test suite runs.</p>
|
||||
<p><strong>Linux-only module tests:</strong></p>
|
||||
<pre><code class="language-nix">{ lib, pkgs, ... }:
|
||||
|
||||
lib.optionalAttrs pkgs.stdenv.hostPlatform.isLinux {
|
||||
rofi-valid-config = ./valid-config.nix;
|
||||
rofi-custom-theme = ./custom-theme.nix;
|
||||
}
|
||||
</code></pre>
|
||||
<p><strong>Darwin-only module tests:</strong></p>
|
||||
<pre><code class="language-nix">{ lib, pkgs, ... }:
|
||||
|
||||
lib.optionalAttrs pkgs.stdenv.hostPlatform.isDarwin {
|
||||
sketchybar-basic = ./basic-configuration.nix;
|
||||
sketchybar-lua-config = ./lua-config.nix;
|
||||
}
|
||||
</code></pre>
|
||||
<p>For cross-platform modules that have packages which need to be stubbed on Darwin,
|
||||
add the package names to <code>tests/darwinScrublist.nix</code> to prevent build failures
|
||||
during cross-platform test runs.</p>
|
||||
<p>On Linux, packages are automatically scrubbed by the test infrastructure,
|
||||
so tests should normally use the module’s default package. Use
|
||||
<code>test.stubs</code> or <code>config.lib.test.mkStubPackage</code> only when the automatic
|
||||
scrubbing does not model the behavior that the test needs, such as a
|
||||
package with additional files or a non-default executable layout.</p>
|
||||
<p><a id="sec-tests-command"></a></p>
|
||||
<h2 id="using-the-tests-command"><a class="header" href="#using-the-tests-command">Using the tests command</a></h2>
|
||||
<p>Home Manager provides a convenient <code>tests</code> command for discovering and running tests:</p>
|
||||
<pre><code class="language-shell"># List all available tests
|
||||
$ nix run .#tests -- -l
|
||||
|
||||
# List tests matching a pattern
|
||||
$ nix run .#tests -- -l alacritty
|
||||
|
||||
# Run all tests matching a pattern
|
||||
$ nix run .#tests -- alacritty
|
||||
|
||||
# Run a specific test
|
||||
$ nix run .#tests -- test-alacritty-empty-settings
|
||||
|
||||
# List integration tests
|
||||
$ nix run .#tests -- -t -l
|
||||
|
||||
# Run all integration tests
|
||||
$ nix run .#tests -- -t integration-test-
|
||||
|
||||
# Interactive test selection (requires fzf)
|
||||
$ nix run .#tests -- -i
|
||||
|
||||
# Pass additional nix build flags
|
||||
$ nix run .#tests -- alacritty -- --verbose
|
||||
</code></pre>
|
||||
<p>Integration tests are only exposed on Linux. On other platforms, integration
|
||||
test discovery may report no matching tests.</p>
|
||||
<p><a id="sec-tests-manual"></a></p>
|
||||
<h2 id="manual-test-commands"><a class="header" href="#manual-test-commands">Manual test commands</a></h2>
|
||||
<p>For advanced usage or CI environments, you can also run tests manually using nix build commands.</p>
|
||||
<p>The full Home Manager test suite can be run by executing</p>
|
||||
<pre><code class="language-shell">$ nix-build --pure --option allow-import-from-derivation false tests -A build.all
|
||||
</code></pre>
|
||||
<p>in the project root. List all test cases through</p>
|
||||
<pre><code class="language-shell">$ nix run .#tests -- -l
|
||||
</code></pre>
|
||||
<p>and run an individual test, for example <code>alacritty-empty-settings</code>,
|
||||
through</p>
|
||||
<pre><code class="language-shell">$ nix-build --pure tests --option allow-import-from-derivation false -A build.alacritty-empty-settings
|
||||
</code></pre>
|
||||
<p>However, those invocations will impurely source the system’s Nixpkgs,
|
||||
and may cause failures. To run against the Nixpkgs from the <code>flake.lock</code> file,
|
||||
use instead e.g.</p>
|
||||
<pre><code class="language-shell">$ nix build .#test-all
|
||||
</code></pre>
|
||||
<p>or</p>
|
||||
<pre><code class="language-shell">$ nix build .#test-alacritty-empty-settings
|
||||
</code></pre>
|
||||
<p>Some tests may be marked with <code>enableLegacyIfd</code>, those may be run by run with e.g.</p>
|
||||
<pre><code class="language-shell">$ nix-build --pure tests --arg enableLegacyIfd true -A build.mytest
|
||||
</code></pre>
|
||||
|
||||
</main>
|
||||
|
||||
<nav class="nav-wrapper" aria-label="Page navigation">
|
||||
<!-- Mobile navigation buttons -->
|
||||
<a rel="prev" href="../contributing/news.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
|
||||
</a>
|
||||
|
||||
<a rel="next prefetch" href="../internals.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
|
||||
</a>
|
||||
|
||||
<div style="clear: both"></div>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<nav class="nav-wide-wrapper" aria-label="Page navigation">
|
||||
<a rel="prev" href="../contributing/news.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
|
||||
</a>
|
||||
|
||||
<a rel="next prefetch" href="../internals.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
|
||||
</a>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
|
||||
<template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
|
||||
<template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
|
||||
<template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
|
||||
<template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
|
||||
<template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
window.playground_copyable = true;
|
||||
</script>
|
||||
|
||||
|
||||
<script src="../elasticlunr-ef4e11c1.min.js"></script>
|
||||
<script src="../mark-09e88c2c.min.js"></script>
|
||||
<script src="../searcher-09f2665d.js"></script>
|
||||
|
||||
<script src="../clipboard-1626706a.min.js"></script>
|
||||
<script src="../highlight-abc7f01d.js"></script>
|
||||
<script src="../book-609e4cb8.js"></script>
|
||||
|
||||
<!-- Custom JS scripts -->
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,770 @@
|
||||
/* CSS for UI elements (a.k.a. chrome) */
|
||||
|
||||
html {
|
||||
scrollbar-color: var(--scrollbar) transparent;
|
||||
}
|
||||
#mdbook-searchresults a,
|
||||
.content a:link,
|
||||
a:visited,
|
||||
a > .hljs {
|
||||
color: var(--links);
|
||||
}
|
||||
|
||||
/*
|
||||
mdbook-body-container is necessary because mobile browsers don't seem to like
|
||||
overflow-x on the body tag when there is a <meta name="viewport"> tag.
|
||||
*/
|
||||
#mdbook-body-container {
|
||||
/*
|
||||
This is used when the sidebar pushes the body content off the side of
|
||||
the screen on small screens. Without it, dragging on mobile Safari
|
||||
will want to reposition the viewport in a weird way.
|
||||
*/
|
||||
overflow-x: clip;
|
||||
}
|
||||
|
||||
/* Menu Bar */
|
||||
|
||||
#mdbook-menu-bar,
|
||||
#mdbook-menu-bar-hover-placeholder {
|
||||
z-index: 101;
|
||||
margin: auto calc(0px - var(--page-padding));
|
||||
}
|
||||
#mdbook-menu-bar {
|
||||
position: relative;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
background-color: var(--bg);
|
||||
border-block-end-color: var(--bg);
|
||||
border-block-end-width: 1px;
|
||||
border-block-end-style: solid;
|
||||
}
|
||||
#mdbook-menu-bar.sticky,
|
||||
#mdbook-menu-bar-hover-placeholder:hover + #mdbook-menu-bar,
|
||||
#mdbook-menu-bar:hover,
|
||||
html.sidebar-visible #mdbook-menu-bar {
|
||||
position: -webkit-sticky;
|
||||
position: sticky;
|
||||
top: 0 !important;
|
||||
}
|
||||
#mdbook-menu-bar-hover-placeholder {
|
||||
position: sticky;
|
||||
position: -webkit-sticky;
|
||||
top: 0;
|
||||
height: var(--menu-bar-height);
|
||||
}
|
||||
#mdbook-menu-bar.bordered {
|
||||
border-block-end-color: var(--table-border-color);
|
||||
}
|
||||
#mdbook-menu-bar .fa-svg, #mdbook-menu-bar .icon-button {
|
||||
position: relative;
|
||||
padding: 0 8px;
|
||||
z-index: 10;
|
||||
line-height: var(--menu-bar-height);
|
||||
cursor: pointer;
|
||||
transition: color 0.5s;
|
||||
}
|
||||
@media only screen and (max-width: 420px) {
|
||||
#mdbook-menu-bar .fa-svg, #mdbook-menu-bar .icon-button {
|
||||
padding: 0 5px;
|
||||
}
|
||||
}
|
||||
|
||||
.icon-button {
|
||||
border: none;
|
||||
background: none;
|
||||
padding: 0;
|
||||
color: inherit;
|
||||
}
|
||||
.icon-button .fa-svg {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.right-buttons {
|
||||
margin: 0 15px;
|
||||
}
|
||||
.right-buttons a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.left-buttons {
|
||||
display: flex;
|
||||
margin: 0 5px;
|
||||
}
|
||||
html:not(.js) .left-buttons button {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.menu-title {
|
||||
display: inline-block;
|
||||
font-weight: 200;
|
||||
font-size: 2.4rem;
|
||||
line-height: var(--menu-bar-height);
|
||||
text-align: center;
|
||||
margin: 0;
|
||||
flex: 1;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
.menu-title {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.menu-bar,
|
||||
.menu-bar:visited,
|
||||
.nav-chapters,
|
||||
.nav-chapters:visited,
|
||||
.mobile-nav-chapters,
|
||||
.mobile-nav-chapters:visited,
|
||||
.menu-bar .icon-button,
|
||||
.menu-bar a .fa-svg {
|
||||
color: var(--icons);
|
||||
}
|
||||
|
||||
.menu-bar .fa-svg:hover,
|
||||
.menu-bar .icon-button:hover,
|
||||
.nav-chapters:hover,
|
||||
.mobile-nav-chapters .fa-svg:hover {
|
||||
color: var(--icons-hover);
|
||||
}
|
||||
|
||||
/* Nav Icons */
|
||||
|
||||
.nav-chapters {
|
||||
font-size: 2.5em;
|
||||
text-align: center;
|
||||
text-decoration: none;
|
||||
|
||||
position: fixed;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
margin: 0;
|
||||
max-width: 150px;
|
||||
min-width: 90px;
|
||||
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-content: center;
|
||||
flex-direction: column;
|
||||
|
||||
transition: color 0.5s, background-color 0.5s;
|
||||
}
|
||||
|
||||
.nav-chapters:hover {
|
||||
text-decoration: none;
|
||||
background-color: var(--theme-hover);
|
||||
transition: background-color 0.15s, color 0.15s;
|
||||
}
|
||||
|
||||
.nav-chapters.previous {
|
||||
/* Ensure that the previous arrow does not overlap the resize indicator. */
|
||||
margin-inline-start: var(--sidebar-resize-indicator-width);
|
||||
}
|
||||
|
||||
.nav-wrapper {
|
||||
margin-block-start: 50px;
|
||||
display: none;
|
||||
}
|
||||
|
||||
.mobile-nav-chapters {
|
||||
font-size: 2.5em;
|
||||
text-align: center;
|
||||
text-decoration: none;
|
||||
width: 90px;
|
||||
border-radius: 5px;
|
||||
background-color: var(--sidebar-bg);
|
||||
}
|
||||
|
||||
/* Only Firefox supports flow-relative values */
|
||||
.previous { float: left; }
|
||||
[dir=rtl] .previous { float: right; }
|
||||
|
||||
/* Only Firefox supports flow-relative values */
|
||||
.next {
|
||||
float: right;
|
||||
right: var(--page-padding);
|
||||
}
|
||||
[dir=rtl] .next {
|
||||
float: left;
|
||||
right: unset;
|
||||
left: var(--page-padding);
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 1080px) {
|
||||
.nav-wide-wrapper { display: none; }
|
||||
.nav-wrapper { display: block; }
|
||||
}
|
||||
|
||||
/* sidebar-visible */
|
||||
@media only screen and (max-width: 1380px) {
|
||||
#mdbook-sidebar-toggle-anchor:checked ~ .page-wrapper .nav-wide-wrapper { display: none; }
|
||||
#mdbook-sidebar-toggle-anchor:checked ~ .page-wrapper .nav-wrapper { display: block; }
|
||||
}
|
||||
|
||||
/* Inline code */
|
||||
|
||||
:not(pre) > .hljs {
|
||||
display: inline;
|
||||
padding: 0.1em 0.3em;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
:not(pre):not(a) > .hljs {
|
||||
color: var(--inline-code-color);
|
||||
overflow-x: initial;
|
||||
}
|
||||
|
||||
a:hover > .hljs {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
pre {
|
||||
position: relative;
|
||||
}
|
||||
pre > .buttons {
|
||||
position: absolute;
|
||||
z-index: 100;
|
||||
right: 0px;
|
||||
top: 2px;
|
||||
margin: 0px;
|
||||
padding: 2px 0px;
|
||||
|
||||
color: var(--sidebar-fg);
|
||||
cursor: pointer;
|
||||
visibility: hidden;
|
||||
opacity: 0;
|
||||
transition: visibility 0.1s linear, opacity 0.1s linear;
|
||||
}
|
||||
pre:hover > .buttons {
|
||||
visibility: visible;
|
||||
opacity: 1
|
||||
}
|
||||
pre > .buttons :hover {
|
||||
color: var(--sidebar-active);
|
||||
border-color: var(--icons-hover);
|
||||
background-color: var(--theme-hover);
|
||||
}
|
||||
pre > .buttons button {
|
||||
cursor: inherit;
|
||||
margin: 0px 5px;
|
||||
padding: 2px 3px 0px 4px;
|
||||
font-size: 23px;
|
||||
|
||||
border-style: solid;
|
||||
border-width: 1px;
|
||||
border-radius: 4px;
|
||||
border-color: var(--icons);
|
||||
background-color: var(--theme-popup-bg);
|
||||
transition: 100ms;
|
||||
transition-property: color,border-color,background-color;
|
||||
color: var(--icons);
|
||||
}
|
||||
|
||||
pre > .buttons button.clip-button {
|
||||
padding: 2px 4px 0px 6px;
|
||||
}
|
||||
pre > .buttons button.clip-button::before {
|
||||
/* clipboard image from octicons (https://github.com/primer/octicons/tree/v2.0.0) MIT license
|
||||
*/
|
||||
content: url('data:image/svg+xml,<svg width="21" height="20" viewBox="0 0 24 25" \
|
||||
xmlns="http://www.w3.org/2000/svg" aria-label="Copy to clipboard">\
|
||||
<path d="M18 20h2v3c0 1-1 2-2 2H2c-.998 0-2-1-2-2V5c0-.911.755-1.667 1.667-1.667h5A3.323 3.323 0 \
|
||||
0110 0a3.323 3.323 0 013.333 3.333h5C19.245 3.333 20 4.09 20 5v8.333h-2V9H2v14h16v-3zM3 \
|
||||
7h14c0-.911-.793-1.667-1.75-1.667H13.5c-.957 0-1.75-.755-1.75-1.666C11.75 2.755 10.957 2 10 \
|
||||
2s-1.75.755-1.75 1.667c0 .911-.793 1.666-1.75 1.666H4.75C3.793 5.333 3 6.09 3 7z"/>\
|
||||
<path d="M4 19h6v2H4zM12 11H4v2h8zM4 17h4v-2H4zM15 15v-3l-4.5 4.5L15 21v-3l8.027-.032L23 15z"/>\
|
||||
</svg>');
|
||||
filter: var(--copy-button-filter);
|
||||
}
|
||||
pre > .buttons button.clip-button:hover::before {
|
||||
filter: var(--copy-button-filter-hover);
|
||||
}
|
||||
|
||||
@media (pointer: coarse) {
|
||||
pre > .buttons button {
|
||||
/* On mobile, make it easier to tap buttons. */
|
||||
padding: 0.3rem 1rem;
|
||||
}
|
||||
|
||||
.sidebar-resize-indicator {
|
||||
/* Hide resize indicator on devices with limited accuracy */
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
pre > code {
|
||||
display: block;
|
||||
padding: 1rem;
|
||||
}
|
||||
|
||||
/* FIXME: ACE editors overlap their buttons because ACE does absolute
|
||||
positioning within the code block which breaks padding. The only solution I
|
||||
can think of is to move the padding to the outer pre tag (or insert a div
|
||||
wrapper), but that would require fixing a whole bunch of CSS rules.
|
||||
*/
|
||||
.hljs.ace_editor {
|
||||
padding: 0rem 0rem;
|
||||
}
|
||||
|
||||
pre > .result {
|
||||
margin-block-start: 10px;
|
||||
}
|
||||
|
||||
/* Search */
|
||||
|
||||
#mdbook-searchresults a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
mark {
|
||||
border-radius: 2px;
|
||||
padding-block-start: 0;
|
||||
padding-block-end: 1px;
|
||||
padding-inline-start: 3px;
|
||||
padding-inline-end: 3px;
|
||||
margin-block-start: 0;
|
||||
margin-block-end: -1px;
|
||||
margin-inline-start: -3px;
|
||||
margin-inline-end: -3px;
|
||||
background-color: var(--search-mark-bg);
|
||||
transition: background-color 300ms linear;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
mark.fade-out {
|
||||
background-color: rgba(0,0,0,0) !important;
|
||||
cursor: auto;
|
||||
}
|
||||
|
||||
.searchbar-outer {
|
||||
margin-inline-start: auto;
|
||||
margin-inline-end: auto;
|
||||
max-width: var(--content-max-width);
|
||||
}
|
||||
|
||||
#mdbook-searchbar-outer.searching #mdbook-searchbar {
|
||||
padding-right: 30px;
|
||||
}
|
||||
#mdbook-searchbar-outer .spinner-wrapper {
|
||||
display: none;
|
||||
}
|
||||
#mdbook-searchbar-outer.searching .spinner-wrapper {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.search-wrapper {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.spinner-wrapper {
|
||||
--spinner-margin: 2px;
|
||||
position: absolute;
|
||||
margin-block-start: calc(var(--searchbar-margin-block-start) + var(--spinner-margin));
|
||||
right: var(--spinner-margin);
|
||||
top: 0;
|
||||
bottom: var(--spinner-margin);
|
||||
padding: 6px;
|
||||
background-color: var(--bg);
|
||||
}
|
||||
|
||||
#fa-spin {
|
||||
animation: rotating 2s linear infinite;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
@keyframes rotating {
|
||||
from {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
to {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
#mdbook-searchbar {
|
||||
width: 100%;
|
||||
margin-block-start: var(--searchbar-margin-block-start);
|
||||
margin-block-end: 0;
|
||||
margin-inline-start: auto;
|
||||
margin-inline-end: auto;
|
||||
padding: 10px 16px;
|
||||
transition: box-shadow 300ms ease-in-out;
|
||||
border: 1px solid var(--searchbar-border-color);
|
||||
border-radius: 3px;
|
||||
background-color: var(--searchbar-bg);
|
||||
color: var(--searchbar-fg);
|
||||
}
|
||||
#mdbook-searchbar:focus,
|
||||
#mdbook-searchbar.active {
|
||||
box-shadow: 0 0 3px var(--searchbar-shadow-color);
|
||||
}
|
||||
|
||||
.searchresults-header {
|
||||
font-weight: bold;
|
||||
font-size: 1em;
|
||||
padding-block-start: 18px;
|
||||
padding-block-end: 0;
|
||||
padding-inline-start: 5px;
|
||||
padding-inline-end: 0;
|
||||
color: var(--searchresults-header-fg);
|
||||
}
|
||||
|
||||
.searchresults-outer {
|
||||
margin-inline-start: auto;
|
||||
margin-inline-end: auto;
|
||||
max-width: var(--content-max-width);
|
||||
border-block-end: 1px dashed var(--searchresults-border-color);
|
||||
}
|
||||
|
||||
ul#mdbook-searchresults {
|
||||
list-style: none;
|
||||
padding-inline-start: 20px;
|
||||
}
|
||||
ul#mdbook-searchresults li {
|
||||
margin: 10px 0px;
|
||||
padding: 2px;
|
||||
border-radius: 2px;
|
||||
}
|
||||
ul#mdbook-searchresults li.focus {
|
||||
background-color: var(--searchresults-li-bg);
|
||||
}
|
||||
ul#mdbook-searchresults span.teaser {
|
||||
display: block;
|
||||
clear: both;
|
||||
margin-block-start: 5px;
|
||||
margin-block-end: 0;
|
||||
margin-inline-start: 20px;
|
||||
margin-inline-end: 0;
|
||||
font-size: 0.8em;
|
||||
}
|
||||
ul#mdbook-searchresults span.teaser em {
|
||||
font-weight: bold;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
/* Sidebar */
|
||||
|
||||
.sidebar {
|
||||
position: fixed;
|
||||
left: 0;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
width: var(--sidebar-width);
|
||||
font-size: 0.875em;
|
||||
box-sizing: border-box;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
overscroll-behavior-y: contain;
|
||||
background-color: var(--sidebar-bg);
|
||||
color: var(--sidebar-fg);
|
||||
}
|
||||
.sidebar-iframe-inner {
|
||||
--padding: 10px;
|
||||
|
||||
background-color: var(--sidebar-bg);
|
||||
padding: var(--padding);
|
||||
margin: 0;
|
||||
font-size: 1.4rem;
|
||||
color: var(--sidebar-fg);
|
||||
min-height: calc(100vh - var(--padding) * 2);
|
||||
}
|
||||
.sidebar-iframe-outer {
|
||||
border: none;
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
}
|
||||
[dir=rtl] .sidebar { left: unset; right: 0; }
|
||||
.sidebar-resizing {
|
||||
-moz-user-select: none;
|
||||
-webkit-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
html:not(.sidebar-resizing) .sidebar {
|
||||
transition: transform 0.3s; /* Animation: slide away */
|
||||
}
|
||||
.sidebar code {
|
||||
line-height: 2em;
|
||||
}
|
||||
.sidebar .sidebar-scrollbox {
|
||||
overflow-y: auto;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
padding: 10px 10px;
|
||||
}
|
||||
.sidebar .sidebar-resize-handle {
|
||||
position: absolute;
|
||||
cursor: col-resize;
|
||||
width: 0;
|
||||
right: calc(var(--sidebar-resize-indicator-width) * -1);
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.sidebar-resize-handle .sidebar-resize-indicator {
|
||||
width: 100%;
|
||||
height: 16px;
|
||||
color: var(--icons);
|
||||
margin-inline-start: var(--sidebar-resize-indicator-space);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: flex-start;
|
||||
}
|
||||
.sidebar-resize-handle .sidebar-resize-indicator::before {
|
||||
content: "";
|
||||
width: 2px;
|
||||
height: 12px;
|
||||
border-left: dotted 2px currentColor;
|
||||
}
|
||||
.sidebar-resize-handle .sidebar-resize-indicator::after {
|
||||
content: "";
|
||||
width: 2px;
|
||||
height: 16px;
|
||||
border-left: dotted 2px currentColor;
|
||||
}
|
||||
|
||||
[dir=rtl] .sidebar .sidebar-resize-handle {
|
||||
left: calc(var(--sidebar-resize-indicator-width) * -1);
|
||||
right: unset;
|
||||
}
|
||||
.js .sidebar .sidebar-resize-handle {
|
||||
cursor: col-resize;
|
||||
width: calc(var(--sidebar-resize-indicator-width) - var(--sidebar-resize-indicator-space));
|
||||
}
|
||||
|
||||
html:not(.js) .sidebar-resize-handle {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* sidebar-hidden */
|
||||
#mdbook-sidebar-toggle-anchor:not(:checked) ~ .sidebar {
|
||||
transform: translateX(calc(0px - var(--sidebar-width) - var(--sidebar-resize-indicator-width)));
|
||||
}
|
||||
[dir=rtl] #mdbook-sidebar-toggle-anchor:not(:checked) ~ .sidebar {
|
||||
transform: translateX(calc(var(--sidebar-width) + var(--sidebar-resize-indicator-width)));
|
||||
}
|
||||
.sidebar::-webkit-scrollbar {
|
||||
background: var(--sidebar-bg);
|
||||
}
|
||||
.sidebar::-webkit-scrollbar-thumb {
|
||||
background: var(--scrollbar);
|
||||
}
|
||||
|
||||
/* sidebar-visible */
|
||||
#mdbook-sidebar-toggle-anchor:checked ~ .page-wrapper {
|
||||
transform: translateX(calc(var(--sidebar-width) + var(--sidebar-resize-indicator-width)));
|
||||
}
|
||||
[dir=rtl] #mdbook-sidebar-toggle-anchor:checked ~ .page-wrapper {
|
||||
transform: translateX(calc(0px - var(--sidebar-width) - var(--sidebar-resize-indicator-width)));
|
||||
}
|
||||
@media only screen and (min-width: 620px) {
|
||||
#mdbook-sidebar-toggle-anchor:checked ~ .page-wrapper {
|
||||
transform: none;
|
||||
margin-inline-start: calc(var(--sidebar-width) + var(--sidebar-resize-indicator-width));
|
||||
}
|
||||
[dir=rtl] #mdbook-sidebar-toggle-anchor:checked ~ .page-wrapper {
|
||||
transform: none;
|
||||
}
|
||||
}
|
||||
|
||||
.chapter {
|
||||
list-style: none outside none;
|
||||
padding-inline-start: 0;
|
||||
line-height: 2.2em;
|
||||
}
|
||||
|
||||
.chapter li {
|
||||
color: var(--sidebar-non-existant);
|
||||
}
|
||||
|
||||
/* This is a span wrapping the chapter link and the fold chevron. */
|
||||
.chapter-link-wrapper {
|
||||
/* Used to position the chevron to the right, allowing the text to wrap before it. */
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.chapter li a {
|
||||
/* Remove underlines. */
|
||||
text-decoration: none;
|
||||
color: var(--sidebar-fg);
|
||||
}
|
||||
|
||||
.chapter li a:hover {
|
||||
color: var(--sidebar-active);
|
||||
}
|
||||
|
||||
.chapter li a.active {
|
||||
color: var(--sidebar-active);
|
||||
}
|
||||
|
||||
/* This is the toggle chevron. */
|
||||
.chapter-fold-toggle {
|
||||
cursor: pointer;
|
||||
/* Positions the chevron to the side. */
|
||||
margin-inline-start: auto;
|
||||
padding: 0 10px;
|
||||
user-select: none;
|
||||
opacity: 0.68;
|
||||
}
|
||||
|
||||
.chapter-fold-toggle div {
|
||||
transition: transform 0.5s;
|
||||
}
|
||||
|
||||
/* collapse the section */
|
||||
.chapter li:not(.expanded) > ol {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.chapter li.chapter-item {
|
||||
line-height: 1.5em;
|
||||
margin-block-start: 0.6em;
|
||||
}
|
||||
|
||||
.chapter li.header-item {
|
||||
/* Make sure there is plenty of spacing between sections so they don't blend in
|
||||
with each other. */
|
||||
margin-block-end: 0.5em;
|
||||
/* Avoid too much spacing between lines when section heading word wraps so that
|
||||
it can be distinguished between successive headings. */
|
||||
line-height: 1.5em;
|
||||
}
|
||||
|
||||
/* When expanded, rotate the chevron to point down. */
|
||||
.chapter li.expanded > span > .chapter-fold-toggle div {
|
||||
transform: rotate(90deg);
|
||||
}
|
||||
|
||||
.chapter a.current-header {
|
||||
color: var(--sidebar-active);
|
||||
}
|
||||
|
||||
.on-this-page {
|
||||
margin-left: 22px;
|
||||
border-inline-start: 4px solid var(--sidebar-header-border-color);
|
||||
padding-left: 8px;
|
||||
}
|
||||
|
||||
.on-this-page > ol {
|
||||
padding-left: 0;
|
||||
}
|
||||
|
||||
/* Horizontal line in chapter list. */
|
||||
.spacer {
|
||||
width: 100%;
|
||||
height: 3px;
|
||||
margin: 5px 0px;
|
||||
}
|
||||
.chapter .spacer {
|
||||
background-color: var(--sidebar-spacer);
|
||||
}
|
||||
|
||||
/* On touch devices, add more vertical spacing to make it easier to tap links. */
|
||||
@media (-moz-touch-enabled: 1), (pointer: coarse) {
|
||||
.chapter li a { padding: 5px 0; }
|
||||
.spacer { margin: 10px 0; }
|
||||
}
|
||||
|
||||
.section {
|
||||
list-style: none outside none;
|
||||
padding-inline-start: 20px;
|
||||
line-height: 1.9em;
|
||||
}
|
||||
|
||||
/* Theme Menu Popup */
|
||||
|
||||
.theme-popup {
|
||||
position: absolute;
|
||||
left: 10px;
|
||||
top: var(--menu-bar-height);
|
||||
z-index: 1000;
|
||||
border-radius: 4px;
|
||||
font-size: 0.7em;
|
||||
color: var(--fg);
|
||||
background: var(--theme-popup-bg);
|
||||
border: 1px solid var(--theme-popup-border);
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
list-style: none;
|
||||
display: none;
|
||||
/* Don't let the children's background extend past the rounded corners. */
|
||||
overflow: hidden;
|
||||
}
|
||||
[dir=rtl] .theme-popup { left: unset; right: 10px; }
|
||||
.theme-popup .default {
|
||||
color: var(--icons);
|
||||
}
|
||||
.theme-popup .theme {
|
||||
width: 100%;
|
||||
border: 0;
|
||||
margin: 0;
|
||||
padding: 2px 20px;
|
||||
line-height: 25px;
|
||||
white-space: nowrap;
|
||||
text-align: start;
|
||||
cursor: pointer;
|
||||
color: inherit;
|
||||
background: inherit;
|
||||
font-size: inherit;
|
||||
}
|
||||
.theme-popup .theme:hover {
|
||||
background-color: var(--theme-hover);
|
||||
}
|
||||
|
||||
.theme-selected::before {
|
||||
display: inline-block;
|
||||
content: "✓";
|
||||
margin-inline-start: -14px;
|
||||
width: 14px;
|
||||
}
|
||||
|
||||
/* The container for the help popup that covers the whole window. */
|
||||
#mdbook-help-container {
|
||||
/* Position and size for the whole window. */
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
/* This uses flex layout (which is set in book.js), and centers the popup
|
||||
in the window.*/
|
||||
display: none;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
z-index: 1000;
|
||||
/* Dim out the book while the popup is visible. */
|
||||
background: var(--overlay-bg);
|
||||
}
|
||||
|
||||
/* The popup help box. */
|
||||
#mdbook-help-popup {
|
||||
box-shadow: 0 4px 24px rgba(0,0,0,0.15);
|
||||
min-width: 300px;
|
||||
max-width: 500px;
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
background-color: var(--bg);
|
||||
color: var(--fg);
|
||||
border-width: 1px;
|
||||
border-color: var(--theme-popup-border);
|
||||
border-style: solid;
|
||||
border-radius: 8px;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
.mdbook-help-title {
|
||||
text-align: center;
|
||||
/* mdbook's margin for h2 is way too large. */
|
||||
margin: 10px;
|
||||
}
|
||||
@@ -0,0 +1,464 @@
|
||||
/* Base styles and content styles */
|
||||
|
||||
:root {
|
||||
/* Browser default font-size is 16px, this way 1 rem = 10px */
|
||||
font-size: 62.5%;
|
||||
color-scheme: var(--color-scheme);
|
||||
}
|
||||
|
||||
html {
|
||||
font-family: "Open Sans", sans-serif;
|
||||
color: var(--fg);
|
||||
background-color: var(--bg);
|
||||
text-size-adjust: none;
|
||||
-webkit-text-size-adjust: none;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
font-size: 1.6rem;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
code {
|
||||
font-family: var(--mono-font) !important;
|
||||
font-size: var(--code-font-size);
|
||||
direction: ltr !important;
|
||||
}
|
||||
|
||||
/* make long words/inline code not x overflow */
|
||||
main {
|
||||
overflow-wrap: break-word;
|
||||
}
|
||||
|
||||
/* make wide tables scroll if they overflow */
|
||||
.table-wrapper {
|
||||
overflow-x: auto;
|
||||
}
|
||||
|
||||
/* Don't change font size in headers. */
|
||||
h1 code, h2 code, h3 code, h4 code, h5 code, h6 code {
|
||||
font-size: unset;
|
||||
}
|
||||
|
||||
.left { float: left; }
|
||||
.right { float: right; }
|
||||
.boring { opacity: 0.6; }
|
||||
.hide-boring .boring { display: none; }
|
||||
.hidden { display: none !important; }
|
||||
|
||||
h2, h3 { margin-block-start: 2.5em; }
|
||||
h4, h5 { margin-block-start: 2em; }
|
||||
|
||||
.header + .header h3,
|
||||
.header + .header h4,
|
||||
.header + .header h5 {
|
||||
margin-block-start: 1em;
|
||||
}
|
||||
|
||||
h1:target::before,
|
||||
h2:target::before,
|
||||
h3:target::before,
|
||||
h4:target::before,
|
||||
h5:target::before,
|
||||
h6:target::before,
|
||||
dt:target::before {
|
||||
display: inline-block;
|
||||
content: "»";
|
||||
margin-inline-start: -30px;
|
||||
width: 30px;
|
||||
}
|
||||
|
||||
/* This is broken on Safari as of version 14, but is fixed
|
||||
in Safari Technology Preview 117 which I think will be Safari 14.2.
|
||||
https://bugs.webkit.org/show_bug.cgi?id=218076
|
||||
*/
|
||||
:target {
|
||||
/* Safari does not support logical properties */
|
||||
scroll-margin-top: calc(var(--menu-bar-height) + 0.5em);
|
||||
}
|
||||
|
||||
.page {
|
||||
outline: 0;
|
||||
padding: 0 var(--page-padding);
|
||||
margin-block-start: calc(0px - var(--menu-bar-height)); /* Compensate for the #mdbook-menu-bar-hover-placeholder */
|
||||
}
|
||||
.page-wrapper {
|
||||
box-sizing: border-box;
|
||||
background-color: var(--bg);
|
||||
}
|
||||
html:not(.js) .page-wrapper,
|
||||
.js:not(.sidebar-resizing) .page-wrapper {
|
||||
transition: margin-left 0.3s ease, transform 0.3s ease; /* Animation: slide away */
|
||||
}
|
||||
[dir=rtl]:not(.js) .page-wrapper,
|
||||
[dir=rtl].js:not(.sidebar-resizing) .page-wrapper {
|
||||
transition: margin-right 0.3s ease, transform 0.3s ease; /* Animation: slide away */
|
||||
}
|
||||
|
||||
.content {
|
||||
overflow-y: auto;
|
||||
padding: 0 5px 50px 5px;
|
||||
}
|
||||
.content main {
|
||||
margin-inline-start: auto;
|
||||
margin-inline-end: auto;
|
||||
max-width: var(--content-max-width);
|
||||
}
|
||||
.content p { line-height: 1.45em; }
|
||||
.content ol { line-height: 1.45em; }
|
||||
.content ul { line-height: 1.45em; }
|
||||
.content a { text-decoration: none; }
|
||||
.content a:hover { text-decoration: underline; }
|
||||
.content img, .content video { max-width: 100%; }
|
||||
/* When an image is inside an anchor, ensure the focus ring covers the entire
|
||||
image instead of the anchor's line box. */
|
||||
.content a:has(img) { display: inline-block; }
|
||||
.content .header:link,
|
||||
.content .header:visited {
|
||||
color: var(--fg);
|
||||
}
|
||||
.content .header:link,
|
||||
.content .header:visited:hover {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
table {
|
||||
margin: 0 auto;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
table td {
|
||||
padding: 3px 20px;
|
||||
border: 1px var(--table-border-color) solid;
|
||||
}
|
||||
table thead {
|
||||
background: var(--table-header-bg);
|
||||
}
|
||||
table thead td {
|
||||
font-weight: 700;
|
||||
border: none;
|
||||
}
|
||||
table thead th {
|
||||
padding: 3px 20px;
|
||||
}
|
||||
table thead tr {
|
||||
border: 1px var(--table-header-bg) solid;
|
||||
}
|
||||
/* Alternate background colors for rows */
|
||||
table tbody tr:nth-child(2n) {
|
||||
background: var(--table-alternate-bg);
|
||||
}
|
||||
|
||||
|
||||
blockquote {
|
||||
margin: 20px 0;
|
||||
padding: 0 20px;
|
||||
color: var(--fg);
|
||||
background-color: var(--quote-bg);
|
||||
border-block-start: .1em solid var(--quote-border);
|
||||
border-block-end: .1em solid var(--quote-border);
|
||||
}
|
||||
|
||||
/* TODO: Remove .warning in a future version of mdbook, it is replaced by
|
||||
blockquote tags. */
|
||||
.warning {
|
||||
margin: 20px;
|
||||
padding: 0 20px;
|
||||
border-inline-start: 2px solid var(--warning-border);
|
||||
}
|
||||
|
||||
.warning:before {
|
||||
position: absolute;
|
||||
width: 3rem;
|
||||
height: 3rem;
|
||||
margin-inline-start: calc(-1.5rem - 21px);
|
||||
content: "ⓘ";
|
||||
text-align: center;
|
||||
background-color: var(--bg);
|
||||
color: var(--warning-border);
|
||||
font-weight: bold;
|
||||
font-size: 2rem;
|
||||
}
|
||||
|
||||
blockquote .warning:before {
|
||||
background-color: var(--quote-bg);
|
||||
}
|
||||
|
||||
kbd {
|
||||
background-color: var(--table-border-color);
|
||||
border-radius: 4px;
|
||||
border: solid 1px var(--theme-popup-border);
|
||||
box-shadow: inset 0 -1px 0 var(--theme-hover);
|
||||
display: inline-block;
|
||||
font-size: var(--code-font-size);
|
||||
font-family: var(--mono-font);
|
||||
line-height: 10px;
|
||||
padding: 4px 5px;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
sup {
|
||||
/* Set the line-height for superscript and footnote references so that there
|
||||
isn't an awkward space appearing above lines that contain the footnote.
|
||||
|
||||
See https://github.com/rust-lang/mdBook/pull/2443#discussion_r1813773583
|
||||
for an explanation.
|
||||
*/
|
||||
line-height: 0;
|
||||
}
|
||||
|
||||
.footnote-definition {
|
||||
font-size: 0.9em;
|
||||
}
|
||||
/* The default spacing for a list is a little too large. */
|
||||
.footnote-definition ul,
|
||||
.footnote-definition ol {
|
||||
padding-left: 20px;
|
||||
}
|
||||
.footnote-definition > li {
|
||||
/* Required to position the ::before target */
|
||||
position: relative;
|
||||
}
|
||||
.footnote-definition > li:target {
|
||||
scroll-margin-top: 50vh;
|
||||
}
|
||||
.footnote-reference:target {
|
||||
scroll-margin-top: 50vh;
|
||||
}
|
||||
/* Draws a border around the footnote (including the marker) when it is selected.
|
||||
TODO: If there are multiple linkbacks, highlight which one you just came
|
||||
from so you know which one to click.
|
||||
*/
|
||||
.footnote-definition > li:target::before {
|
||||
border: 2px solid var(--footnote-highlight);
|
||||
border-radius: 6px;
|
||||
position: absolute;
|
||||
top: -8px;
|
||||
right: -8px;
|
||||
bottom: -8px;
|
||||
left: -32px;
|
||||
pointer-events: none;
|
||||
content: "";
|
||||
}
|
||||
/* Pulses the footnote reference so you can quickly see where you left off reading.
|
||||
This could use some improvement.
|
||||
*/
|
||||
@media not (prefers-reduced-motion) {
|
||||
.footnote-reference:target {
|
||||
animation: fn-highlight 0.8s;
|
||||
border-radius: 2px;
|
||||
}
|
||||
|
||||
@keyframes fn-highlight {
|
||||
from {
|
||||
background-color: var(--footnote-highlight);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.tooltiptext {
|
||||
position: absolute;
|
||||
visibility: hidden;
|
||||
color: #fff;
|
||||
background-color: #333;
|
||||
transform: translateX(-50%); /* Center by moving tooltip 50% of its width left */
|
||||
left: -8px; /* Half of the width of the icon */
|
||||
top: -35px;
|
||||
font-size: 0.8em;
|
||||
text-align: center;
|
||||
border-radius: 6px;
|
||||
padding: 5px 8px;
|
||||
margin: 5px;
|
||||
z-index: 1000;
|
||||
}
|
||||
.tooltipped .tooltiptext {
|
||||
visibility: visible;
|
||||
}
|
||||
|
||||
.chapter li.part-title {
|
||||
color: var(--sidebar-fg);
|
||||
margin: 5px 0px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.result-no-output {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.fa-svg svg {
|
||||
width: 1em;
|
||||
height: 1em;
|
||||
fill: currentColor;
|
||||
margin-bottom: -0.1em;
|
||||
}
|
||||
|
||||
dt {
|
||||
font-weight: bold;
|
||||
margin-top: 0.5em;
|
||||
margin-bottom: 0.1em;
|
||||
}
|
||||
|
||||
/* This uses a CSS counter to add numbers to definitions, but only if there is
|
||||
more than one definition. */
|
||||
dl, dt {
|
||||
counter-reset: dd-counter;
|
||||
}
|
||||
|
||||
/* When there is more than one definition, increment the counter. The first
|
||||
selector selects the first definition, and the second one selects definitions
|
||||
2 and beyond.*/
|
||||
dd:has(+ dd), dd + dd {
|
||||
counter-increment: dd-counter;
|
||||
/* Use flex display to help with positioning the numbers when there is a p
|
||||
tag inside the definition. */
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
/* Shows the counter for definitions. The first selector selects the first
|
||||
definition, and the second one selections definitions 2 and beyond.*/
|
||||
dd:has(+ dd)::before, dd + dd::before {
|
||||
content: counter(dd-counter) ". ";
|
||||
font-weight: 600;
|
||||
display: inline-block;
|
||||
margin-right: 0.5em;
|
||||
}
|
||||
|
||||
dd > p {
|
||||
/* For loose definitions that have a p tag inside, don't add a bunch of
|
||||
space before the definition. */
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
/* Remove some excess space from the bottom. */
|
||||
.blockquote-tag p:last-child {
|
||||
margin-bottom: 2px;
|
||||
}
|
||||
|
||||
.blockquote-tag {
|
||||
/* Add some padding to make the vertical bar a little taller than the text.*/
|
||||
padding: 2px 0px 2px 20px;
|
||||
/* Add a solid color bar on the left side. */
|
||||
border-inline-start-style: solid;
|
||||
border-inline-start-width: 4px;
|
||||
/* Disable the background color from normal blockquotes . */
|
||||
background-color: inherit;
|
||||
/* Disable border blocks from blockquotes. */
|
||||
border-block-start: none;
|
||||
border-block-end: none;
|
||||
}
|
||||
|
||||
.blockquote-tag-title svg {
|
||||
fill: currentColor;
|
||||
/* Add space between the icon and the title. */
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
.blockquote-tag-note {
|
||||
border-inline-start-color: var(--blockquote-note-color);
|
||||
}
|
||||
|
||||
.blockquote-tag-tip {
|
||||
border-inline-start-color: var(--blockquote-tip-color);
|
||||
}
|
||||
|
||||
.blockquote-tag-important {
|
||||
border-inline-start-color: var(--blockquote-important-color);
|
||||
}
|
||||
|
||||
.blockquote-tag-warning {
|
||||
border-inline-start-color: var(--blockquote-warning-color);
|
||||
}
|
||||
|
||||
.blockquote-tag-caution {
|
||||
border-inline-start-color: var(--blockquote-caution-color);
|
||||
}
|
||||
|
||||
.blockquote-tag-note > .blockquote-tag-title {
|
||||
color: var(--blockquote-note-color);
|
||||
}
|
||||
|
||||
.blockquote-tag-tip > .blockquote-tag-title {
|
||||
color: var(--blockquote-tip-color);
|
||||
}
|
||||
|
||||
.blockquote-tag-important > .blockquote-tag-title {
|
||||
color: var(--blockquote-important-color);
|
||||
}
|
||||
|
||||
.blockquote-tag-warning > .blockquote-tag-title {
|
||||
color: var(--blockquote-warning-color);
|
||||
}
|
||||
|
||||
.blockquote-tag-caution > .blockquote-tag-title {
|
||||
color: var(--blockquote-caution-color);
|
||||
}
|
||||
|
||||
.blockquote-tag-title {
|
||||
/* Slightly increase the weight for more emphasis. */
|
||||
font-weight: 600;
|
||||
/* Vertically center the icon with the text. */
|
||||
display: flex;
|
||||
align-items: center;
|
||||
/* Remove default large margins for a more compact display. */
|
||||
margin: 2px 0 8px 0;
|
||||
}
|
||||
|
||||
.blockquote-tag-title .fa-svg {
|
||||
fill: currentColor;
|
||||
/* Add some space between the icon and the text. */
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
/* All this code is to handle the "zoomable" images feature. */
|
||||
|
||||
/* This one makes the checkbox invisible while keeping it selectable with the keyboard (with the
|
||||
"tab" key). */
|
||||
.content .checkbox-img {
|
||||
position: absolute;
|
||||
width: 1px;
|
||||
height: 1px;
|
||||
padding: 0;
|
||||
margin: -1px;
|
||||
overflow: hidden;
|
||||
clip: rect(0, 0, 0, 0);
|
||||
white-space: nowrap;
|
||||
border: 0;
|
||||
}
|
||||
/* When the input is focused, we make it appear to the user by adding an outline to the img
|
||||
instead */
|
||||
.content .checkbox-img:focus + img {
|
||||
outline: auto;
|
||||
}
|
||||
/* The "zoomed-in" image is not displayed until the checkbox is "ticked". */
|
||||
.content .checkbox-img:not(:checked) ~ .img-wrapper {
|
||||
display: none;
|
||||
}
|
||||
.content .checkbox-label {
|
||||
display: block;
|
||||
max-width: 100%;
|
||||
}
|
||||
.content .checkbox-label img {
|
||||
cursor: zoom-in;
|
||||
}
|
||||
.content .checkbox-img:checked ~ .img-wrapper {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
background-color: rgba(0, 0, 0, 0.4);
|
||||
z-index: 1001;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
cursor: zoom-out;
|
||||
}
|
||||
.content .checkbox-img:checked ~ .img-wrapper > img {
|
||||
--img-padding: 5px;
|
||||
padding: var(--img-padding);
|
||||
background: #999;
|
||||
cursor: zoom-out;
|
||||
max-width: calc(100% - (var(--img-padding) * 2));
|
||||
max-height: calc(100% - (var(--img-padding) * 2));
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
|
||||
#mdbook-sidebar,
|
||||
#mdbook-menu-bar,
|
||||
.nav-chapters,
|
||||
.mobile-nav-chapters {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#mdbook-page-wrapper.page-wrapper {
|
||||
transform: none !important;
|
||||
margin-inline-start: 0px;
|
||||
overflow-y: initial;
|
||||
}
|
||||
|
||||
#mdbook-content {
|
||||
max-width: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.page {
|
||||
overflow-y: initial;
|
||||
}
|
||||
|
||||
code {
|
||||
direction: ltr !important;
|
||||
}
|
||||
|
||||
pre > .buttons {
|
||||
z-index: 2;
|
||||
}
|
||||
|
||||
a, a:visited, a:active, a:hover {
|
||||
color: #4183c4;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
page-break-inside: avoid;
|
||||
page-break-after: avoid;
|
||||
}
|
||||
|
||||
pre, code {
|
||||
page-break-inside: avoid;
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
.fa {
|
||||
display: none !important;
|
||||
}
|
||||
@@ -0,0 +1,383 @@
|
||||
|
||||
/* Globals */
|
||||
|
||||
:root {
|
||||
--sidebar-target-width: 300px;
|
||||
--sidebar-width: min(var(--sidebar-target-width), 80vw);
|
||||
--sidebar-resize-indicator-width: 8px;
|
||||
--sidebar-resize-indicator-space: 2px;
|
||||
--page-padding: 15px;
|
||||
--content-max-width: 750px;
|
||||
--menu-bar-height: 50px;
|
||||
--mono-font: "Source Code Pro", Consolas, "Ubuntu Mono", Menlo, "DejaVu Sans Mono", monospace, monospace;
|
||||
--code-font-size: 0.875em; /* please adjust the ace font size accordingly in editor.js */
|
||||
--searchbar-margin-block-start: 5px;
|
||||
}
|
||||
|
||||
/* Themes */
|
||||
|
||||
.ayu {
|
||||
--bg: hsl(210, 25%, 8%);
|
||||
--fg: #c5c5c5;
|
||||
|
||||
--sidebar-bg: #14191f;
|
||||
--sidebar-fg: #c8c9db;
|
||||
--sidebar-non-existant: #5c6773;
|
||||
--sidebar-active: #ffb454;
|
||||
--sidebar-spacer: #2d334f;
|
||||
|
||||
--scrollbar: var(--sidebar-fg);
|
||||
|
||||
--icons: #737480;
|
||||
--icons-hover: #b7b9cc;
|
||||
|
||||
--links: #0096cf;
|
||||
|
||||
--inline-code-color: #ffb454;
|
||||
|
||||
--theme-popup-bg: #14191f;
|
||||
--theme-popup-border: #5c6773;
|
||||
--theme-hover: #191f26;
|
||||
|
||||
--quote-bg: hsl(226, 15%, 17%);
|
||||
--quote-border: hsl(226, 15%, 22%);
|
||||
|
||||
--warning-border: #ff8e00;
|
||||
|
||||
--table-border-color: hsl(210, 25%, 13%);
|
||||
--table-header-bg: hsl(210, 25%, 28%);
|
||||
--table-alternate-bg: hsl(210, 25%, 11%);
|
||||
|
||||
--searchbar-border-color: #848484;
|
||||
--searchbar-bg: #424242;
|
||||
--searchbar-fg: #fff;
|
||||
--searchbar-shadow-color: #d4c89f;
|
||||
--searchresults-header-fg: #666;
|
||||
--searchresults-border-color: #888;
|
||||
--searchresults-li-bg: #252932;
|
||||
--search-mark-bg: #e3b171;
|
||||
|
||||
--color-scheme: dark;
|
||||
|
||||
/* Same as `--icons` */
|
||||
--copy-button-filter: invert(45%) sepia(6%) saturate(621%) hue-rotate(198deg) brightness(99%) contrast(85%);
|
||||
/* Same as `--sidebar-active` */
|
||||
--copy-button-filter-hover: invert(68%) sepia(55%) saturate(531%) hue-rotate(341deg) brightness(104%) contrast(101%);
|
||||
|
||||
--footnote-highlight: #2668a6;
|
||||
|
||||
--overlay-bg: rgba(33, 40, 48, 0.4);
|
||||
|
||||
--blockquote-note-color: #74b9ff;
|
||||
--blockquote-tip-color: #09ca09;
|
||||
--blockquote-important-color: #d3abff;
|
||||
--blockquote-warning-color: #f0b72f;
|
||||
--blockquote-caution-color: #f21424;
|
||||
|
||||
--sidebar-header-border-color: #c18639;
|
||||
}
|
||||
|
||||
.coal {
|
||||
--bg: hsl(200, 7%, 8%);
|
||||
--fg: #98a3ad;
|
||||
|
||||
--sidebar-bg: #292c2f;
|
||||
--sidebar-fg: #a1adb8;
|
||||
--sidebar-non-existant: #505254;
|
||||
--sidebar-active: #3473ad;
|
||||
--sidebar-spacer: #393939;
|
||||
|
||||
--scrollbar: var(--sidebar-fg);
|
||||
|
||||
--icons: #43484d;
|
||||
--icons-hover: #b3c0cc;
|
||||
|
||||
--links: #2b79a2;
|
||||
|
||||
--inline-code-color: #c5c8c6;
|
||||
|
||||
--theme-popup-bg: #141617;
|
||||
--theme-popup-border: #43484d;
|
||||
--theme-hover: #1f2124;
|
||||
|
||||
--quote-bg: hsl(234, 21%, 18%);
|
||||
--quote-border: hsl(234, 21%, 23%);
|
||||
|
||||
--warning-border: #ff8e00;
|
||||
|
||||
--table-border-color: hsl(200, 7%, 13%);
|
||||
--table-header-bg: hsl(200, 7%, 28%);
|
||||
--table-alternate-bg: hsl(200, 7%, 11%);
|
||||
|
||||
--searchbar-border-color: #aaa;
|
||||
--searchbar-bg: #b7b7b7;
|
||||
--searchbar-fg: #000;
|
||||
--searchbar-shadow-color: #aaa;
|
||||
--searchresults-header-fg: #666;
|
||||
--searchresults-border-color: #98a3ad;
|
||||
--searchresults-li-bg: #2b2b2f;
|
||||
--search-mark-bg: #355c7d;
|
||||
|
||||
--color-scheme: dark;
|
||||
|
||||
/* Same as `--icons` */
|
||||
--copy-button-filter: invert(26%) sepia(8%) saturate(575%) hue-rotate(169deg) brightness(87%) contrast(82%);
|
||||
/* Same as `--sidebar-active` */
|
||||
--copy-button-filter-hover: invert(36%) sepia(70%) saturate(503%) hue-rotate(167deg) brightness(98%) contrast(89%);
|
||||
|
||||
--footnote-highlight: #4079ae;
|
||||
|
||||
--overlay-bg: rgba(33, 40, 48, 0.4);
|
||||
|
||||
--blockquote-note-color: #4493f8;
|
||||
--blockquote-tip-color: #08ae08;
|
||||
--blockquote-important-color: #ab7df8;
|
||||
--blockquote-warning-color: #d29922;
|
||||
--blockquote-caution-color: #d91b29;
|
||||
|
||||
--sidebar-header-border-color: #3473ad;
|
||||
}
|
||||
|
||||
.light, html:not(.js) {
|
||||
--bg: hsl(0, 0%, 100%);
|
||||
--fg: hsl(0, 0%, 0%);
|
||||
|
||||
--sidebar-bg: #fafafa;
|
||||
--sidebar-fg: hsl(0, 0%, 0%);
|
||||
--sidebar-non-existant: #aaaaaa;
|
||||
--sidebar-active: #1f1fff;
|
||||
--sidebar-spacer: #f4f4f4;
|
||||
|
||||
--scrollbar: #8F8F8F;
|
||||
|
||||
--icons: #747474;
|
||||
--icons-hover: #000000;
|
||||
|
||||
--links: #20609f;
|
||||
|
||||
--inline-code-color: #301900;
|
||||
|
||||
--theme-popup-bg: #fafafa;
|
||||
--theme-popup-border: #cccccc;
|
||||
--theme-hover: #e6e6e6;
|
||||
|
||||
--quote-bg: hsl(197, 37%, 96%);
|
||||
--quote-border: hsl(197, 37%, 91%);
|
||||
|
||||
--warning-border: #ff8e00;
|
||||
|
||||
--table-border-color: hsl(0, 0%, 95%);
|
||||
--table-header-bg: hsl(0, 0%, 80%);
|
||||
--table-alternate-bg: hsl(0, 0%, 97%);
|
||||
|
||||
--searchbar-border-color: #aaa;
|
||||
--searchbar-bg: #fafafa;
|
||||
--searchbar-fg: #000;
|
||||
--searchbar-shadow-color: #aaa;
|
||||
--searchresults-header-fg: #666;
|
||||
--searchresults-border-color: #888;
|
||||
--searchresults-li-bg: #e4f2fe;
|
||||
--search-mark-bg: #a2cff5;
|
||||
|
||||
--color-scheme: light;
|
||||
|
||||
/* Same as `--icons` */
|
||||
--copy-button-filter: invert(45.49%);
|
||||
/* Same as `--sidebar-active` */
|
||||
--copy-button-filter-hover: invert(14%) sepia(93%) saturate(4250%) hue-rotate(243deg) brightness(99%) contrast(130%);
|
||||
|
||||
--footnote-highlight: #7e7eff;
|
||||
|
||||
--overlay-bg: rgba(200, 200, 205, 0.4);
|
||||
|
||||
--blockquote-note-color: #0969da;
|
||||
--blockquote-tip-color: #008000;
|
||||
--blockquote-important-color: #8250df;
|
||||
--blockquote-warning-color: #9a6700;
|
||||
--blockquote-caution-color: #b52731;
|
||||
|
||||
--sidebar-header-border-color: #6e6edb;
|
||||
}
|
||||
|
||||
.navy {
|
||||
--bg: hsl(226, 23%, 11%);
|
||||
--fg: #bcbdd0;
|
||||
|
||||
--sidebar-bg: #282d3f;
|
||||
--sidebar-fg: #c8c9db;
|
||||
--sidebar-non-existant: #505274;
|
||||
--sidebar-active: #2b79a2;
|
||||
--sidebar-spacer: #2d334f;
|
||||
|
||||
--scrollbar: var(--sidebar-fg);
|
||||
|
||||
--icons: #737480;
|
||||
--icons-hover: #b7b9cc;
|
||||
|
||||
--links: #2b79a2;
|
||||
|
||||
--inline-code-color: #c5c8c6;
|
||||
|
||||
--theme-popup-bg: #161923;
|
||||
--theme-popup-border: #737480;
|
||||
--theme-hover: #282e40;
|
||||
|
||||
--quote-bg: hsl(226, 15%, 17%);
|
||||
--quote-border: hsl(226, 15%, 22%);
|
||||
|
||||
--warning-border: #ff8e00;
|
||||
|
||||
--table-border-color: hsl(226, 23%, 16%);
|
||||
--table-header-bg: hsl(226, 23%, 31%);
|
||||
--table-alternate-bg: hsl(226, 23%, 14%);
|
||||
|
||||
--searchbar-border-color: #aaa;
|
||||
--searchbar-bg: #aeaec6;
|
||||
--searchbar-fg: #000;
|
||||
--searchbar-shadow-color: #aaa;
|
||||
--searchresults-header-fg: #5f5f71;
|
||||
--searchresults-border-color: #5c5c68;
|
||||
--searchresults-li-bg: #242430;
|
||||
--search-mark-bg: #a2cff5;
|
||||
|
||||
--color-scheme: dark;
|
||||
|
||||
/* Same as `--icons` */
|
||||
--copy-button-filter: invert(51%) sepia(10%) saturate(393%) hue-rotate(198deg) brightness(86%) contrast(87%);
|
||||
/* Same as `--sidebar-active` */
|
||||
--copy-button-filter-hover: invert(46%) sepia(20%) saturate(1537%) hue-rotate(156deg) brightness(85%) contrast(90%);
|
||||
|
||||
--footnote-highlight: #4079ae;
|
||||
|
||||
--overlay-bg: rgba(33, 40, 48, 0.4);
|
||||
|
||||
--blockquote-note-color: #4493f8;
|
||||
--blockquote-tip-color: #09ca09;
|
||||
--blockquote-important-color: #ab7df8;
|
||||
--blockquote-warning-color: #d29922;
|
||||
--blockquote-caution-color: #f21424;
|
||||
|
||||
--sidebar-header-border-color: #2f6ab5;
|
||||
}
|
||||
|
||||
.rust {
|
||||
--bg: hsl(60, 9%, 87%);
|
||||
--fg: #262625;
|
||||
|
||||
--sidebar-bg: #3b2e2a;
|
||||
--sidebar-fg: #c8c9db;
|
||||
--sidebar-non-existant: #505254;
|
||||
--sidebar-active: #e69f67;
|
||||
--sidebar-spacer: #45373a;
|
||||
|
||||
--scrollbar: var(--sidebar-fg);
|
||||
|
||||
--icons: #737480;
|
||||
--icons-hover: #262625;
|
||||
|
||||
--links: #2b79a2;
|
||||
|
||||
--inline-code-color: #6e6b5e;
|
||||
|
||||
--theme-popup-bg: #e1e1db;
|
||||
--theme-popup-border: #b38f6b;
|
||||
--theme-hover: #99908a;
|
||||
|
||||
--quote-bg: hsl(60, 5%, 75%);
|
||||
--quote-border: hsl(60, 5%, 70%);
|
||||
|
||||
--warning-border: #ff8e00;
|
||||
|
||||
--table-border-color: hsl(60, 9%, 82%);
|
||||
--table-header-bg: #b3a497;
|
||||
--table-alternate-bg: hsl(60, 9%, 84%);
|
||||
|
||||
--searchbar-border-color: #aaa;
|
||||
--searchbar-bg: #fafafa;
|
||||
--searchbar-fg: #000;
|
||||
--searchbar-shadow-color: #aaa;
|
||||
--searchresults-header-fg: #666;
|
||||
--searchresults-border-color: #888;
|
||||
--searchresults-li-bg: #dec2a2;
|
||||
--search-mark-bg: #e69f67;
|
||||
|
||||
/* Same as `--icons` */
|
||||
--copy-button-filter: invert(51%) sepia(10%) saturate(393%) hue-rotate(198deg) brightness(86%) contrast(87%);
|
||||
/* Same as `--sidebar-active` */
|
||||
--copy-button-filter-hover: invert(77%) sepia(16%) saturate(1798%) hue-rotate(328deg) brightness(98%) contrast(83%);
|
||||
|
||||
--footnote-highlight: #d3a17a;
|
||||
|
||||
--overlay-bg: rgba(150, 150, 150, 0.25);
|
||||
|
||||
--blockquote-note-color: #023b95;
|
||||
--blockquote-tip-color: #007700;
|
||||
--blockquote-important-color: #8250df;
|
||||
--blockquote-warning-color: #603700;
|
||||
--blockquote-caution-color: #aa1721;
|
||||
|
||||
--sidebar-header-border-color: #8c391f;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
html:not(.js) {
|
||||
--bg: hsl(200, 7%, 8%);
|
||||
--fg: #98a3ad;
|
||||
|
||||
--sidebar-bg: #292c2f;
|
||||
--sidebar-fg: #a1adb8;
|
||||
--sidebar-non-existant: #505254;
|
||||
--sidebar-active: #3473ad;
|
||||
--sidebar-spacer: #393939;
|
||||
|
||||
--scrollbar: var(--sidebar-fg);
|
||||
|
||||
--icons: #43484d;
|
||||
--icons-hover: #b3c0cc;
|
||||
|
||||
--links: #2b79a2;
|
||||
|
||||
--inline-code-color: #c5c8c6;
|
||||
|
||||
--theme-popup-bg: #141617;
|
||||
--theme-popup-border: #43484d;
|
||||
--theme-hover: #1f2124;
|
||||
|
||||
--quote-bg: hsl(234, 21%, 18%);
|
||||
--quote-border: hsl(234, 21%, 23%);
|
||||
|
||||
--warning-border: #ff8e00;
|
||||
|
||||
--table-border-color: hsl(200, 7%, 13%);
|
||||
--table-header-bg: hsl(200, 7%, 28%);
|
||||
--table-alternate-bg: hsl(200, 7%, 11%);
|
||||
|
||||
--searchbar-border-color: #aaa;
|
||||
--searchbar-bg: #b7b7b7;
|
||||
--searchbar-fg: #000;
|
||||
--searchbar-shadow-color: #aaa;
|
||||
--searchresults-header-fg: #666;
|
||||
--searchresults-border-color: #98a3ad;
|
||||
--searchresults-li-bg: #2b2b2f;
|
||||
--search-mark-bg: #355c7d;
|
||||
|
||||
--color-scheme: dark;
|
||||
|
||||
/* Same as `--icons` */
|
||||
--copy-button-filter: invert(26%) sepia(8%) saturate(575%) hue-rotate(169deg) brightness(87%) contrast(82%);
|
||||
/* Same as `--sidebar-active` */
|
||||
--copy-button-filter-hover: invert(36%) sepia(70%) saturate(503%) hue-rotate(167deg) brightness(98%) contrast(89%);
|
||||
|
||||
--footnote-highlight: #4079ae;
|
||||
|
||||
--overlay-bg: rgba(33, 40, 48, 0.4);
|
||||
|
||||
--blockquote-note-color: #4493f8;
|
||||
--blockquote-tip-color: #08ae08;
|
||||
--blockquote-important-color: #ab7df8;
|
||||
--blockquote-warning-color: #d29922;
|
||||
--blockquote-caution-color: #d91b29;
|
||||
|
||||
--sidebar-header-border-color: #3473ad;
|
||||
}
|
||||
}
|
||||
-50
@@ -1,50 +0,0 @@
|
||||
{
|
||||
pkgs ? import <nixpkgs> { },
|
||||
}:
|
||||
|
||||
let
|
||||
path = builtins.path {
|
||||
path = ./.;
|
||||
name = "home-manager-source";
|
||||
};
|
||||
|
||||
nixpkgs = (
|
||||
import (
|
||||
let
|
||||
lock = builtins.fromJSON (builtins.readFile ./flake.lock);
|
||||
n = lock.nodes.nixpkgs.locked;
|
||||
in
|
||||
fetchTarball {
|
||||
url = "https://github.com/${n.owner}/${n.repo}/archive/${n.rev}.tar.gz";
|
||||
sha256 = n.narHash;
|
||||
}
|
||||
) { }
|
||||
);
|
||||
in
|
||||
rec {
|
||||
docs =
|
||||
let
|
||||
releaseInfo = pkgs.lib.importJSON ./release.json;
|
||||
in
|
||||
with import ./docs {
|
||||
inherit pkgs;
|
||||
inherit (releaseInfo) release isReleaseBranch;
|
||||
};
|
||||
{
|
||||
|
||||
inherit manPages jsonModuleMaintainers;
|
||||
inherit (manual) html htmlOpenTool;
|
||||
inherit (options) json;
|
||||
};
|
||||
|
||||
home-manager = pkgs.callPackage ./home-manager { inherit path; };
|
||||
|
||||
install = pkgs.callPackage ./home-manager/install.nix { inherit home-manager; };
|
||||
|
||||
nixos = import ./nixos;
|
||||
lib = import ./lib { inherit (pkgs) lib; };
|
||||
|
||||
dev = nixpkgs.callPackage ./home-manager/devShell.nix { };
|
||||
|
||||
inherit path;
|
||||
}
|
||||
@@ -1,314 +0,0 @@
|
||||
{
|
||||
pkgs,
|
||||
|
||||
# Note, this should be "the standard library" + HM extensions.
|
||||
lib ? import ../modules/lib/stdlib-extended.nix pkgs.lib,
|
||||
|
||||
release,
|
||||
isReleaseBranch,
|
||||
}:
|
||||
|
||||
let
|
||||
|
||||
# Recursively replace each derivation in the given attribute set
|
||||
# with the same derivation but with the `outPath` attribute set to
|
||||
# the string `"\${pkgs.attribute.path}"`. This allows the
|
||||
# documentation to refer to derivations through their values without
|
||||
# establishing an actual dependency on the derivation output.
|
||||
#
|
||||
# This is not perfect, but it seems to cover a vast majority of use
|
||||
# cases.
|
||||
#
|
||||
# Caveat: even if the package is reached by a different means, the
|
||||
# path above will be shown and not e.g.
|
||||
# `${config.services.foo.package}`.
|
||||
scrubDerivations =
|
||||
prefixPath: attrs:
|
||||
let
|
||||
scrubDerivation =
|
||||
name: value:
|
||||
let
|
||||
pkgAttrName = prefixPath + "." + name;
|
||||
in
|
||||
if lib.isAttrs value then
|
||||
scrubDerivations pkgAttrName value
|
||||
// lib.optionalAttrs (lib.isDerivation value) {
|
||||
outPath = "\${${pkgAttrName}}";
|
||||
}
|
||||
else
|
||||
value;
|
||||
in
|
||||
lib.mapAttrs scrubDerivation attrs;
|
||||
|
||||
# Make sure the used package is scrubbed to avoid actually
|
||||
# instantiating derivations.
|
||||
scrubbedPkgsModule = {
|
||||
imports = [
|
||||
{
|
||||
_module.args = {
|
||||
pkgs = lib.mkForce (scrubDerivations "pkgs" pkgs);
|
||||
pkgs_i686 = lib.mkForce { };
|
||||
};
|
||||
}
|
||||
];
|
||||
};
|
||||
|
||||
dontCheckDefinitions = {
|
||||
_module.check = false;
|
||||
};
|
||||
|
||||
gitHubDeclaration =
|
||||
user: repo: subpath:
|
||||
let
|
||||
urlRef = if isReleaseBranch then "release-${release}" else "master";
|
||||
in
|
||||
{
|
||||
url = "https://github.com/${user}/${repo}/blob/${urlRef}/${subpath}";
|
||||
name = "<${repo}/${subpath}>";
|
||||
};
|
||||
|
||||
hmPath = toString ./..;
|
||||
|
||||
# Keep submodule option docs visible when wrapped in `either` (and therefore
|
||||
# in `nullOr (either ...)`), which upstream currently omits.
|
||||
docsLib = lib.extend (
|
||||
_self: super:
|
||||
let
|
||||
mergeEitherSubOptions =
|
||||
prefix: leftType: rightType:
|
||||
let
|
||||
getSubOptionsOrEmpty =
|
||||
optionType:
|
||||
let
|
||||
subOptions = optionType.getSubOptions prefix;
|
||||
in
|
||||
if builtins.isAttrs subOptions then subOptions else { };
|
||||
|
||||
mkOptionDecl = options: {
|
||||
_file = "<docs/default.nix>";
|
||||
pos = null;
|
||||
inherit options;
|
||||
};
|
||||
|
||||
optionSets = lib.filter (options: options != { }) [
|
||||
(getSubOptionsOrEmpty leftType)
|
||||
(getSubOptionsOrEmpty rightType)
|
||||
];
|
||||
mergedOptions = lib.foldl' (
|
||||
acc: options:
|
||||
if acc == { } then
|
||||
options
|
||||
else
|
||||
(super.mergeOptionDecls prefix [
|
||||
(mkOptionDecl acc)
|
||||
(mkOptionDecl options)
|
||||
]).options
|
||||
) { } optionSets;
|
||||
in
|
||||
mergedOptions;
|
||||
|
||||
in
|
||||
{
|
||||
types = super.types // {
|
||||
either =
|
||||
leftType: rightType:
|
||||
(super.types.either leftType rightType)
|
||||
// {
|
||||
getSubOptions = prefix: mergeEitherSubOptions prefix leftType rightType;
|
||||
};
|
||||
};
|
||||
}
|
||||
);
|
||||
|
||||
buildOptionsDocs =
|
||||
args@{
|
||||
modules,
|
||||
includeModuleSystemOptions ? true,
|
||||
...
|
||||
}:
|
||||
let
|
||||
# to discourage references from option descriptions and defaults.
|
||||
poisonModule =
|
||||
let
|
||||
poisonAttr = n: {
|
||||
name = n;
|
||||
value = abort ''
|
||||
error: the option documentation has a dependency on the configuration.
|
||||
|
||||
You may, for example, have added an option attribute like
|
||||
|
||||
default = ''${config.some.value};
|
||||
|
||||
Since the default value is included in the Home Manager manual, this
|
||||
would make the manual depend on the user's configuration.
|
||||
|
||||
To avoid this problem in this particular case, consider changing to
|
||||
|
||||
default = ''${config.some.value};
|
||||
defaultText = lib.literalExpression "\\''${config.some.value}";'';
|
||||
};
|
||||
in
|
||||
{ options, ... }:
|
||||
{
|
||||
config = lib.listToAttrs (map poisonAttr (lib.filter (n: n != "_module") (lib.attrNames options)));
|
||||
};
|
||||
|
||||
inherit
|
||||
(
|
||||
(docsLib.evalModules {
|
||||
modules = modules ++ [ poisonModule ];
|
||||
class = "homeManager";
|
||||
})
|
||||
)
|
||||
options
|
||||
;
|
||||
in
|
||||
pkgs.buildPackages.nixosOptionsDoc (
|
||||
{
|
||||
options = if includeModuleSystemOptions then options else removeAttrs options [ "_module" ];
|
||||
transformOptions =
|
||||
opt:
|
||||
opt
|
||||
// {
|
||||
# Clean up declaration sites to not refer to the Home Manager
|
||||
# source tree.
|
||||
declarations = map (
|
||||
decl:
|
||||
if lib.hasPrefix hmPath (toString decl) then
|
||||
gitHubDeclaration "nix-community" "home-manager" (
|
||||
lib.removePrefix "/" (lib.removePrefix hmPath (toString decl))
|
||||
)
|
||||
else if decl == "lib/modules.nix" then
|
||||
# TODO: handle this in a better way (may require upstream
|
||||
# changes to nixpkgs)
|
||||
gitHubDeclaration "NixOS" "nixpkgs" decl
|
||||
else
|
||||
decl
|
||||
) opt.declarations;
|
||||
};
|
||||
}
|
||||
// removeAttrs args [
|
||||
"modules"
|
||||
"includeModuleSystemOptions"
|
||||
]
|
||||
);
|
||||
|
||||
hmOptionsDocs = buildOptionsDocs {
|
||||
modules =
|
||||
import ../modules/modules.nix {
|
||||
lib = docsLib;
|
||||
inherit pkgs;
|
||||
check = false;
|
||||
}
|
||||
++ [ scrubbedPkgsModule ];
|
||||
variablelistId = "home-manager-options";
|
||||
};
|
||||
|
||||
nixosOptionsDocs = buildOptionsDocs {
|
||||
modules = [
|
||||
../nixos
|
||||
scrubbedPkgsModule
|
||||
dontCheckDefinitions
|
||||
];
|
||||
includeModuleSystemOptions = false;
|
||||
variablelistId = "nixos-options";
|
||||
optionIdPrefix = "nixos-opt-";
|
||||
};
|
||||
|
||||
nixDarwinOptionsDocs = buildOptionsDocs {
|
||||
modules = [
|
||||
../nix-darwin
|
||||
scrubbedPkgsModule
|
||||
dontCheckDefinitions
|
||||
];
|
||||
includeModuleSystemOptions = false;
|
||||
variablelistId = "nix-darwin-options";
|
||||
optionIdPrefix = "nix-darwin-opt-";
|
||||
};
|
||||
|
||||
release-config = builtins.fromJSON (builtins.readFile ../release.json);
|
||||
revision = "release-${release-config.release}";
|
||||
# Generate the `man home-configuration.nix` package
|
||||
home-configuration-manual =
|
||||
pkgs.runCommand "home-configuration-reference-manpage"
|
||||
{
|
||||
nativeBuildInputs = [
|
||||
pkgs.buildPackages.installShellFiles
|
||||
pkgs.nixos-render-docs
|
||||
];
|
||||
allowedReferences = [ "out" ];
|
||||
}
|
||||
''
|
||||
# Generate manpages.
|
||||
mkdir -p $out/share/man/man5
|
||||
mkdir -p $out/share/man/man1
|
||||
nixos-render-docs -j $NIX_BUILD_CORES options manpage \
|
||||
--revision ${revision} \
|
||||
--header ${./home-configuration-nix-header.5} \
|
||||
--footer ${./home-configuration-nix-footer.5} \
|
||||
${hmOptionsDocs.optionsJSON}/share/doc/nixos/options.json \
|
||||
$out/share/man/man5/home-configuration.nix.5
|
||||
cp ${./home-manager.1} $out/share/man/man1/home-manager.1
|
||||
'';
|
||||
# Generate the HTML manual pages
|
||||
home-manager-manual = pkgs.callPackage ./home-manager-manual.nix {
|
||||
home-manager-options = {
|
||||
home-manager = {
|
||||
json = hmOptionsDocs.optionsJSON;
|
||||
};
|
||||
nixos = {
|
||||
json = nixosOptionsDocs.optionsJSON;
|
||||
};
|
||||
nix-darwin = {
|
||||
json = nixDarwinOptionsDocs.optionsJSON;
|
||||
};
|
||||
};
|
||||
inherit revision;
|
||||
};
|
||||
html = home-manager-manual;
|
||||
htmlOpenTool = pkgs.callPackage ./html-open-tool.nix { } { inherit html; };
|
||||
in
|
||||
{
|
||||
options = {
|
||||
# TODO: Use `hmOptionsDocs.optionsJSON` directly once upstream
|
||||
# `nixosOptionsDoc` is more customizable.
|
||||
json =
|
||||
pkgs.runCommand "options.json"
|
||||
{
|
||||
meta.description = "List of Home Manager options in JSON format";
|
||||
}
|
||||
''
|
||||
mkdir -p $out/{share/doc,nix-support}
|
||||
cp -a ${hmOptionsDocs.optionsJSON}/share/doc/nixos $out/share/doc/home-manager
|
||||
substitute \
|
||||
${hmOptionsDocs.optionsJSON}/nix-support/hydra-build-products \
|
||||
$out/nix-support/hydra-build-products \
|
||||
--replace-fail \
|
||||
'${hmOptionsDocs.optionsJSON}/share/doc/nixos' \
|
||||
"$out/share/doc/home-manager"
|
||||
'';
|
||||
};
|
||||
|
||||
manPages = home-configuration-manual;
|
||||
|
||||
manual = { inherit html htmlOpenTool; };
|
||||
|
||||
# Unstable, mainly for CI.
|
||||
jsonModuleMaintainers = pkgs.writeText "hm-module-maintainers.json" (
|
||||
let
|
||||
result = lib.evalModules {
|
||||
modules =
|
||||
import ../modules/modules.nix {
|
||||
inherit lib pkgs;
|
||||
check = false;
|
||||
}
|
||||
++ [ scrubbedPkgsModule ];
|
||||
class = "homeManager";
|
||||
};
|
||||
in
|
||||
builtins.toJSON result.config.meta.maintainers
|
||||
);
|
||||
|
||||
# Unstable, for tests.
|
||||
_internal = { inherit docsLib; };
|
||||
}
|
||||
Generated
-45
@@ -1,45 +0,0 @@
|
||||
{
|
||||
"nodes": {
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1779877693,
|
||||
"narHash": "sha256-NOF9NAREhxr50bbBfVcVOq+ArCMSoe8dP79Pk2uyARk=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "4100e830e085863741bc69b156ec4ccd53ab5be0",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixpkgs-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"nixpkgs": "nixpkgs",
|
||||
"scss-reset": "scss-reset"
|
||||
}
|
||||
},
|
||||
"scss-reset": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1683906868,
|
||||
"narHash": "sha256-cif5Sx8Ca5vxdw/mNAgpulLH15TwmzyJFNM7JURpoaE=",
|
||||
"owner": "andreymatin",
|
||||
"repo": "scss-reset",
|
||||
"rev": "5a7bd491ac82441e6283fb0d5d54644b913b30c7",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "andreymatin",
|
||||
"ref": "1.4.2",
|
||||
"repo": "scss-reset",
|
||||
"type": "github"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
||||
@@ -1,88 +0,0 @@
|
||||
{
|
||||
description = "Support developing Home Manager documentation";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
|
||||
scss-reset = {
|
||||
url = "github:andreymatin/scss-reset/1.4.2";
|
||||
flake = false;
|
||||
};
|
||||
};
|
||||
|
||||
outputs =
|
||||
{
|
||||
nixpkgs,
|
||||
scss-reset,
|
||||
...
|
||||
}:
|
||||
let
|
||||
supportedSystems = [
|
||||
"aarch64-darwin"
|
||||
"aarch64-linux"
|
||||
"i686-linux"
|
||||
"x86_64-darwin"
|
||||
"x86_64-linux"
|
||||
];
|
||||
|
||||
# Note, this should be "the standard library" + HM extensions.
|
||||
lib = import ../modules/lib/stdlib-extended.nix nixpkgs.lib;
|
||||
|
||||
forAllSystems = lib.genAttrs supportedSystems;
|
||||
|
||||
flakePkgs = pkgs: {
|
||||
p-build = pkgs.writeShellScriptBin "p-build" ''
|
||||
set -euo pipefail
|
||||
|
||||
export PATH=${
|
||||
lib.makeBinPath [
|
||||
pkgs.coreutils
|
||||
pkgs.rsass
|
||||
]
|
||||
}
|
||||
|
||||
tmpfile=$(mktemp -d)
|
||||
trap "rm -r $tmpfile" EXIT
|
||||
|
||||
ln -s "${scss-reset}/build" "$tmpfile/scss-reset"
|
||||
|
||||
rsass --load-path="$tmpfile" --style compressed \
|
||||
./static/style.scss > ./static/style.css
|
||||
echo "Generated ./static/style.css"
|
||||
'';
|
||||
};
|
||||
|
||||
releaseInfo = lib.importJSON ../release.json;
|
||||
in
|
||||
{
|
||||
devShells = forAllSystems (
|
||||
system:
|
||||
let
|
||||
pkgs = nixpkgs.legacyPackages.${system};
|
||||
fpkgs = flakePkgs pkgs;
|
||||
in
|
||||
{
|
||||
default = pkgs.mkShell {
|
||||
name = "hm-docs";
|
||||
packages = [ fpkgs.p-build ];
|
||||
};
|
||||
}
|
||||
);
|
||||
|
||||
# Expose the docs outputs
|
||||
packages = forAllSystems (
|
||||
system:
|
||||
let
|
||||
pkgs = nixpkgs.legacyPackages.${system};
|
||||
docs = import ./default.nix {
|
||||
inherit pkgs lib;
|
||||
inherit (releaseInfo) isReleaseBranch release;
|
||||
};
|
||||
in
|
||||
{
|
||||
inherit (docs) manPages jsonModuleMaintainers;
|
||||
inherit (docs.manual) html htmlOpenTool;
|
||||
inherit (docs.options) json;
|
||||
}
|
||||
);
|
||||
};
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
.SH "AUTHORS"
|
||||
.PP
|
||||
Home Manager contributors
|
||||
@@ -1,17 +0,0 @@
|
||||
.TH "HOME-CONFIGURATION\&.NIX" "5" "01/01/1980" "Home Manager"
|
||||
.\" disable hyphenation
|
||||
.nh
|
||||
.\" disable justification (adjust text to left margin only)
|
||||
.ad l
|
||||
.\" enable line breaks after slashes
|
||||
.cflags 4 /
|
||||
.SH "NAME"
|
||||
\fIhome\-configuration\&.nix\fP \- Home Manager configuration specification
|
||||
.SH "DESCRIPTION"
|
||||
.sp
|
||||
The file ~/\&.config/home\-manager/home\&.nix contains the declarative specification of your Home Manager configuration\&. The command \fBhome\-manager\fR takes this file and realises the user environment configuration specified therein\&.
|
||||
.SH "OPTIONS"
|
||||
.PP
|
||||
You can use the following options in
|
||||
home\-configuration\&.nix:
|
||||
.PP
|
||||
@@ -1,91 +0,0 @@
|
||||
{
|
||||
stdenv,
|
||||
lib,
|
||||
callPackage,
|
||||
mdbook,
|
||||
python3,
|
||||
revision,
|
||||
home-manager-options,
|
||||
}:
|
||||
let
|
||||
outputPath = "share/doc/home-manager";
|
||||
mdbookOptions = callPackage ./mdbook/options.nix {
|
||||
manpageUrls = ./manual/manpage-urls.json;
|
||||
inherit revision;
|
||||
optionDocs = {
|
||||
home-manager = {
|
||||
title = "Home Manager Configuration Options";
|
||||
path = "home-manager";
|
||||
prefix = "opt-";
|
||||
json = "${home-manager-options.home-manager.json}";
|
||||
};
|
||||
nixos = {
|
||||
title = "NixOS Configuration Options";
|
||||
path = "nixos";
|
||||
prefix = "nixos-opt-";
|
||||
json = "${home-manager-options.nixos.json}";
|
||||
};
|
||||
nix-darwin = {
|
||||
title = "nix-darwin Configuration Options";
|
||||
path = "nix-darwin";
|
||||
prefix = "nix-darwin-opt-";
|
||||
json = "${home-manager-options.nix-darwin.json}";
|
||||
};
|
||||
};
|
||||
};
|
||||
in
|
||||
stdenv.mkDerivation {
|
||||
name = "home-manager-manual";
|
||||
|
||||
nativeBuildInputs = [
|
||||
mdbook
|
||||
python3
|
||||
];
|
||||
|
||||
src = ./.;
|
||||
|
||||
buildPhase = ''
|
||||
runHook preBuild
|
||||
|
||||
mkdir -p source
|
||||
python3 ${./mdbook/convert-markup.py} "$src/manual" source
|
||||
python3 ${./mdbook/convert-markup.py} \
|
||||
--base-depth 1 \
|
||||
"$src/release-notes" \
|
||||
source/release-notes
|
||||
|
||||
cp -r ${mdbookOptions}/options source/options
|
||||
|
||||
python3 ${./mdbook/substitute-summary.py} \
|
||||
source/SUMMARY.md \
|
||||
${mdbookOptions}/summary/home-manager.md \
|
||||
${mdbookOptions}/summary/nixos.md \
|
||||
${mdbookOptions}/summary/nix-darwin.md
|
||||
|
||||
mdbook build source --dest-dir book
|
||||
|
||||
mkdir -p out
|
||||
cp -r book/* out/
|
||||
|
||||
python3 ${./mdbook/legacy-redirects.py} source out
|
||||
|
||||
runHook postBuild
|
||||
'';
|
||||
|
||||
installPhase = ''
|
||||
dest="$out/${outputPath}"
|
||||
mkdir -p "$(dirname "$dest")"
|
||||
mv out "$dest"
|
||||
|
||||
mkdir -p $out/nix-support/
|
||||
echo "doc manual $dest index.html" >> $out/nix-support/hydra-build-products
|
||||
'';
|
||||
|
||||
passthru = {
|
||||
inherit home-manager-options mdbookOptions;
|
||||
};
|
||||
|
||||
meta = {
|
||||
maintainers = [ lib.maintainers.considerate ];
|
||||
};
|
||||
}
|
||||
@@ -1,424 +0,0 @@
|
||||
.Dd January 1, 1980
|
||||
.Dt home-manager 1
|
||||
.Os Home Manager
|
||||
.\" disable hyphenation
|
||||
.nh
|
||||
.\" disable justification (adjust text to left margin only)
|
||||
.ad l
|
||||
.\" enable line breaks after slashes
|
||||
.cflags 4 /
|
||||
.Sh NAME
|
||||
.Nm home-manager
|
||||
.Nd reconfigure a user environment
|
||||
.
|
||||
.
|
||||
.
|
||||
.Sh SYNOPSIS
|
||||
.Nm home-manager
|
||||
.Bro
|
||||
.Cm build
|
||||
.Cm | init Op Fl -switch Ar dir
|
||||
.Cm | instantiate
|
||||
.Cm | edit
|
||||
.Cm | expire-generations Ar timestamp
|
||||
.Cm | generations
|
||||
.Cm | help
|
||||
.Cm | news
|
||||
.Cm | option Oo Fl -recursive Oc Ar option.name
|
||||
.Cm | packages
|
||||
.Cm | remove-generations Ar ID \&...
|
||||
.Cm | switch
|
||||
.Op Fl -rollback
|
||||
.Op Bro Fl c | Fl -specialisation Brc Ar NAME
|
||||
.Cm | uninstall
|
||||
.Brc
|
||||
.Op Fl A Ar attrPath
|
||||
.Op Fl I Ar path
|
||||
.Op Fl -flake Ar flake-uri
|
||||
.Op Fl b Ar ext
|
||||
.Op Bro Fl f | Fl -file Brc Ar path
|
||||
.Op Bro Fl h | Fl -help Brc
|
||||
.Op Fl -version
|
||||
.Op Bro Fl n | Fl -dry-run Brc
|
||||
.Op Fl -option Ar name Ar value
|
||||
.Op Fl -cores Ar number
|
||||
.Op Bro Fl j | Fl -max-jobs Brc Ar number
|
||||
.Op Fl -option
|
||||
.Op Fl -impure
|
||||
.Op Fl -keep-failed
|
||||
.Op Fl -keep-going
|
||||
.Op Bro Fl L | Fl -print-build-logs Brc
|
||||
.Op Fl -log-format
|
||||
.Op Fl -show-trace
|
||||
.Op Fl -(no-)substitute
|
||||
.Op Fl -no-out-link
|
||||
.Op Fl -refresh
|
||||
.Op Bro Fl v | Fl -verbose Brc
|
||||
.
|
||||
.Sh DESCRIPTION
|
||||
.Pp
|
||||
This command updates the user environment so that it corresponds to the configuration specified in
|
||||
$XDG_CONFIG_HOME/home-manager/home.nix
|
||||
or
|
||||
$XDG_CONFIG_HOME/home-manager/flake.nix.
|
||||
.Pp
|
||||
All operations using this tool expects a sub-command that indicates the operation to perform. It must be one of
|
||||
.Pp
|
||||
.Bl -tag -width Ds
|
||||
|
||||
.It Cm build
|
||||
.RS 4
|
||||
Build configuration into a result directory.
|
||||
.RE
|
||||
|
||||
.It Cm init Op Fl -switch Op Ar dir
|
||||
.RS 14
|
||||
Generates an initial home.nix file for the current user. If Nix flakes are
|
||||
enabled, then this command also generates a flake.nix file.
|
||||
.sp
|
||||
If a path
|
||||
.Ar dir
|
||||
is given then the configuration will be generated in that directory. Otherwise, the configuration will be generated in
|
||||
~/.config/home-manager. The output directory will be created if it does not exist.
|
||||
.sp
|
||||
If the
|
||||
.Fl -switch
|
||||
option is given, then the generated configuration is activated.
|
||||
.sp
|
||||
Note, this command will not overwrite any existing files. It is therefore safe to initialize a configuration, edit it, and then re-run the
|
||||
.Cm init
|
||||
command with
|
||||
.Fl -switch
|
||||
enabled to activate the configuration.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm instantiate
|
||||
.RS 15
|
||||
Instantiate the configuration and print the resulting derivation\&.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm edit
|
||||
.RS 16
|
||||
Open the home configuration using the editor indicated by \fBVISUAL\fR or \fBEDITOR\fR\&.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm expire-generations Ar timestamp
|
||||
.RS 4
|
||||
Remove generations older than
|
||||
.Ar timestamp
|
||||
where
|
||||
.Ar timestamp
|
||||
is interpreted as in the
|
||||
.Fl d
|
||||
argument of the
|
||||
\fBdate\fR(1)
|
||||
tool. For example
|
||||
-30 days or 2018-01-01.
|
||||
.RE
|
||||
.PP
|
||||
|
||||
.It Cm generations
|
||||
.RS 4
|
||||
List all home environment generations\&.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm help
|
||||
.RS 4
|
||||
Print tool help.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm news
|
||||
.RS 4
|
||||
Show news entries in a pager.
|
||||
.RE
|
||||
.PP
|
||||
|
||||
.It Cm option Oo Fl -recursive Oc Ar option.name
|
||||
.RS 4
|
||||
Inspect the given option name in the home configuration, like
|
||||
\fBnixos-option\fR(8)\&.
|
||||
.sp
|
||||
If the
|
||||
.Fl -recursive
|
||||
option is given, print all the values at or below the option name recursively\&.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm packages
|
||||
.RS 4
|
||||
List all packages installed in home-manager-path.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm remove-generations Ar ID \&...
|
||||
.RS 4
|
||||
Remove indicated generations. Use the
|
||||
.Cm generations
|
||||
sub-command to find suitable generation numbers.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm switch Oo Fl -rollback Oc Oo Bro Fl c | Fl -specialisation Brc Ar NAME Oc
|
||||
.RS 4
|
||||
Build and activate the configuration\&.
|
||||
.sp
|
||||
If the
|
||||
.Fl -rollback
|
||||
option is given, then the build is not done, instead roll back to and
|
||||
activate the configuration prior to the current configuration\&.
|
||||
.sp
|
||||
If the
|
||||
.Fl -specialisation
|
||||
option is given, then the named specialisation is activated\&.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm uninstall
|
||||
.RS 4
|
||||
Remove Home Manager from the user environment\&. This will
|
||||
.sp
|
||||
.RE
|
||||
.RS 4
|
||||
.Bl -bullet
|
||||
.It
|
||||
remove all managed files from the home directory,
|
||||
.RE
|
||||
.sp
|
||||
.RS 4
|
||||
.It
|
||||
remove packages installed through Home Manager from the user profile, and
|
||||
.RE
|
||||
.sp
|
||||
.RS 4
|
||||
.It
|
||||
remove all Home Manager generations and make them available for immediate garbage collection\&.
|
||||
.RE
|
||||
.El
|
||||
.sp
|
||||
.RE
|
||||
.El
|
||||
.
|
||||
.Sh OPTIONS
|
||||
.Pp
|
||||
The tool accepts the options
|
||||
.Pp
|
||||
.Bl -tag -width Ds
|
||||
.It Cm Fl A Ar attrPath
|
||||
.RS 4
|
||||
Optional attribute that selects a configuration expression in the configuration file. That is, if
|
||||
home.nix contains
|
||||
.sp
|
||||
.if n \{\
|
||||
.RS 4
|
||||
.\}
|
||||
.nf
|
||||
{
|
||||
joe\-at\-work = {pkgs, \&.\&.\&.}: { home\&.packages = [ pkgs\&.fortune ]; };
|
||||
joe\-at\-home = {pkgs, \&.\&.\&.}: { home\&.packages = [ pkgs\&.cowsay ]; };
|
||||
}
|
||||
.fi
|
||||
.if n \{\
|
||||
.RE
|
||||
.\}
|
||||
.sp
|
||||
then the command
|
||||
\fBhome\-manager switch \-A joe\-at\-work\fR
|
||||
will activate the profile containing the fortune program\&.
|
||||
.RE
|
||||
.PP
|
||||
.It Cm Fl I Ar path
|
||||
.RS 4
|
||||
Add a path to the Nix expression search path. For example, to build a Home Manager profile using a specific Nixpkgs run
|
||||
.Cm home-manager Fl I Ar nixpkgs=/absolute/path/to/nixpkgs build.
|
||||
By default
|
||||
.Ar <nixpkgs>
|
||||
is used.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm Fl -flake Ar flake-uri[#name]
|
||||
.RS 4
|
||||
Build Home Manager configuration from the flake, which must contain the output homeConfigurations.name. If no name is specified it will first try username@hostname and then username.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm Fl b Ar extension
|
||||
.RS 4
|
||||
Enable automatic resolution of collisions between unmanaged and managed files\&. The name of the original file will be suffixed by the given extension\&. For example,
|
||||
.sp
|
||||
.if n \{\
|
||||
.RS 4
|
||||
.\}
|
||||
.nf
|
||||
$ \fBhome\-manager \-b bck switch\fR
|
||||
.fi
|
||||
.if n \{\
|
||||
.RE
|
||||
.\}
|
||||
.sp
|
||||
will cause a colliding file
|
||||
~/\&.config/foo\&.conf
|
||||
to be moved to
|
||||
~/\&.config/foo\&.conf\&.bck\&.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm Fl f Ar path, Fl -file Ar path
|
||||
.RS 4
|
||||
Indicates the path to the Home Manager configuration file. If not given,
|
||||
$XDG_CONFIG_HOME/home-manager/home.nix
|
||||
is used.
|
||||
.RE
|
||||
.Pp
|
||||
.It Cm Fl h, Fl -help
|
||||
.RS 4
|
||||
Prints usage information for the
|
||||
\fBhome\-manager\fR
|
||||
tool.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm Fl -version
|
||||
.RS 4
|
||||
Prints the version number of the
|
||||
\fBhome\-manager\fR
|
||||
tool.
|
||||
.RE
|
||||
.Pp
|
||||
.It Cm Fl n, Fl -dry-run
|
||||
.RS 4
|
||||
Perform a dry-run of the given operation, only prints what actions would be taken.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm Fl -option Ar name Ar value
|
||||
.RS 4
|
||||
Passed on to
|
||||
\fBnix-build\fR(1)\&.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm Fl -cores Ar number
|
||||
.RS 4
|
||||
Passed on to
|
||||
\fBnix-build\fR(1)\&.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm Fl j Ar number, Fl -max-jobs Ar number
|
||||
.RS 4
|
||||
Passed on to
|
||||
\fBnix-build\fR(1)\&.
|
||||
.RE
|
||||
.\" TODO
|
||||
.Pp
|
||||
.It Cm Fl -debug
|
||||
.RS 4
|
||||
Passed on to
|
||||
\fBnix-build\fR(1)\&.
|
||||
.RE
|
||||
.Pp
|
||||
.It Cm Fl -impure
|
||||
.RS 4
|
||||
Passed on to
|
||||
\fBnix-build\fR(1)\&.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm Fl -keep-failed
|
||||
.RS 4
|
||||
Passed on to
|
||||
\fBnix-build\fR(1)\&.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm Fl -keep-going
|
||||
.RS 4
|
||||
Passed on to
|
||||
\fBnix-build\fR(1)\&.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm Fl L, Fl -print-build-logs
|
||||
.RS 4
|
||||
Passed on to
|
||||
\fBnix build\fR()
|
||||
when building from a flake\&.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm Fl -log-format Ar format
|
||||
.RS 4
|
||||
Passed on to
|
||||
\fBnix-build\fR(1)\&.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm Fl -show-trace
|
||||
.RS 4
|
||||
Passed on to
|
||||
\fBnix-build\fR(1)\&.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm Fl -(no-)substitute
|
||||
.RS 4
|
||||
Passed on to
|
||||
\fBnix-build\fR(1)\&.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm Fl -no-out-link
|
||||
.RS 4
|
||||
Passed on to
|
||||
\fBnix-build\fR(1)
|
||||
when running
|
||||
\fBhome\-manager build\fR\&.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm Fl -refresh
|
||||
.RS 4
|
||||
Passed on to
|
||||
\fBnix-build\fR(1)
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm Fl v, Fl -verbose
|
||||
.RS 4
|
||||
Activates verbose output\&.
|
||||
.RE
|
||||
.El
|
||||
|
||||
.Sh FILES
|
||||
.Pp
|
||||
$XDG_DATA_HOME/home\-manager/news\-read\-ids
|
||||
.RS 4
|
||||
Identifiers of news items that have been shown\&. Can be deleted to reset the read news indicator\&.
|
||||
.RE
|
||||
|
||||
.Sh BUGS
|
||||
.Pp
|
||||
Please report any bugs on the
|
||||
\m[blue]\fBproject issue tracker\fR\m[]\&.
|
||||
|
||||
.Sh SEE ALSO
|
||||
.Pp
|
||||
\fBhome-configuration.nix\fR(5)
|
||||
|
||||
.Sh AUTHOR
|
||||
.Pp
|
||||
\fBHome Manager contributors\fR
|
||||
.RS 4
|
||||
Author.
|
||||
.RE
|
||||
|
||||
.Sh COPYRIGHT
|
||||
.br
|
||||
Copyright \(co 2017\(en2026 Home Manager contributors
|
||||
.br
|
||||
@@ -1,53 +0,0 @@
|
||||
{
|
||||
writeShellScriptBin,
|
||||
makeDesktopItem,
|
||||
symlinkJoin,
|
||||
}:
|
||||
{
|
||||
html,
|
||||
pathName ? "home-manager",
|
||||
projectName ? pathName,
|
||||
name ? "${pathName}-help",
|
||||
}:
|
||||
let
|
||||
helpScript = writeShellScriptBin name ''
|
||||
set -euo pipefail
|
||||
|
||||
if [[ ! -v BROWSER || -z $BROWSER ]]; then
|
||||
for candidate in xdg-open open w3m; do
|
||||
BROWSER="$(type -P $candidate || true)"
|
||||
if [[ -x $BROWSER ]]; then
|
||||
break;
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
if [[ ! -v BROWSER || -z $BROWSER ]]; then
|
||||
echo "$0: unable to start a web browser; please set \$BROWSER"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
manualPath="${html}/share/doc/${pathName}/index.html"
|
||||
if [[ ! -e $manualPath ]]; then
|
||||
manualPath="${html}/share/doc/${pathName}/index.xhtml"
|
||||
fi
|
||||
|
||||
exec "$BROWSER" "$manualPath"
|
||||
'';
|
||||
|
||||
desktopItem = makeDesktopItem {
|
||||
name = "${pathName}-manual";
|
||||
desktopName = "${projectName} Manual";
|
||||
genericName = "View ${projectName} documentation in a web browser";
|
||||
icon = "nix-snowflake";
|
||||
exec = "${helpScript}/bin/${name}";
|
||||
categories = [ "System" ];
|
||||
};
|
||||
in
|
||||
symlinkJoin {
|
||||
inherit name;
|
||||
paths = [
|
||||
helpScript
|
||||
desktopItem
|
||||
];
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
# Third-Party Tools and Extensions {#ch-3rd-party}
|
||||
|
||||
Here is a collection of tools and extensions that relate to Home
|
||||
Manager. Note, these are maintained outside the regular Home Manager
|
||||
flow so quality and support may vary wildly. If you encounter problems
|
||||
then please raise them in the corresponding project, not as issues in
|
||||
the Home Manager tracker.
|
||||
|
||||
If you have made something interesting related to Home Manager then you
|
||||
are encouraged to create a PR that expands this chapter.
|
||||
|
||||
```{=include=} sections
|
||||
3rd-party/collections.md
|
||||
```
|
||||
Vendored
-11
@@ -1,11 +0,0 @@
|
||||
# Module Collections {#sec-3rd-party-module-collections}
|
||||
|
||||
- [xhmm --- extra Home Manager
|
||||
modules](https://github.com/schuelermine/xhmm)
|
||||
|
||||
A collection of modules maintained by Anselm Schüler.
|
||||
|
||||
- [Stylix --- System-wide colorscheming and
|
||||
typography](https://github.com/danth/stylix/)
|
||||
|
||||
Configure your applications to get coherent color scheme and font.
|
||||
@@ -1,64 +0,0 @@
|
||||
# Summary
|
||||
|
||||
- [Preface](preface.md)
|
||||
- [Introduction to Home Manager](introduction.md)
|
||||
- [Installing Home Manager](installation.md)
|
||||
- [Standalone installation](installation/standalone.md)
|
||||
- [NixOS module](installation/nixos.md)
|
||||
- [nix-darwin module](installation/nix-darwin.md)
|
||||
- [Using Home Manager](usage.md)
|
||||
- [Configuration Example](usage/configuration.md)
|
||||
- [Rollbacks](usage/rollbacks.md)
|
||||
- [Keeping your ~ safe from harm](usage/dotfiles.md)
|
||||
- [Graphical services](usage/graphical.md)
|
||||
- [GPU on non-NixOS systems](usage/gpu-non-nixos.md)
|
||||
- [Modular Services](usage/modular-services.md)
|
||||
- [Updating](usage/updating.md)
|
||||
- [Upgrading to a new Home Manager release](usage/upgrading.md)
|
||||
- [Nix Flakes](nix-flakes.md)
|
||||
- [Prerequisites](nix-flakes/prerequisites.md)
|
||||
- [Standalone setup](nix-flakes/standalone.md)
|
||||
- [NixOS module](nix-flakes/nixos.md)
|
||||
- [nix-darwin module](nix-flakes/nix-darwin.md)
|
||||
- [flake-parts module](nix-flakes/flake-parts.md)
|
||||
- [Writing Home Manager Modules](writing-modules.md)
|
||||
- [Option Types](writing-modules/types.md)
|
||||
- [Contributing](contributing.md)
|
||||
- [Getting started](contributing/getting-started.md)
|
||||
- [Guidelines](contributing/guidelines.md)
|
||||
- [Release Notes](contributing/release-notes.md)
|
||||
- [News](contributing/news.md)
|
||||
- [Tests](contributing/tests.md)
|
||||
- [Home Manager Internals](internals.md)
|
||||
- [Activation](internals/activation.md)
|
||||
- [Third-Party Tools and Extensions](3rd-party.md)
|
||||
- [Module Collections](3rd-party/collections.md)
|
||||
- [Frequently Asked Questions (FAQ)](faq.md)
|
||||
- [Why is there a collision error when switching generation?](faq/collision.md)
|
||||
- [Why are the session variables not set?](faq/session-variables.md)
|
||||
- [How to set up a configuration for multiple users/machines?](faq/multiple-users-machines.md)
|
||||
- [Why do I get an error message about `ca.desrt.dconf` or `dconf.service`?](faq/ca-desrt-dconf.md)
|
||||
- [How do I install packages from Nixpkgs unstable?](faq/unstable.md)
|
||||
- [How do I change the package used by a module?](faq/change-package-module.md)
|
||||
- [Options](options.md)
|
||||
@HOME_MANAGER_OPTIONS@
|
||||
@NIXOS_OPTIONS@
|
||||
@NIX_DARWIN_OPTIONS@
|
||||
- [Release Notes](release-notes/release-notes.md)
|
||||
- [Release 26.11](release-notes/rl-2611.md)
|
||||
- [Release 26.05](release-notes/rl-2605.md)
|
||||
- [Release 25.11](release-notes/rl-2511.md)
|
||||
- [Release 25.05](release-notes/rl-2505.md)
|
||||
- [Release 24.11](release-notes/rl-2411.md)
|
||||
- [Release 24.05](release-notes/rl-2405.md)
|
||||
- [Release 23.11](release-notes/rl-2311.md)
|
||||
- [Release 23.05](release-notes/rl-2305.md)
|
||||
- [Release 22.11](release-notes/rl-2211.md)
|
||||
- [Release 22.05](release-notes/rl-2205.md)
|
||||
- [Release 21.11](release-notes/rl-2111.md)
|
||||
- [Release 21.05](release-notes/rl-2105.md)
|
||||
- [Release 20.09](release-notes/rl-2009.md)
|
||||
- [Release 20.03](release-notes/rl-2003.md)
|
||||
- [Release 19.09](release-notes/rl-1909.md)
|
||||
- [Release 19.03](release-notes/rl-1903.md)
|
||||
- [Release 18.09](release-notes/rl-1809.md)
|
||||
@@ -1,28 +0,0 @@
|
||||
# Contributing {#ch-contributing}
|
||||
|
||||
Contributions to Home Manager are very welcome. To make the process as
|
||||
smooth as possible for both you and the Home Manager maintainers we
|
||||
provide some guidelines that we ask you to follow. See [Getting
|
||||
started](contributing/getting-started.md#sec-contrib-getting-started) for information on how to set up
|
||||
a suitable development environment and [Guidelines](contributing/guidelines.md#sec-guidelines) for
|
||||
the actual guidelines.
|
||||
|
||||
This text is mainly directed at those who would like to make code
|
||||
contributions to Home Manager. If you just want to report a bug then
|
||||
first look among the already [open
|
||||
issues](https://github.com/nix-community/home-manager/issues), if you
|
||||
find one matching yours then feel free to comment on it to add any
|
||||
additional information you may have. If no matching issue exists then go
|
||||
to the [new
|
||||
issue](https://github.com/nix-community/home-manager/issues/new) page
|
||||
and write a description of your problem. Include as much information as
|
||||
you can, ideally also include relevant excerpts from your Home Manager
|
||||
configuration.
|
||||
|
||||
```{=include=} sections
|
||||
contributing/getting-started.md
|
||||
contributing/guidelines.md
|
||||
contributing/release-notes.md
|
||||
contributing/news.md
|
||||
contributing/tests.md
|
||||
```
|
||||
@@ -1,43 +0,0 @@
|
||||
# Getting started {#sec-contrib-getting-started}
|
||||
|
||||
If you have not previously forked Home Manager then you need to do that
|
||||
first. Have a look at GitHub's [Fork a
|
||||
repo](https://help.github.com/articles/fork-a-repo/) for instructions on
|
||||
how to do this.
|
||||
|
||||
Once you have a fork of Home Manager you should create a branch starting
|
||||
at the most recent `master` branch. Give your branch a reasonably
|
||||
descriptive name. Commit your changes to this branch and when you are
|
||||
happy with the result and it fulfills [Guidelines](guidelines.md#sec-guidelines) then
|
||||
push the branch to GitHub and [create a pull
|
||||
request](https://help.github.com/articles/creating-a-pull-request/).
|
||||
|
||||
Assuming your clone is at `$HOME/devel/home-manager` then you can make
|
||||
the `home-manager` command use it by either
|
||||
|
||||
1. overriding the default path by using the `-I` command line option:
|
||||
|
||||
``` shell
|
||||
$ home-manager -I home-manager=$HOME/devel/home-manager
|
||||
```
|
||||
|
||||
or, if using [flakes](../nix-flakes/standalone.md#sec-flakes-standalone):
|
||||
|
||||
``` shell
|
||||
$ home-manager --override-input home-manager ~/devel/home-manager
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
2. changing the default path by ensuring your configuration includes
|
||||
|
||||
``` nix
|
||||
programs.home-manager.enable = true;
|
||||
programs.home-manager.path = "$HOME/devel/home-manager";
|
||||
```
|
||||
|
||||
and running `home-manager switch` to activate the change.
|
||||
Afterwards, `home-manager build` and `home-manager switch` will use
|
||||
your cloned repository.
|
||||
|
||||
The first option is good if you only temporarily want to use your clone.
|
||||
@@ -1,292 +0,0 @@
|
||||
# Guidelines {#sec-guidelines}
|
||||
|
||||
If your contribution satisfy the following rules then there is a good
|
||||
chance it will be merged without too much trouble. The rules are
|
||||
enforced by the Home Manager maintainers and to a lesser extent the Home
|
||||
Manager CI system.
|
||||
|
||||
If you are uncertain how these rules affect the change you would like to
|
||||
make then feel free to start a discussion in the
|
||||
[#home-manager](https://webchat.oftc.net/?channels=home-manager) IRC
|
||||
channel, ideally before you start developing.
|
||||
|
||||
## Maintain backward compatibility {#sec-guidelines-back-compat}
|
||||
|
||||
Your contribution should not cause another user's existing configuration
|
||||
to break unless there is a very good reason and the change should be
|
||||
announced to the user through an
|
||||
[assertion](https://nixos.org/manual/nixos/stable/index.html#sec-assertions)
|
||||
or similar.
|
||||
|
||||
Remember that Home Manager is used in many different environments and
|
||||
you should consider how your change may effect others. For example,
|
||||
|
||||
- Does your change work for people that do not use NixOS? Consider
|
||||
other GNU/Linux distributions and macOS.
|
||||
|
||||
- Does your change work for people whose configuration is built on one
|
||||
system and deployed on another system?
|
||||
|
||||
## Keep forward compatibility in mind {#sec-guidelines-forward-compat}
|
||||
|
||||
The master branch of Home Manager tracks the unstable channel of
|
||||
Nixpkgs, which may update package versions at any time. It is therefore
|
||||
important to consider how a package update may affect your code and try
|
||||
to reduce the risk of breakage.
|
||||
|
||||
The most effective way to reduce this risk is to follow the advice in
|
||||
[Add only valuable options](#sec-guidelines-valuable-options).
|
||||
|
||||
## Add only valuable options {#sec-guidelines-valuable-options}
|
||||
|
||||
When creating a new module it is tempting to include every option
|
||||
supported by the software. This is *strongly* discouraged. Providing
|
||||
many options increases maintenance burden and risk of breakage
|
||||
considerably. This is why only the most [important software
|
||||
options](https://github.com/NixOS/rfcs/blob/master/rfcs/0042-config-option.md#valuable-options)
|
||||
should be modeled explicitly. Less important options should be
|
||||
expressible through an `extraConfig` escape hatch.
|
||||
|
||||
A good rule of thumb for the first implementation of a module is to only
|
||||
add explicit options for those settings that absolutely must be set for
|
||||
the software to function correctly. It follows that a module for
|
||||
software that provides sensible default values for all settings would
|
||||
require no explicit options at all.
|
||||
|
||||
If the software uses a structured configuration format like a JSON,
|
||||
YAML, INI, TOML, or even a plain list of key/value pairs then consider
|
||||
using a `settings` option as described in [Nix RFC
|
||||
42](https://github.com/NixOS/rfcs/blob/master/rfcs/0042-config-option.md).
|
||||
|
||||
These guidelines describe the minimum option design requirements. Before
|
||||
submitting a module, compare it against the upstream documentation or
|
||||
source code and verify that the generated files, services, environment
|
||||
variables, and command line arguments all match the upstream behavior
|
||||
you intend to expose.
|
||||
|
||||
If a module installs a package, try to make the package option nullable,
|
||||
for example
|
||||
|
||||
``` nix
|
||||
package = lib.mkPackageOption pkgs "xdg-terminal-exec" { nullable = true; };
|
||||
```
|
||||
|
||||
This lets users keep installation outside Home Manager, for example via
|
||||
`apt` or because the program is built into macOS, while still using the
|
||||
module for configuration. Keeping the package non-nullable is fine when
|
||||
the enabled behavior structurally requires the executable or when
|
||||
package-less support would make the module significantly more complex.
|
||||
|
||||
Avoid generating files for empty settings, null packages, or optional
|
||||
features that are not configured.
|
||||
|
||||
If upstream does not use XDG paths by default but supports changing the
|
||||
configuration location with an environment variable, for example
|
||||
`FOO_HOME`, expose a `configDir` option and use it to respect
|
||||
`home.preferXdgDirectories`.
|
||||
|
||||
## Add relevant tests {#sec-guidelines-add-tests}
|
||||
|
||||
If at all possible, make sure to add new tests and expand existing tests
|
||||
so that your change will keep working in the future. See
|
||||
[Tests](tests.md#sec-tests) for more information about the Home Manager test
|
||||
suite.
|
||||
|
||||
All contributed code *must* pass the test suite.
|
||||
|
||||
## Add relevant documentation {#sec-guidelines-module-maintainer}
|
||||
|
||||
Many code changes require changing the documentation as well. The
|
||||
documentation is written in
|
||||
[Nixpkgs-flavoured Markdown](https://nixos.org/manual/nixpkgs/unstable/#sec-contributing-markup).
|
||||
All text is hosted in Home Manager's Git repository.
|
||||
|
||||
The HTML version of the manual containing both the module option
|
||||
descriptions and the documentation of Home Manager can be generated and
|
||||
opened by typing the following in a shell within a clone of the Home
|
||||
Manager Git repository:
|
||||
|
||||
``` shell
|
||||
$ nix-build -A docs.html
|
||||
$ xdg-open ./result/share/doc/home-manager/index.html
|
||||
```
|
||||
|
||||
When you have made changes to a module, it is a good idea to check that
|
||||
the man page version of the module options looks good:
|
||||
|
||||
``` shell
|
||||
$ nix-build -A docs.manPages
|
||||
$ man ./result/share/man/man5/home-configuration.nix.5
|
||||
```
|
||||
|
||||
## Module Auto-importing {#sec-module-auto-importing}
|
||||
|
||||
Home Manager automatically imports all modules from the `modules/programs/` and
|
||||
`modules/services/` directories. This auto-importing behavior follows these
|
||||
rules:
|
||||
|
||||
- **Nix files**: All `.nix` files in these directories are automatically
|
||||
imported
|
||||
- **Directories**: All subdirectories are automatically imported (typically
|
||||
containing a `default.nix` file)
|
||||
- **Exclusions**: Files and directories starting with an underscore (`_`) are
|
||||
excluded from auto-importing
|
||||
|
||||
This allows for flexible module organization:
|
||||
|
||||
```
|
||||
modules/programs/
|
||||
├── git.nix # Single-file module (imported)
|
||||
├── firefox/ # Multi-file module (imported)
|
||||
│ ├── default.nix
|
||||
│ └── addons.nix
|
||||
├── _experimental.nix # Excluded (starts with _)
|
||||
└── _wip/ # Excluded directory (starts with _)
|
||||
└── newfeature.nix
|
||||
```
|
||||
|
||||
When adding a new module, simply place it in the appropriate directory
|
||||
(`programs/` for user programs, `services/` for user services) and it will be
|
||||
automatically discovered and included in the Home Manager module system.
|
||||
|
||||
## Add yourself as a module maintainer {#_add_yourself_as_a_module_maintainer}
|
||||
|
||||
Every new module *must* include a named maintainer using the
|
||||
`meta.maintainers` attribute. If you are a user of a module that
|
||||
currently lacks a maintainer then please consider adopting it.
|
||||
|
||||
If you are present in the nixpkgs maintainer list then you can use that
|
||||
entry. If you are not then you can add yourself to
|
||||
`modules/lib/maintainers.nix` in the Home Manager project.
|
||||
|
||||
As a maintainer you are expected to respond to issues and
|
||||
pull-requests associated with your module.
|
||||
|
||||
Maintainers are encouraged to join the IRC or Matrix channel and
|
||||
participate when they have opportunity.
|
||||
|
||||
## Format your code {#sec-guidelines-code-style}
|
||||
|
||||
Make sure your code is formatted as described in [Code
|
||||
Style](#sec-code-style). To maintain consistency throughout the project
|
||||
you are encouraged to browse through existing code and adopt its style
|
||||
also in new code.
|
||||
|
||||
## Format your commit messages {#sec-guidelines-commit-message-style}
|
||||
|
||||
Similar to [Format your code](#sec-guidelines-code-style) we encourage a
|
||||
consistent commit message format as described in
|
||||
[Commits](#sec-commit-style).
|
||||
|
||||
## Format your news entries {#sec-guidelines-news-style}
|
||||
|
||||
If your contribution includes a change that should be communicated to
|
||||
users of Home Manager then you can add a news entry. The entry must be
|
||||
formatted as described in [News](news.md#sec-news).
|
||||
|
||||
When new modules are added a news entry should be included.
|
||||
|
||||
News entries and release notes serve different purposes. Release notes
|
||||
should be updated separately when a change affects users migrating
|
||||
between stable releases, such as state version default changes, required
|
||||
migration steps, or broad behavior changes. See
|
||||
[Release Notes](release-notes.md#sec-contributing-release-notes) and [News](news.md#sec-news)
|
||||
for more details.
|
||||
|
||||
## Use conditional modules and news {#sec-guidelines-conditional-modules}
|
||||
|
||||
Home Manager includes a number of modules that are only usable on some
|
||||
of the supported platforms. The most common example of platform specific
|
||||
modules are those that define systemd user services, which only works on
|
||||
Linux systems.
|
||||
|
||||
If you add a module that is platform specific then make sure the module
|
||||
guards platform-specific configuration with an appropriate condition, for
|
||||
example `pkgs.stdenv.hostPlatform.isLinux` or
|
||||
`pkgs.stdenv.hostPlatform.isDarwin`. Modules in `modules/programs/` and
|
||||
`modules/services/` are auto-imported, so the platform condition should live
|
||||
in the module behavior and in any platform-specific tests rather than in a
|
||||
separate module discovery call.
|
||||
|
||||
Similarly, if you are adding a news entry then it should be shown only
|
||||
to users that may find it relevant, see [News](news.md#sec-news) for a
|
||||
description of conditional news.
|
||||
|
||||
## Mind the license {#sec-guidelines-licensing}
|
||||
|
||||
The Home Manager project is covered by the MIT license and we can only
|
||||
accept contributions that fall under this license, or are licensed in a
|
||||
compatible way. When you contribute self written code and documentation
|
||||
it is assumed that you are doing so under the MIT license.
|
||||
|
||||
A potential gotcha with respect to licensing are option descriptions.
|
||||
Often it is convenient to copy from the upstream software documentation.
|
||||
When this is done it is important to verify that the license of the
|
||||
upstream documentation allows redistribution under the terms of the MIT
|
||||
license.
|
||||
|
||||
## Commits {#sec-commit-style}
|
||||
|
||||
The commits in your pull request should be reasonably self-contained,
|
||||
that is, each commit should make sense in isolation. In particular, you
|
||||
will be asked to amend any commit that introduces syntax errors or
|
||||
similar problems even if they are fixed in a later commit.
|
||||
|
||||
Keep commits atomic and separated by concern. For example, a new
|
||||
maintainer entry should be a separate first commit, and a shared module
|
||||
should be committed separately from integrations in existing modules.
|
||||
Pull requests should not include merge commits or fixup commits.
|
||||
|
||||
The commit messages should follow the [seven
|
||||
rules](https://chris.beams.io/posts/git-commit/#seven-rules), except for
|
||||
\"Capitalize the subject line\". We also ask you to include the affected
|
||||
code component or module in the first line. That is, a commit message
|
||||
should follow the template
|
||||
|
||||
{component}: {description}
|
||||
|
||||
{long description}
|
||||
|
||||
where `{component}` refers to the code component (or module) your change
|
||||
affects, `{description}` is a very brief description of your change, and
|
||||
`{long description}` is an optional clarifying description. As a rare
|
||||
exception, if there is no clear component, or your change affects many
|
||||
components, then the `{component}` part is optional. See
|
||||
[example_title](#ex-commit-message) for a commit message that fulfills
|
||||
these requirements.
|
||||
|
||||
## Example commit {#ex-commit-message}
|
||||
|
||||
The commit
|
||||
[69f8e47e9e74c8d3d060ca22e18246b7f7d988ef](https://github.com/nix-community/home-manager/commit/69f8e47e9e74c8d3d060ca22e18246b7f7d988ef)
|
||||
contains the commit message
|
||||
|
||||
```
|
||||
|
||||
starship: allow running in Emacs if vterm is used
|
||||
|
||||
The vterm buffer is backed by libvterm and can handle Starship prompts
|
||||
without issues.
|
||||
```
|
||||
|
||||
which ticks all the boxes necessary to be accepted in Home Manager.
|
||||
|
||||
Finally, when adding a new module, say `programs/foo.nix`, we use the
|
||||
fixed commit format `foo: add module`. You can, of course, still include
|
||||
a long description if you wish.
|
||||
|
||||
## Code Style {#sec-code-style}
|
||||
|
||||
The code in Home Manager is formatted by the [treefmt](https://treefmt.com) tool
|
||||
and the formatting is checked in the pull request tests. Run `nix fmt` or
|
||||
`treefmt` (with required formatters which can be found in `treefmt.toml` in your
|
||||
`$PATH`) inside the project repository before submitting your pull request.
|
||||
|
||||
Keep lines at a reasonable width, ideally 80 characters or less. This
|
||||
also applies to string literals.
|
||||
|
||||
We prefer `lowerCamelCase` for variable and attribute names with the
|
||||
accepted exception of variables directly referencing packages in Nixpkgs
|
||||
which use a hyphenated style. For example, the Home Manager option
|
||||
`services.gpg-agent.enableSshSupport` references the `gpg-agent` package
|
||||
in Nixpkgs.
|
||||
@@ -1,81 +0,0 @@
|
||||
# News {#sec-news}
|
||||
|
||||
Home Manager includes a system for presenting news to the user. When
|
||||
making a change you, therefore, have the option to also include an
|
||||
associated news entry. In general, a news entry should only be added for
|
||||
truly noteworthy news. For example, a bug fix or new option does
|
||||
generally not need a news entry.
|
||||
|
||||
Release notes and news entries serve different purposes. A news entry is
|
||||
shown during Home Manager activation and is useful for day-to-day
|
||||
communication about noteworthy changes, such as a new module, a new
|
||||
feature, or a specific deprecation. Release notes are read from the
|
||||
website documentation and should summarize what users need to know before
|
||||
or during a stable-release upgrade. See
|
||||
[Release Notes](release-notes.md#sec-contributing-release-notes) for guidance on changes
|
||||
that affect stable-release upgrades.
|
||||
|
||||
If you do have a change worthy of a news entry then please add one in
|
||||
[`news`](https://github.com/nix-community/home-manager/blob/master/modules/misc/news)
|
||||
but you should follow some basic guidelines:
|
||||
|
||||
- Use the included news entry generator to create a news entry file:
|
||||
|
||||
``` shell
|
||||
$ nix run .#create-news-entry
|
||||
```
|
||||
|
||||
Alternatively, you can directly use the script:
|
||||
|
||||
``` shell
|
||||
$ nix-shell -A dev --run modules/misc/news/create-news-entry.sh
|
||||
```
|
||||
|
||||
This will create a new file inside the `modules/misc/news` directory
|
||||
with some placeholder information that you can edit.
|
||||
|
||||
- The entry condition should be as specific as possible for changes
|
||||
affecting existing functionality. For example, if you are changing
|
||||
or deprecating a specific option then you could restrict the news to
|
||||
those users who actually use this option. Prefer a targeted
|
||||
condition over skipping useful news only to avoid notifying
|
||||
unaffected users.
|
||||
|
||||
- Wrap the news message so that it will fit in the typical terminal,
|
||||
that is, at most 80 characters wide. Ideally a bit less.
|
||||
|
||||
- Unlike commit messages, news will be read without any connection to
|
||||
the Home Manager source code. It is therefore important to make the
|
||||
message understandable in isolation and to those who do not have
|
||||
knowledge of the Home Manager internals. To this end it should be
|
||||
written in more descriptive, prose like way.
|
||||
|
||||
- If you refer to an option then write its full attribute path. That
|
||||
is, instead of writing
|
||||
|
||||
The option 'foo' has been deprecated, please use 'bar' instead.
|
||||
|
||||
it should read
|
||||
|
||||
The option 'services.myservice.foo' has been deprecated, please
|
||||
use 'services.myservice.bar' instead.
|
||||
|
||||
- A new module, say `foo.nix`, should always include a news entry that
|
||||
has a message along the lines of
|
||||
|
||||
A new module is available: 'services.foo'.
|
||||
|
||||
Since this news announces newly available functionality, its
|
||||
condition should not require `config.services.foo.enable`; otherwise
|
||||
users who may want the new module will not see the news.
|
||||
|
||||
If the module is platform specific, e.g., a service module using
|
||||
systemd, then a condition like
|
||||
|
||||
``` nix
|
||||
condition = hostPlatform.isLinux;
|
||||
```
|
||||
|
||||
should be added to avoid showing the news on unsupported platforms.
|
||||
Use the `create-news-entry` generator described above to scaffold
|
||||
this entry as part of your contribution.
|
||||
@@ -1,24 +0,0 @@
|
||||
# Release Notes {#sec-contributing-release-notes}
|
||||
|
||||
Home Manager release notes are published as part of the website documentation in
|
||||
`docs/release-notes/rl-*.md`. They are intended for users migrating from one
|
||||
stable release to another.
|
||||
|
||||
A change should be mentioned in the release notes when it affects migration
|
||||
between stable releases. This includes changes that require user action or
|
||||
awareness during an upgrade, such as:
|
||||
|
||||
- breaking changes;
|
||||
- default changes guarded by `home.stateVersion`;
|
||||
- required migration steps;
|
||||
- broad behavior changes across platform or integration boundaries;
|
||||
- compatibility changes that can affect existing configurations.
|
||||
|
||||
Do not use the presence or absence of a news entry to decide whether a change
|
||||
belongs in the release notes. A change can require a news entry, a release note,
|
||||
both, or neither.
|
||||
|
||||
When preparing a release, review the commits since the previous stable release
|
||||
and update the upcoming release note file with the migration impact. Prefer
|
||||
concise user-facing descriptions that name the affected option paths and explain
|
||||
required action.
|
||||
@@ -1,252 +0,0 @@
|
||||
# Tests {#sec-tests}
|
||||
|
||||
Home Manager includes a basic test suite and it is highly recommended to
|
||||
include at least one test when adding a module. Tests are typically in
|
||||
the form of \"golden tests\" where, for example, a generated
|
||||
configuration file is compared to a known correct file.
|
||||
|
||||
It is relatively easy to create tests by modeling the existing tests,
|
||||
found in the `tests` project directory.
|
||||
|
||||
## Writing Basic Tests {#sec-tests-basic}
|
||||
|
||||
Home Manager tests use the **NMT** framework, which provides
|
||||
a set of assertion functions to verify that modules generate the expected files
|
||||
and configurations. Tests are written as Nix expressions that define both the
|
||||
Home Manager configuration and the test assertions.
|
||||
|
||||
### Test Structure {#sec-tests-structure}
|
||||
|
||||
A basic test file structure looks like:
|
||||
|
||||
```nix
|
||||
{
|
||||
# Home Manager configuration
|
||||
programs.myprogram = {
|
||||
enable = true;
|
||||
settings = {
|
||||
option = "value";
|
||||
};
|
||||
};
|
||||
|
||||
# NMT test script with assertions
|
||||
nmt.script = ''
|
||||
assertFileExists "home-files/.config/myprogram/config.toml"
|
||||
assertFileContent "home-files/.config/myprogram/config.toml" ${./expected-config.toml}
|
||||
'';
|
||||
}
|
||||
```
|
||||
|
||||
### Test Organization {#sec-tests-organization}
|
||||
|
||||
Tests are organized in the `tests` directory structure:
|
||||
|
||||
- `tests/modules/programs/myprogram/default.nix` - Lists all test cases for the module
|
||||
- `tests/modules/programs/myprogram/basic-configuration.nix` - A basic test case
|
||||
- `tests/modules/programs/myprogram/expected-config.toml` - Expected output file
|
||||
|
||||
The `default.nix` file should list all test cases:
|
||||
|
||||
```nix
|
||||
{
|
||||
myprogram-basic-configuration = ./basic-configuration.nix;
|
||||
myprogram-empty-settings = ./empty-settings.nix;
|
||||
}
|
||||
```
|
||||
|
||||
Prefer keeping related assertions in as few test files as practical.
|
||||
Exercising several cases in one evaluation keeps the test suite cheaper
|
||||
to evaluate and reduces maintenance burden. Split cases into separate
|
||||
files when they need incompatible module configuration, platform
|
||||
conditions, expected assertion failures, or otherwise cannot share one
|
||||
evaluation.
|
||||
|
||||
### Common NMT Assertions {#sec-tests-assertions}
|
||||
|
||||
NMT provides several assertion functions:
|
||||
|
||||
- `assertFileExists "path"` - Verify a file was created
|
||||
- `assertPathNotExists "path"` - Verify a file was NOT created
|
||||
- `assertFileContent "path" expected-file` - Compare file contents
|
||||
- `assertFileRegex "path" "regex"` - Check file matches regex
|
||||
|
||||
For a full reference to the functions available in test scripts, you can look at NMT's
|
||||
[bash-lib](https://git.sr.ht/~rycee/nmt/tree/master/item/bash-lib).
|
||||
|
||||
### Practical Examples {#sec-tests-examples}
|
||||
|
||||
Here are some real-world examples of common test patterns:
|
||||
|
||||
**Testing that a configuration file is generated:**
|
||||
```nix
|
||||
{
|
||||
programs.alacritty = {
|
||||
enable = true;
|
||||
settings.font.size = 12;
|
||||
};
|
||||
|
||||
nmt.script = ''
|
||||
assertFileExists "home-files/.config/alacritty/alacritty.yml"
|
||||
assertFileContains "home-files/.config/alacritty/alacritty.yml" "size: 12"
|
||||
'';
|
||||
}
|
||||
```
|
||||
|
||||
**Testing that no files are created when disabled:**
|
||||
```nix
|
||||
{
|
||||
programs.alacritty.enable = false;
|
||||
|
||||
nmt.script = ''
|
||||
assertPathNotExists "home-files/.config/alacritty"
|
||||
'';
|
||||
}
|
||||
```
|
||||
|
||||
**Testing exact file content against expected output:**
|
||||
```nix
|
||||
{
|
||||
programs.fastfetch = {
|
||||
enable = true;
|
||||
settings.display.color = "blue";
|
||||
};
|
||||
|
||||
nmt.script =
|
||||
let
|
||||
configFile = "home-files/.config/fastfetch/config.jsonc";
|
||||
in
|
||||
''
|
||||
assertFileExists "${configFile}"
|
||||
assertFileContent "${configFile}" ${./expected-config.jsonc}
|
||||
'';
|
||||
}
|
||||
```
|
||||
|
||||
**Testing multiple conditions in one test:**
|
||||
```nix
|
||||
{
|
||||
programs.myprogram = {
|
||||
enable = true;
|
||||
configFile = "custom.conf";
|
||||
extraConfig = "debug = true";
|
||||
};
|
||||
|
||||
nmt.script = ''
|
||||
assertFileExists "home-files/.config/myprogram/custom.conf"
|
||||
assertFileRegex "home-files/.config/myprogram/custom.conf" "debug = true"
|
||||
assertFileRegex "home-files/.config/myprogram/custom.conf" "^# Generated by Home Manager"
|
||||
'';
|
||||
}
|
||||
```
|
||||
|
||||
### Platform-Specific Tests {#sec-tests-platform-specific}
|
||||
|
||||
When a module is platform-specific (Linux-only or Darwin-only), the test's `default.nix`
|
||||
file should use `lib.optionalAttrs` to conditionally expose tests based on the platform.
|
||||
This prevents evaluation errors on unsupported platforms during the test suite runs.
|
||||
|
||||
**Linux-only module tests:**
|
||||
```nix
|
||||
{ lib, pkgs, ... }:
|
||||
|
||||
lib.optionalAttrs pkgs.stdenv.hostPlatform.isLinux {
|
||||
rofi-valid-config = ./valid-config.nix;
|
||||
rofi-custom-theme = ./custom-theme.nix;
|
||||
}
|
||||
```
|
||||
|
||||
**Darwin-only module tests:**
|
||||
```nix
|
||||
{ lib, pkgs, ... }:
|
||||
|
||||
lib.optionalAttrs pkgs.stdenv.hostPlatform.isDarwin {
|
||||
sketchybar-basic = ./basic-configuration.nix;
|
||||
sketchybar-lua-config = ./lua-config.nix;
|
||||
}
|
||||
```
|
||||
|
||||
For cross-platform modules that have packages which need to be stubbed on Darwin,
|
||||
add the package names to `tests/darwinScrublist.nix` to prevent build failures
|
||||
during cross-platform test runs.
|
||||
|
||||
On Linux, packages are automatically scrubbed by the test infrastructure,
|
||||
so tests should normally use the module's default package. Use
|
||||
`test.stubs` or `config.lib.test.mkStubPackage` only when the automatic
|
||||
scrubbing does not model the behavior that the test needs, such as a
|
||||
package with additional files or a non-default executable layout.
|
||||
|
||||
## Using the tests command {#sec-tests-command}
|
||||
|
||||
Home Manager provides a convenient `tests` command for discovering and running tests:
|
||||
|
||||
``` shell
|
||||
# List all available tests
|
||||
$ nix run .#tests -- -l
|
||||
|
||||
# List tests matching a pattern
|
||||
$ nix run .#tests -- -l alacritty
|
||||
|
||||
# Run all tests matching a pattern
|
||||
$ nix run .#tests -- alacritty
|
||||
|
||||
# Run a specific test
|
||||
$ nix run .#tests -- test-alacritty-empty-settings
|
||||
|
||||
# List integration tests
|
||||
$ nix run .#tests -- -t -l
|
||||
|
||||
# Run all integration tests
|
||||
$ nix run .#tests -- -t integration-test-
|
||||
|
||||
# Interactive test selection (requires fzf)
|
||||
$ nix run .#tests -- -i
|
||||
|
||||
# Pass additional nix build flags
|
||||
$ nix run .#tests -- alacritty -- --verbose
|
||||
```
|
||||
|
||||
Integration tests are only exposed on Linux. On other platforms, integration
|
||||
test discovery may report no matching tests.
|
||||
|
||||
## Manual test commands {#sec-tests-manual}
|
||||
|
||||
For advanced usage or CI environments, you can also run tests manually using nix build commands.
|
||||
|
||||
The full Home Manager test suite can be run by executing
|
||||
|
||||
``` shell
|
||||
$ nix-build --pure --option allow-import-from-derivation false tests -A build.all
|
||||
```
|
||||
|
||||
in the project root. List all test cases through
|
||||
|
||||
``` shell
|
||||
$ nix run .#tests -- -l
|
||||
```
|
||||
|
||||
and run an individual test, for example `alacritty-empty-settings`,
|
||||
through
|
||||
|
||||
``` shell
|
||||
$ nix-build --pure tests --option allow-import-from-derivation false -A build.alacritty-empty-settings
|
||||
```
|
||||
|
||||
However, those invocations will impurely source the system's Nixpkgs,
|
||||
and may cause failures. To run against the Nixpkgs from the `flake.lock` file,
|
||||
use instead e.g.
|
||||
|
||||
``` shell
|
||||
$ nix build .#test-all
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
``` shell
|
||||
$ nix build .#test-alacritty-empty-settings
|
||||
```
|
||||
|
||||
Some tests may be marked with `enableLegacyIfd`, those may be run by run with e.g.
|
||||
|
||||
``` shell
|
||||
$ nix-build --pure tests --arg enableLegacyIfd true -A build.mytest
|
||||
```
|
||||
@@ -1,10 +0,0 @@
|
||||
# Frequently Asked Questions (FAQ) {#ch-faq}
|
||||
|
||||
```{=include=} sections
|
||||
faq/collision.md
|
||||
faq/session-variables.md
|
||||
faq/multiple-users-machines.md
|
||||
faq/ca-desrt-dconf.md
|
||||
faq/unstable.md
|
||||
faq/change-package-module.md
|
||||
```
|
||||
@@ -1,19 +0,0 @@
|
||||
# Why do I get an error message about `ca.desrt.dconf` or `dconf.service`? {#_why_do_i_get_an_error_message_about_literal_ca_desrt_dconf_literal_or_literal_dconf_service_literal}
|
||||
|
||||
You are most likely trying to configure something that uses dconf but
|
||||
the DBus session is not aware of the dconf service. The full error you
|
||||
might get is
|
||||
|
||||
error: GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name ca.desrt.dconf was not provided by any .service files
|
||||
|
||||
or
|
||||
|
||||
error: GDBus.Error:org.freedesktop.systemd1.NoSuchUnit: Unit dconf.service not found.
|
||||
|
||||
The solution on NixOS is to add
|
||||
|
||||
``` nix
|
||||
programs.dconf.enable = true;
|
||||
```
|
||||
|
||||
to your system configuration.
|
||||
@@ -1,117 +0,0 @@
|
||||
# How do I change the package used by a module? {#_how_do_i_change_the_package_used_by_a_module}
|
||||
|
||||
By default Home Manager will install the package provided by your chosen
|
||||
`nixpkgs` channel but occasionally you might end up needing to change
|
||||
this package. This can typically be done in two ways.
|
||||
|
||||
1. If the module provides a `package` option, such as
|
||||
`programs.beets.package`, then this is the recommended way to
|
||||
perform the change. For example,
|
||||
|
||||
``` nix
|
||||
programs.beets.package = pkgs.beets.override { pluginOverrides = { beatport.enable = false; }; };
|
||||
```
|
||||
|
||||
See [Nix pill 17](https://nixos.org/guides/nix-pills/nixpkgs-overriding-packages.html)
|
||||
for more information on package overrides. Alternatively, if you want
|
||||
to use the `beets` package from Nixpkgs unstable, then a configuration like
|
||||
|
||||
``` nix
|
||||
{ pkgs, config, ... }:
|
||||
|
||||
let
|
||||
pkgsUnstable = import <nixpkgs-unstable> {};
|
||||
in
|
||||
{
|
||||
programs.beets.package = pkgsUnstable.beets;
|
||||
|
||||
# …
|
||||
}
|
||||
```
|
||||
|
||||
should work OK. With flakes, pass the unstable package set as
|
||||
described in
|
||||
[How do I install packages from Nixpkgs unstable?](unstable.md#_how_do_i_install_packages_from_nixpkgs_unstable)
|
||||
and then use the extra module argument:
|
||||
|
||||
``` nix
|
||||
{ pkgsUnstable, ... }:
|
||||
|
||||
{
|
||||
programs.beets.package = pkgsUnstable.beets;
|
||||
|
||||
# …
|
||||
}
|
||||
```
|
||||
|
||||
2. If no `package` option is available then you can typically change
|
||||
the relevant package using an
|
||||
[overlay](https://nixos.org/nixpkgs/manual/#chap-overlays).
|
||||
|
||||
For example, if you want to use the `programs.skim` module but use
|
||||
the `skim` package from Nixpkgs unstable, then a configuration like
|
||||
|
||||
``` nix
|
||||
{ pkgs, config, ... }:
|
||||
|
||||
let
|
||||
pkgsUnstable = import <nixpkgs-unstable> {};
|
||||
in
|
||||
|
||||
{
|
||||
programs.skim.enable = true;
|
||||
|
||||
nixpkgs.overlays = [
|
||||
(_final: _prev: {
|
||||
skim = pkgsUnstable.skim;
|
||||
})
|
||||
];
|
||||
|
||||
# …
|
||||
}
|
||||
```
|
||||
|
||||
should work OK.
|
||||
|
||||
The same Home Manager overlay works in a flake-based standalone
|
||||
configuration if `pkgsUnstable` is passed to the Home Manager
|
||||
module:
|
||||
|
||||
``` nix
|
||||
{ pkgsUnstable, ... }:
|
||||
|
||||
{
|
||||
programs.skim.enable = true;
|
||||
|
||||
nixpkgs.overlays = [
|
||||
(_final: _prev: {
|
||||
skim = pkgsUnstable.skim;
|
||||
})
|
||||
];
|
||||
|
||||
# …
|
||||
}
|
||||
```
|
||||
|
||||
This also works when Home Manager is used as a NixOS or nix-darwin
|
||||
module without `home-manager.useGlobalPkgs = true`. If
|
||||
`home-manager.useGlobalPkgs = true` is enabled, Home Manager uses
|
||||
the system package set and the `nixpkgs.*` options inside Home
|
||||
Manager are disabled. In that case, put the overlay in the system
|
||||
configuration instead, for example:
|
||||
|
||||
``` nix
|
||||
{ pkgsUnstable, ... }:
|
||||
|
||||
{
|
||||
nixpkgs.overlays = [
|
||||
(_final: _prev: {
|
||||
skim = pkgsUnstable.skim;
|
||||
})
|
||||
];
|
||||
}
|
||||
```
|
||||
|
||||
In a flake-based NixOS or nix-darwin configuration, pass
|
||||
`pkgsUnstable` to `nixosSystem` or `darwinSystem` with
|
||||
`specialArgs`.
|
||||
@@ -1,47 +0,0 @@
|
||||
# Why is there a collision error when switching generation? {#_why_is_there_a_collision_error_when_switching_generation}
|
||||
|
||||
Home Manager currently installs packages into the user environment,
|
||||
precisely as if the packages were installed through `nix-env --install`.
|
||||
This means that you will get a collision error if your Home Manager
|
||||
configuration attempts to install a package that you already have
|
||||
installed manually, that is, packages that shows up when you run
|
||||
`nix-env --query`.
|
||||
|
||||
For example, imagine you have the `hello` package installed in your
|
||||
environment
|
||||
|
||||
``` shell
|
||||
$ nix-env --query
|
||||
hello-2.10
|
||||
```
|
||||
|
||||
and your Home Manager configuration contains
|
||||
|
||||
``` nix
|
||||
home.packages = [ pkgs.hello ];
|
||||
```
|
||||
|
||||
Then attempting to switch to this configuration will result in an error
|
||||
similar to
|
||||
|
||||
``` shell
|
||||
$ home-manager switch
|
||||
these derivations will be built:
|
||||
/nix/store/xg69wsnd1rp8xgs9qfsjal017nf0ldhm-home-manager-path.drv
|
||||
[…]
|
||||
Activating installPackages
|
||||
replacing old ‘home-manager-path’
|
||||
installing ‘home-manager-path’
|
||||
building path(s) ‘/nix/store/b5c0asjz9f06l52l9812w6k39ifr49jj-user-environment’
|
||||
Wide character in die at /nix/store/64jc9gd2rkbgdb4yjx3nrgc91bpjj5ky-buildenv.pl line 79.
|
||||
collision between ‘/nix/store/fmwa4axzghz11cnln5absh31nbhs9lq1-home-manager-path/bin/hello’ and ‘/nix/store/c2wyl8b9p4afivpcz8jplc9kis8rj36d-hello-2.10/bin/hello’; use ‘nix-env --set-flag priority NUMBER PKGNAME’ to change the priority of one of the conflicting packages
|
||||
builder for ‘/nix/store/b37x3s7pzxbasfqhaca5dqbf3pjjw0ip-user-environment.drv’ failed with exit code 2
|
||||
error: build of ‘/nix/store/b37x3s7pzxbasfqhaca5dqbf3pjjw0ip-user-environment.drv’ failed
|
||||
```
|
||||
|
||||
The solution is typically to uninstall the package from the environment
|
||||
using `nix-env --uninstall` and reattempt the Home Manager generation
|
||||
switch.
|
||||
|
||||
You could also opt to uninstall *all* of the packages from your profile
|
||||
with `nix-env --uninstall '*'`.
|
||||
@@ -1,39 +0,0 @@
|
||||
# How to set up a configuration for multiple users/machines? {#_how_to_set_up_a_configuration_for_multiple_users_machines}
|
||||
|
||||
A typical way to prepare a repository of configurations for multiple
|
||||
logins and machines is to prepare one \"top-level\" file for each unique
|
||||
combination.
|
||||
|
||||
For example, if you have two machines, called \"kronos\" and \"rhea\" on
|
||||
which you want to configure your user \"jane\" then you could create the
|
||||
files
|
||||
|
||||
- `kronos-jane.nix`,
|
||||
|
||||
- `rhea-jane.nix`, and
|
||||
|
||||
- `common.nix`
|
||||
|
||||
in your repository. On the kronos and rhea machines you can then make
|
||||
`~jane/.config/home-manager/home.nix` be a symbolic link to the
|
||||
corresponding file in your configuration repository.
|
||||
|
||||
The `kronos-jane.nix` and `rhea-jane.nix` files follow the format
|
||||
|
||||
``` nix
|
||||
{ ... }:
|
||||
|
||||
{
|
||||
imports = [ ./common.nix ];
|
||||
|
||||
# Various options that are specific for this machine/user.
|
||||
}
|
||||
```
|
||||
|
||||
while the `common.nix` file contains configuration shared across the two
|
||||
logins. Of course, instead of just a single `common.nix` file you can
|
||||
have multiple ones, even one per program or service.
|
||||
|
||||
You can get some inspiration from the [Post your home-manager home.nix
|
||||
file!](https://www.reddit.com/r/NixOS/comments/9bb9h9/post_your_homemanager_homenix_file/)
|
||||
Reddit thread.
|
||||
@@ -1,27 +0,0 @@
|
||||
# Why are the session variables not set? {#_why_are_the_session_variables_not_set}
|
||||
|
||||
Home Manager is only able to set session variables automatically if it
|
||||
manages your Bash, Z shell, or fish shell configuration. To enable such
|
||||
management you use [programs.bash.enable](#opt-programs.bash.enable),
|
||||
[programs.zsh.enable](#opt-programs.zsh.enable), or [programs.fish.enable](#opt-programs.fish.enable).
|
||||
|
||||
If you don't want to let Home Manager manage your shell then you will
|
||||
have to manually source the
|
||||
`~/.nix-profile/etc/profile.d/hm-session-vars.sh` file in an appropriate
|
||||
way. In Bash and Z shell this can be done by adding
|
||||
|
||||
``` bash
|
||||
. "$HOME/.nix-profile/etc/profile.d/hm-session-vars.sh"
|
||||
```
|
||||
|
||||
to your `.profile` and `.zshrc` files, respectively. The
|
||||
`hm-session-vars.sh` file should work in most Bourne-like shells. For
|
||||
fish shell, it is possible to source it using [the foreign-env
|
||||
plugin](https://github.com/oh-my-fish/plugin-foreign-env) or using the builtin
|
||||
[babelfish](https://github.com/bouk/babelfish)-translated variables:
|
||||
|
||||
``` bash
|
||||
fenv source "$HOME/.nix-profile/etc/profile.d/hm-session-vars.sh" > /dev/null
|
||||
# or
|
||||
source "$HOME/.nix-profile/etc/profile.d/hm-session-vars.fish"
|
||||
```
|
||||
@@ -1,111 +0,0 @@
|
||||
# How do I install packages from Nixpkgs unstable? {#_how_do_i_install_packages_from_nixpkgs_unstable}
|
||||
|
||||
If you are using a stable version of Nixpkgs but would like to install
|
||||
some particular packages from Nixpkgs unstable -- or some other channel
|
||||
-- then you can import the unstable Nixpkgs and refer to its packages
|
||||
within your configuration.
|
||||
|
||||
With channels, something like
|
||||
|
||||
``` nix
|
||||
{ pkgs, config, ... }:
|
||||
|
||||
let
|
||||
pkgsUnstable = import <nixpkgs-unstable> {};
|
||||
in
|
||||
{
|
||||
home.packages = [
|
||||
pkgsUnstable.foo
|
||||
];
|
||||
# …
|
||||
}
|
||||
```
|
||||
|
||||
should work provided you have a Nix channel called `nixpkgs-unstable`.
|
||||
|
||||
You can add the `nixpkgs-unstable` channel by running
|
||||
|
||||
``` shell
|
||||
$ nix-channel --add https://nixos.org/channels/nixpkgs-unstable nixpkgs-unstable
|
||||
$ nix-channel --update
|
||||
```
|
||||
|
||||
With flakes, add another Nixpkgs input and pass its packages to your
|
||||
Home Manager modules. For example, a standalone Home Manager flake can
|
||||
define the following. Replace 25.11 with the release branch your
|
||||
configuration follows.
|
||||
|
||||
``` nix
|
||||
{
|
||||
inputs = {
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11";
|
||||
nixpkgs-unstable.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
|
||||
home-manager.url = "github:nix-community/home-manager/release-25.11";
|
||||
};
|
||||
|
||||
outputs =
|
||||
{ nixpkgs, nixpkgs-unstable, home-manager, ... }:
|
||||
let
|
||||
# Replace this with the system of your Home Manager configuration.
|
||||
system = "x86_64-linux";
|
||||
pkgs = nixpkgs.legacyPackages.${system};
|
||||
pkgsUnstable = nixpkgs-unstable.legacyPackages.${system};
|
||||
in
|
||||
{
|
||||
homeConfigurations.jdoe = home-manager.lib.homeManagerConfiguration {
|
||||
inherit pkgs;
|
||||
extraSpecialArgs = { inherit pkgsUnstable; };
|
||||
modules = [ ./home.nix ];
|
||||
};
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
and then use the extra argument in `home.nix`:
|
||||
|
||||
``` nix
|
||||
{ pkgsUnstable, ... }:
|
||||
|
||||
{
|
||||
home.packages = [
|
||||
pkgsUnstable.foo
|
||||
];
|
||||
}
|
||||
```
|
||||
|
||||
When Home Manager is used as a NixOS or nix-darwin module, pass the
|
||||
extra package set with `home-manager.extraSpecialArgs` in the system
|
||||
configuration:
|
||||
|
||||
``` nix
|
||||
outputs =
|
||||
{ nixpkgs, nixpkgs-unstable, home-manager, ... }:
|
||||
let
|
||||
# Replace this with the system of your NixOS or nix-darwin configuration.
|
||||
system = "x86_64-linux";
|
||||
in
|
||||
{
|
||||
nixosConfigurations.hostname = nixpkgs.lib.nixosSystem {
|
||||
inherit system;
|
||||
modules = [
|
||||
home-manager.nixosModules.home-manager
|
||||
({ config, ... }: {
|
||||
home-manager.extraSpecialArgs = {
|
||||
pkgsUnstable = import nixpkgs-unstable {
|
||||
inherit system;
|
||||
config = config.nixpkgs.config;
|
||||
overlays = config.nixpkgs.overlays;
|
||||
};
|
||||
|
||||
# If you use a stock Nixpkgs configuration, you can use:
|
||||
# pkgsUnstable = nixpkgs-unstable.legacyPackages.${system};
|
||||
};
|
||||
})
|
||||
];
|
||||
};
|
||||
};
|
||||
```
|
||||
|
||||
The nix-darwin setup is the same pattern with
|
||||
`darwin.lib.darwinSystem` and
|
||||
`home-manager.darwinModules.home-manager`.
|
||||
@@ -1,35 +0,0 @@
|
||||
# Installing Home Manager {#ch-installation}
|
||||
|
||||
Home Manager can be used in three primary ways:
|
||||
|
||||
1. Using the standalone `home-manager` tool. For platforms other than
|
||||
NixOS and Darwin, this is the only available choice. It is also
|
||||
recommended for people on NixOS or Darwin that want to manage their
|
||||
home directory independently of the system as a whole. See
|
||||
[Standalone installation](installation/standalone.md#sec-install-standalone) for instructions
|
||||
on how to perform this installation.
|
||||
|
||||
2. As a module within a NixOS system configuration. This allows the
|
||||
user profiles to be built together with the system when running
|
||||
`nixos-rebuild`. See [NixOS module](installation/nixos.md#sec-install-nixos-module) for a
|
||||
description of this setup.
|
||||
|
||||
3. As a module within a
|
||||
[nix-darwin](https://github.com/nix-darwin/nix-darwin/) system
|
||||
configuration. This allows the user profiles to be built together
|
||||
with the system when running `darwin-rebuild`. See [nix-darwin
|
||||
module](installation/nix-darwin.md#sec-install-nix-darwin-module) for a description of this
|
||||
setup.
|
||||
|
||||
:::{.note}
|
||||
In this chapter we describe how to install Home Manager in the standard
|
||||
way using channels. If you prefer to use [Nix
|
||||
Flakes](https://wiki.nixos.org/wiki/Flakes) then please see the instructions
|
||||
in [nix flakes](nix-flakes.md#ch-nix-flakes).
|
||||
:::
|
||||
|
||||
```{=include=} sections
|
||||
installation/standalone.md
|
||||
installation/nixos.md
|
||||
installation/nix-darwin.md
|
||||
```
|
||||
@@ -1,128 +0,0 @@
|
||||
# nix-darwin module {#sec-install-nix-darwin-module}
|
||||
|
||||
Home Manager provides a module that allows you to prepare user
|
||||
environments directly from the
|
||||
[nix-darwin](https://github.com/nix-darwin/nix-darwin/) configuration file,
|
||||
which often is more convenient than using the `home-manager` tool.
|
||||
|
||||
To make the nix-darwin module available for use you must `import` it
|
||||
into your system configuration. This is most conveniently done by adding
|
||||
a Home Manager channel. For example, if you are following Nixpkgs master
|
||||
or an unstable channel, you can run
|
||||
|
||||
``` shell
|
||||
$ nix-channel --add https://github.com/nix-community/home-manager/archive/master.tar.gz home-manager
|
||||
$ nix-channel --update
|
||||
```
|
||||
|
||||
and if you follow a Nixpkgs version 26.05 channel, you can run
|
||||
|
||||
``` shell
|
||||
$ nix-channel --add https://github.com/nix-community/home-manager/archive/release-26.05.tar.gz home-manager
|
||||
$ nix-channel --update
|
||||
```
|
||||
|
||||
It is then possible to add
|
||||
|
||||
``` nix
|
||||
imports = [ <home-manager/nix-darwin> ];
|
||||
```
|
||||
|
||||
to your nix-darwin `configuration.nix` file, which will introduce a
|
||||
`home-manager.users` option whose type is an attribute set that maps
|
||||
user names to Home Manager configurations.
|
||||
|
||||
For example, a nix-darwin configuration may include the lines
|
||||
|
||||
``` nix
|
||||
users.users.eve = {
|
||||
name = "eve";
|
||||
home = "/Users/eve";
|
||||
};
|
||||
home-manager.users.eve = { pkgs, ... }: {
|
||||
home.packages = [ pkgs.atool pkgs.httpie ];
|
||||
programs.bash.enable = true;
|
||||
|
||||
# The state version is required and should stay at the version you
|
||||
# originally installed.
|
||||
home.stateVersion = "26.05";
|
||||
};
|
||||
```
|
||||
|
||||
and after a `darwin-rebuild switch` the user eve's environment should
|
||||
include a basic Bash configuration and the packages atool and httpie.
|
||||
|
||||
Home Manager activation runs as part of nix-darwin activation for each
|
||||
configured user.
|
||||
|
||||
If you do not plan on having Home Manager manage your shell
|
||||
configuration then you must add either
|
||||
|
||||
``` bash
|
||||
. "$HOME/.nix-profile/etc/profile.d/hm-session-vars.sh"
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
``` bash
|
||||
. "/etc/profiles/per-user/$USER/etc/profile.d/hm-session-vars.sh"
|
||||
```
|
||||
|
||||
to your shell configuration, depending on whether
|
||||
[home-manager.useUserPackages](#nix-darwin-opt-home-manager.useUserPackages) is enabled. This
|
||||
file can be sourced directly by POSIX.2-like shells such as
|
||||
[Bash](https://www.gnu.org/software/bash/) or [Z
|
||||
shell](http://zsh.sourceforge.net/). [Fish](https://fishshell.com) users
|
||||
can use utilities such as
|
||||
[foreign-env](https://github.com/oh-my-fish/plugin-foreign-env) or
|
||||
[babelfish](https://github.com/bouk/babelfish).
|
||||
|
||||
:::{.note}
|
||||
By default user packages will not be ignored in favor of
|
||||
`environment.systemPackages`, but they will be installed to
|
||||
`/etc/profiles/per-user/$USERNAME` if
|
||||
|
||||
``` nix
|
||||
home-manager.useUserPackages = true;
|
||||
```
|
||||
|
||||
is added to the nix-darwin configuration. This option may become the
|
||||
default value in the future.
|
||||
:::
|
||||
|
||||
:::{.note}
|
||||
By default, Home Manager uses a private `pkgs` instance that is
|
||||
configured via the `home-manager.users.<name>.nixpkgs` options. To
|
||||
instead use the global `pkgs` that is configured via the system level
|
||||
`nixpkgs` options, set
|
||||
|
||||
``` nix
|
||||
home-manager.useGlobalPkgs = true;
|
||||
```
|
||||
|
||||
This saves an extra Nixpkgs evaluation, adds consistency, and removes
|
||||
the dependency on `NIX_PATH`, which is otherwise used for importing
|
||||
Nixpkgs.
|
||||
:::
|
||||
|
||||
:::{.note}
|
||||
Home Manager passes extra module arguments to each
|
||||
`home-manager.users.<name>` module:
|
||||
|
||||
``` nix
|
||||
{ lib, pkgs, osConfig, darwinConfig, osClass, modulesPath, ... }:
|
||||
```
|
||||
|
||||
Here `osConfig` contains the system's nix-darwin configuration and
|
||||
`darwinConfig` is a Darwin-specific alias for the same value. The `lib`
|
||||
argument is Home Manager's extended library. You can pass additional module
|
||||
arguments with `home-manager.extraSpecialArgs`.
|
||||
:::
|
||||
|
||||
:::{.note}
|
||||
Use `home-manager.sharedModules` to add Home Manager modules to every user
|
||||
declared under `home-manager.users`.
|
||||
:::
|
||||
|
||||
Once installed you can see [Using Home Manager](../usage.md#ch-usage) for a more detailed
|
||||
description of Home Manager and how to use it.
|
||||
@@ -1,175 +0,0 @@
|
||||
# NixOS module {#sec-install-nixos-module}
|
||||
|
||||
Home Manager provides a NixOS module that allows you to prepare user
|
||||
environments directly from the system configuration file, which often is
|
||||
more convenient than using the `home-manager` tool. It also opens up
|
||||
additional possibilities, for example, to automatically configure user
|
||||
environments in NixOS declarative containers or on systems deployed
|
||||
through NixOps.
|
||||
|
||||
To make the NixOS module available for use you must `import` it into
|
||||
your system configuration. This is most conveniently done by adding a
|
||||
Home Manager channel to the root user. For example, if you are following
|
||||
Nixpkgs master or an unstable channel, you can run
|
||||
|
||||
``` shell
|
||||
$ sudo nix-channel --add https://github.com/nix-community/home-manager/archive/master.tar.gz home-manager
|
||||
$ sudo nix-channel --update
|
||||
```
|
||||
|
||||
and if you follow a Nixpkgs version 26.05 channel, you can run
|
||||
|
||||
``` shell
|
||||
$ sudo nix-channel --add https://github.com/nix-community/home-manager/archive/release-26.05.tar.gz home-manager
|
||||
$ sudo nix-channel --update
|
||||
```
|
||||
|
||||
It is then possible to add
|
||||
|
||||
``` nix
|
||||
imports = [ <home-manager/nixos> ];
|
||||
```
|
||||
|
||||
to your system `configuration.nix` file, which will introduce a new
|
||||
NixOS option called `home-manager.users` whose type is an attribute set
|
||||
that maps user names to Home Manager configurations.
|
||||
|
||||
Alternatively, home-manager installation can be done declaratively through configuration.nix using the following syntax:
|
||||
```nix
|
||||
{ config, pkgs, lib, ... }:
|
||||
|
||||
let
|
||||
home-manager = builtins.fetchTarball https://github.com/nix-community/home-manager/archive/release-26.05.tar.gz;
|
||||
in
|
||||
{
|
||||
imports =
|
||||
[
|
||||
(import "${home-manager}/nixos")
|
||||
];
|
||||
|
||||
users.users.eve.isNormalUser = true;
|
||||
home-manager.users.eve = { pkgs, ... }: {
|
||||
home.packages = [ pkgs.atool pkgs.httpie ];
|
||||
programs.bash.enable = true;
|
||||
|
||||
# The state version is required and should stay at the version you
|
||||
# originally installed.
|
||||
home.stateVersion = "26.05";
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
For example, a NixOS configuration may include the lines
|
||||
|
||||
``` nix
|
||||
users.users.eve.isNormalUser = true;
|
||||
home-manager.users.eve = { pkgs, ... }: {
|
||||
home.packages = [ pkgs.atool pkgs.httpie ];
|
||||
programs.bash.enable = true;
|
||||
|
||||
# This value determines the Home Manager release that your configuration is
|
||||
# compatible with. This helps avoid breakage when a new Home Manager release
|
||||
# introduces backwards incompatible changes.
|
||||
#
|
||||
# You should not change this value, even if you update Home Manager. If you do
|
||||
# want to update the value, then make sure to first check the Home Manager
|
||||
# release notes.
|
||||
home.stateVersion = "26.05"; # Please read the comment before changing.
|
||||
|
||||
};
|
||||
```
|
||||
|
||||
and after a `sudo nixos-rebuild switch` the user eve's environment
|
||||
should include a basic Bash configuration and the packages atool and
|
||||
httpie.
|
||||
|
||||
:::{.note}
|
||||
If `nixos-rebuild switch` does not result in the environment you expect,
|
||||
then the service to inspect depends on the activation mode.
|
||||
|
||||
By default, Home Manager activates each configured user during boot and
|
||||
system rebuilds through a NixOS system service:
|
||||
|
||||
``` shell
|
||||
$ systemctl status "home-manager-$USER.service"
|
||||
```
|
||||
|
||||
If `home-manager.startAsUserService = true` is set, Home Manager instead
|
||||
activates through the user's systemd service:
|
||||
|
||||
``` shell
|
||||
$ systemctl --user status home-manager.service
|
||||
```
|
||||
:::
|
||||
|
||||
If you do not plan on having Home Manager manage your shell
|
||||
configuration then you must add either
|
||||
|
||||
``` bash
|
||||
. "$HOME/.nix-profile/etc/profile.d/hm-session-vars.sh"
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
``` bash
|
||||
. "/etc/profiles/per-user/$USER/etc/profile.d/hm-session-vars.sh"
|
||||
```
|
||||
|
||||
to your shell configuration, depending on whether
|
||||
[home-manager.useUserPackages](#nixos-opt-home-manager.useUserPackages) is enabled. This file can
|
||||
be sourced directly by POSIX.2-like shells such as
|
||||
[Bash](https://www.gnu.org/software/bash/) or [Z
|
||||
shell](http://zsh.sourceforge.net/). [Fish](https://fishshell.com) users
|
||||
can use utilities such as
|
||||
[foreign-env](https://github.com/oh-my-fish/plugin-foreign-env) or
|
||||
[babelfish](https://github.com/bouk/babelfish).
|
||||
|
||||
:::{.note}
|
||||
By default packages will be installed to `$HOME/.nix-profile` but they
|
||||
can be installed to `/etc/profiles` if
|
||||
|
||||
``` nix
|
||||
home-manager.useUserPackages = true;
|
||||
```
|
||||
|
||||
is added to the system configuration. This is necessary if, for example,
|
||||
you wish to use `nixos-rebuild build-vm`. This option may become the
|
||||
default value in the future.
|
||||
:::
|
||||
|
||||
:::{.note}
|
||||
By default, Home Manager uses a private `pkgs` instance that is
|
||||
configured via the `home-manager.users.<name>.nixpkgs` options. To
|
||||
instead use the global `pkgs` that is configured via the system level
|
||||
`nixpkgs` options, set
|
||||
|
||||
``` nix
|
||||
home-manager.useGlobalPkgs = true;
|
||||
```
|
||||
|
||||
This saves an extra Nixpkgs evaluation, adds consistency, and removes
|
||||
the dependency on `NIX_PATH`, which is otherwise used for importing
|
||||
Nixpkgs.
|
||||
:::
|
||||
|
||||
:::{.note}
|
||||
Home Manager passes extra module arguments to each
|
||||
`home-manager.users.<name>` module:
|
||||
|
||||
``` nix
|
||||
{ lib, pkgs, osConfig, nixosConfig, osClass, modulesPath, ... }:
|
||||
```
|
||||
|
||||
Here `osConfig` contains the system's NixOS configuration and `nixosConfig`
|
||||
is a NixOS-specific alias for the same value. The `lib` argument is Home
|
||||
Manager's extended library. You can pass additional module arguments with
|
||||
`home-manager.extraSpecialArgs`.
|
||||
:::
|
||||
|
||||
:::{.note}
|
||||
Use `home-manager.sharedModules` to add Home Manager modules to every user
|
||||
declared under `home-manager.users`.
|
||||
:::
|
||||
|
||||
Once installed you can see [Using Home Manager](../usage.md#ch-usage) for a more detailed
|
||||
description of Home Manager and how to use it.
|
||||
@@ -1,75 +0,0 @@
|
||||
# Standalone installation {#sec-install-standalone}
|
||||
|
||||
1. Make sure you have a working Nix installation. Specifically, make
|
||||
sure that your user is able to build and install Nix packages. For
|
||||
example, you should be able to successfully run a command like
|
||||
`nix-instantiate '<nixpkgs>' -A hello` without having to switch to
|
||||
the root user. For a multi-user install of Nix this means that your
|
||||
user must be covered by the
|
||||
[`allowed-users`](https://nixos.org/nix/manual/#conf-allowed-users)
|
||||
Nix option. On NixOS you can control this option using the
|
||||
[`nix.settings.allowed-users`](https://nixos.org/manual/nixos/stable/options.html#opt-nix.settings.allowed-users)
|
||||
system option.
|
||||
|
||||
2. Add the appropriate Home Manager channel. If you are following
|
||||
Nixpkgs master or an unstable channel you can run
|
||||
|
||||
``` shell
|
||||
$ nix-channel --add https://github.com/nix-community/home-manager/archive/master.tar.gz home-manager
|
||||
$ nix-channel --update
|
||||
```
|
||||
|
||||
and if you follow a Nixpkgs version 26.05 channel you can run
|
||||
|
||||
``` shell
|
||||
$ nix-channel --add https://github.com/nix-community/home-manager/archive/release-26.05.tar.gz home-manager
|
||||
$ nix-channel --update
|
||||
```
|
||||
|
||||
3. Run the Home Manager installation command and create the first Home
|
||||
Manager generation:
|
||||
|
||||
``` shell
|
||||
$ nix-shell '<home-manager>' -A install
|
||||
```
|
||||
|
||||
Once finished, Home Manager should be active and available in your
|
||||
user environment.
|
||||
|
||||
4. If you do not plan on having Home Manager manage your shell
|
||||
configuration then you must source the
|
||||
|
||||
``` bash
|
||||
$HOME/.nix-profile/etc/profile.d/hm-session-vars.sh
|
||||
```
|
||||
|
||||
file in your shell configuration. Alternatively source
|
||||
|
||||
``` bash
|
||||
/etc/profiles/per-user/$USER/etc/profile.d/hm-session-vars.sh
|
||||
```
|
||||
|
||||
when managing home configuration together with system configuration.
|
||||
|
||||
This file can be sourced directly by POSIX.2-like shells such as
|
||||
[Bash](https://www.gnu.org/software/bash/) or [Z
|
||||
shell](http://zsh.sourceforge.net/). [Fish](https://fishshell.com)
|
||||
users can use utilities such as
|
||||
[foreign-env](https://github.com/oh-my-fish/plugin-foreign-env) or
|
||||
[babelfish](https://github.com/bouk/babelfish).
|
||||
|
||||
For example, if you use Bash then add
|
||||
|
||||
``` bash
|
||||
. "$HOME/.nix-profile/etc/profile.d/hm-session-vars.sh"
|
||||
```
|
||||
|
||||
to your `~/.profile` file.
|
||||
|
||||
If instead of using channels you want to run Home Manager from a Git
|
||||
checkout of the repository then you can use the
|
||||
[home-manager.path](#opt-programs.home-manager.path) option to specify the absolute
|
||||
path to the repository.
|
||||
|
||||
Once installed you can see [Using Home Manager](../usage.md#ch-usage) for a more detailed
|
||||
description of Home Manager and how to use it.
|
||||
@@ -1,11 +0,0 @@
|
||||
# Home Manager Internals {#ch-internals}
|
||||
|
||||
This chapter collects some documentation about the internal workings
|
||||
of Home Manager. The information here is mostly aimed to developers of
|
||||
Home Manager and those who do non-trivial integration with Home
|
||||
Manager.
|
||||
|
||||
|
||||
```{=include=} sections
|
||||
internals/activation.md
|
||||
```
|
||||
@@ -1,40 +0,0 @@
|
||||
# Activation {#sec-internals-activation}
|
||||
|
||||
Activating a Home Manager configuration ensures that the built
|
||||
configuration is introduced into the user's environment. The
|
||||
activation is performed by a suitably named script
|
||||
{command}`activate`. This script is generated as part of the
|
||||
configuration build and is placed in the root of the build output.
|
||||
|
||||
The activation script is implemented in the Bash language and consists
|
||||
of initialization code followed by a number of _activation script
|
||||
blocks_. These blocks are specified using the
|
||||
[home.activation](#opt-home.activation) option. The blocks may have
|
||||
dependencies among themselves and the generated activation script will
|
||||
contain the blocks serialized such that the dependencies are
|
||||
satisfied. A dependency cycle causes a failure when the configuration
|
||||
is built.
|
||||
|
||||
Historically, the activation script has been responsible for creating
|
||||
a new generation of the `home-manager` Nix profile. The more modern
|
||||
way, however, is to let the _activation driver_ – that is, the
|
||||
software calling the activation script – manage the profile. Indeed,
|
||||
in some cases we may not have a `home-manager` profile at all! This is
|
||||
the case when Home Manager is used as a NixOS or nix-darwin module, in
|
||||
these cases the system profile will contain references to the
|
||||
corresponding Home Manager configurations.
|
||||
|
||||
Note, to maintain backwards compatibility, the old activation script
|
||||
behavior is still the default. To choose the new mode of operation you
|
||||
have to call the activation script with the command line option
|
||||
`--driver-version 1`. The old behavior is available using
|
||||
`--driver-version 0`, or simply omit it entirely.
|
||||
|
||||
Unfortunately, driver software need to support both modes of operation
|
||||
for the time being since a user may wish to activate an old generation
|
||||
that contains an activation script that does not support
|
||||
`--driver-version`. To determine whether support is available, check
|
||||
the {file}`gen-version` file in the configuration build output root.
|
||||
If the file is missing then the activation script does not support
|
||||
`--driver-version`. If the file exists and contains the integer 1 or
|
||||
higher, then `--driver-version 1` is supported.
|
||||
@@ -1,32 +0,0 @@
|
||||
# Introduction to Home Manager {#ch-introduction}
|
||||
|
||||
Home Manager is a [Nix](https://nix.dev/)-powered tool for reproducible management of the contents of users' home directories.
|
||||
This includes programs, configuration files, environment variables and, well… arbitrary files.
|
||||
The following example snippet of Nix code:
|
||||
|
||||
```nix
|
||||
programs.git = {
|
||||
enable = true;
|
||||
userEmail = "joe@example.org";
|
||||
userName = "joe";
|
||||
};
|
||||
```
|
||||
|
||||
would make available to a user the `git` executable and man pages and a configuration file `~/.config/git/config`:
|
||||
|
||||
```ini
|
||||
[user]
|
||||
email = "joe@example.org"
|
||||
name = "joe"
|
||||
```
|
||||
|
||||
Since Home Manager is implemented in Nix, it provides several benefits:
|
||||
|
||||
- Contents are reproducible — a home will be the exact same every time it is built, unless of course, an intentional change is made.
|
||||
This also means you can have the exact same home on different hosts.
|
||||
- Significantly faster and more powerful than various backup strategies.
|
||||
- Unlike "dotfiles" repositories, Home Manager supports specifying programs, as well as their configurations.
|
||||
- Supported by <http://cache.nixos.org/>, so that you don't have to build from source.
|
||||
- If you do want to build some programs from source, there is hardly a tool more useful than Nix for that, and the build instructions can be neatly integrated in your Home Manager usage.
|
||||
- Infinitely composable, so that values in different configuration files and build instructions can share a source of truth.
|
||||
- Connects you with the [most extensive](https://repology.org/repositories/statistics/total) and [most up-to-date](https://repology.org/repositories/statistics/newest) software package repository on earth, [Nixpkgs](https://github.com/NixOS/nixpkgs).
|
||||
@@ -1,35 +0,0 @@
|
||||
# Home Manager Manual {#home-manager-manual}
|
||||
|
||||
## Version 26.11 (unstable)
|
||||
|
||||
|
||||
```{=include=} preface
|
||||
preface.md
|
||||
```
|
||||
|
||||
```{=include=} parts
|
||||
introduction.md
|
||||
installation.md
|
||||
usage.md
|
||||
nix-flakes.md
|
||||
writing-modules.md
|
||||
contributing.md
|
||||
internals.md
|
||||
3rd-party.md
|
||||
faq.md
|
||||
```
|
||||
|
||||
```{=include=} appendix html:into-file=//options.xhtml
|
||||
options.md
|
||||
```
|
||||
|
||||
```{=include=} appendix html:into-file=//nixos-options.xhtml
|
||||
nixos-options.md
|
||||
```
|
||||
|
||||
```{=include=} appendix html:into-file=//nix-darwin-options.xhtml
|
||||
nix-darwin-options.md
|
||||
```
|
||||
```{=include=} appendix html:into-file=//release-notes.xhtml
|
||||
release-notes/release-notes.md
|
||||
```
|
||||
@@ -1,7 +0,0 @@
|
||||
# nix-darwin Configuration Options {#ch-nix-darwin-options}
|
||||
|
||||
```{=include=} options
|
||||
id-prefix: nix-darwin-opt-
|
||||
list-id: nix-darwin-options
|
||||
source: @OPTIONS_JSON@
|
||||
```
|
||||
@@ -1,56 +0,0 @@
|
||||
# Nix Flakes {#ch-nix-flakes}
|
||||
|
||||
Home Manager is compatible with [Nix
|
||||
Flakes](https://wiki.nixos.org/wiki/Flakes). But please be aware that this
|
||||
support is still experimental and may change in backwards
|
||||
incompatible ways.
|
||||
|
||||
Just like in the standard installation you can use the Home Manager
|
||||
flake in three ways:
|
||||
|
||||
1. Using the standalone `home-manager` tool. For platforms other than
|
||||
NixOS and Darwin, this is the only available choice. It is also
|
||||
recommended for people on NixOS or Darwin that want to manage their
|
||||
home directory independently of the system as a whole. See
|
||||
[Standalone setup](nix-flakes/standalone.md#sec-flakes-standalone) for instructions on how
|
||||
to perform this installation.
|
||||
|
||||
2. As a module within a NixOS system configuration. This allows the
|
||||
user profiles to be built together with the system when running
|
||||
`nixos-rebuild`. See [NixOS module](nix-flakes/nixos.md#sec-flakes-nixos-module) for a
|
||||
description of this setup.
|
||||
|
||||
3. As a module within a [nix-darwin](https://github.com/nix-darwin/nix-darwin/)
|
||||
system configuration. This allows the user profiles to be built
|
||||
together with the system when running `darwin-rebuild`. See
|
||||
[nix-darwin module](nix-flakes/nix-darwin.md#sec-flakes-nix-darwin-module) for a
|
||||
description of this setup.
|
||||
|
||||
Advanced users may want Home Manager's `nixpkgs` input to follow the
|
||||
same Nixpkgs input as the rest of their flake. This avoids a second
|
||||
Nixpkgs input and makes Home Manager use the same pinned Nixpkgs source
|
||||
revision as the rest of the configuration:
|
||||
|
||||
``` nix
|
||||
home-manager.inputs.nixpkgs.follows = "nixpkgs";
|
||||
```
|
||||
|
||||
This removes the compatibility assumption between Home Manager and the
|
||||
Nixpkgs revision in Home Manager's own lock file, so use it carefully,
|
||||
especially when tracking unstable branches.
|
||||
|
||||
This does not by itself make Home Manager use the same `pkgs` value as
|
||||
your NixOS or nix-darwin system. In NixOS and nix-darwin module setups,
|
||||
`home-manager.useGlobalPkgs = true` controls that behavior by making
|
||||
Home Manager modules receive the system `pkgs` value. When
|
||||
`home-manager.useGlobalPkgs` is enabled, configure Nixpkgs overlays and
|
||||
configuration at the system level instead of through Home Manager
|
||||
`nixpkgs.*` options.
|
||||
|
||||
```{=include=} sections
|
||||
nix-flakes/prerequisites.md
|
||||
nix-flakes/standalone.md
|
||||
nix-flakes/nixos.md
|
||||
nix-flakes/nix-darwin.md
|
||||
nix-flakes/flake-parts.md
|
||||
```
|
||||
@@ -1,63 +0,0 @@
|
||||
# flake-parts module {#sec-flakes-flake-parts-module}
|
||||
|
||||
When using [flake-parts](https://flake.parts) you may wish to import Home
|
||||
Manager's flake module, `flakeModules.home-manager`.
|
||||
|
||||
```nix
|
||||
{
|
||||
description = "flake-parts configuration";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
|
||||
home-manager.url = "github:nix-community/home-manager";
|
||||
flake-parts.url = "github:hercules-ci/flake-parts";
|
||||
};
|
||||
|
||||
outputs = inputs@{
|
||||
flake-parts,
|
||||
home-manager,
|
||||
nixpkgs,
|
||||
...
|
||||
}:
|
||||
flake-parts.lib.mkFlake { inherit inputs; } {
|
||||
imports = [
|
||||
# Import home-manager's flake module
|
||||
inputs.home-manager.flakeModules.home-manager
|
||||
];
|
||||
flake = {
|
||||
# Reusable Home Manager module.
|
||||
homeModules.bash= { pkgs, ... }: {
|
||||
programs.bash = {
|
||||
enable = true;
|
||||
shellAliases = {
|
||||
ll = "ls -l";
|
||||
};
|
||||
};
|
||||
home.packages = [ pkgs.hello ];
|
||||
};
|
||||
|
||||
# Concrete Home Manager configuration.
|
||||
homeConfigurations.alice = home-manager.lib.homeManagerConfiguration {
|
||||
pkgs = import nixpkgs { system = "x86_64-linux"; };
|
||||
modules = [
|
||||
inputs.self.homeModules.bash
|
||||
{
|
||||
home.username = "alice";
|
||||
home.homeDirectory = "/home/alice";
|
||||
home.stateVersion = "25.11";
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
# See flake.parts for more features, such as `perSystem`
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
The flake module defines the `flake.homeModules` and `flake.homeConfigurations`
|
||||
options, allowing them to be properly merged if they are defined in multiple
|
||||
modules.
|
||||
|
||||
If you are only defining `homeModules` and/or `homeConfigurations` once in a
|
||||
single module, flake-parts should work fine without importing
|
||||
`flakeModules.home-manager`.
|
||||
@@ -1,59 +0,0 @@
|
||||
# nix-darwin module {#sec-flakes-nix-darwin-module}
|
||||
|
||||
The flake-based setup of the Home Manager nix-darwin module is similar
|
||||
to that of NixOS. The `flake.nix` would be:
|
||||
|
||||
``` nix
|
||||
{
|
||||
description = "Darwin configuration";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
|
||||
darwin.url = "github:nix-darwin/nix-darwin";
|
||||
darwin.inputs.nixpkgs.follows = "nixpkgs";
|
||||
home-manager.url = "github:nix-community/home-manager";
|
||||
};
|
||||
|
||||
outputs = inputs@{ nixpkgs, home-manager, darwin, ... }: {
|
||||
darwinConfigurations = {
|
||||
hostname = darwin.lib.darwinSystem {
|
||||
system = "x86_64-darwin";
|
||||
modules = [
|
||||
./configuration.nix
|
||||
home-manager.darwinModules.home-manager
|
||||
{
|
||||
home-manager.useGlobalPkgs = true;
|
||||
home-manager.useUserPackages = true;
|
||||
home-manager.extraSpecialArgs = { inherit inputs; };
|
||||
home-manager.users.jdoe = ./home.nix;
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
Use `home-manager.extraSpecialArgs` to pass arguments from your flake to
|
||||
`home.nix` and any imported Home Manager modules. For example, the
|
||||
configuration above makes the complete `inputs` attrset available to modules,
|
||||
so they can declare arguments such as `{ inputs, ... }:`.
|
||||
|
||||
The lower-level mechanism behind this is `_module.args`. Set
|
||||
`_module.args.<name>` from inside a module only when you need to provide a
|
||||
module argument from within the module graph itself. For values that originate
|
||||
outside the module graph, such as flake inputs, prefer
|
||||
`home-manager.extraSpecialArgs`.
|
||||
|
||||
Use `home-manager.sharedModules` for Home Manager modules or settings that
|
||||
should be imported by every user declared in `home-manager.users`.
|
||||
|
||||
The Home Manager configuration is also rebuilt with the nix-darwin
|
||||
generations. The rebuild command here may be
|
||||
`darwin-rebuild switch --flake ~/.config/darwin`.
|
||||
|
||||
You can use the above `flake.nix` as a template in `~/.config/darwin` by
|
||||
|
||||
``` shell
|
||||
$ nix flake new ~/.config/darwin -t github:nix-community/home-manager#nix-darwin
|
||||
```
|
||||
@@ -1,61 +0,0 @@
|
||||
# NixOS module {#sec-flakes-nixos-module}
|
||||
|
||||
To use Home Manager as a NixOS module, a bare-minimum `flake.nix` would
|
||||
be as follows:
|
||||
|
||||
``` nix
|
||||
{
|
||||
description = "NixOS configuration";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
|
||||
home-manager.url = "github:nix-community/home-manager";
|
||||
};
|
||||
|
||||
outputs = inputs@{ nixpkgs, home-manager, ... }: {
|
||||
nixosConfigurations = {
|
||||
hostname = nixpkgs.lib.nixosSystem {
|
||||
system = "x86_64-linux";
|
||||
modules = [
|
||||
./configuration.nix
|
||||
home-manager.nixosModules.home-manager
|
||||
{
|
||||
home-manager.useGlobalPkgs = true;
|
||||
home-manager.useUserPackages = true;
|
||||
home-manager.extraSpecialArgs = { inherit inputs; };
|
||||
home-manager.users.jdoe = ./home.nix;
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
Use `home-manager.extraSpecialArgs` to pass arguments from your flake to
|
||||
`home.nix` and any imported Home Manager modules. For example, the
|
||||
configuration above makes the complete `inputs` attrset available to modules,
|
||||
so they can declare arguments such as `{ inputs, ... }:`.
|
||||
|
||||
The lower-level mechanism behind this is `_module.args`. Set
|
||||
`_module.args.<name>` from inside a module only when you need to provide a
|
||||
module argument from within the module graph itself. For values that originate
|
||||
outside the module graph, such as flake inputs, prefer
|
||||
`home-manager.extraSpecialArgs`.
|
||||
|
||||
Use `home-manager.sharedModules` for Home Manager modules or settings that
|
||||
should be imported by every user declared in `home-manager.users`.
|
||||
|
||||
The Home Manager configuration is then part of the NixOS configuration
|
||||
and is automatically rebuilt with the system when using the appropriate
|
||||
command for the system, such as
|
||||
|
||||
``` shell
|
||||
$ nixos-rebuild switch --flake /etc/nixos
|
||||
```
|
||||
|
||||
You can use the above `flake.nix` as a template in `/etc/nixos` by
|
||||
|
||||
``` shell
|
||||
$ nix flake new /etc/nixos -t github:nix-community/home-manager#nixos
|
||||
```
|
||||
@@ -1,37 +0,0 @@
|
||||
# Prerequisites {#sec-flakes-prerequisites}
|
||||
|
||||
- Install Nix 2.4 or later, or have it in `nix-shell`.
|
||||
|
||||
- Enable experimental features `nix-command` and `flakes`.
|
||||
|
||||
- When using NixOS, add the following to your `configuration.nix`
|
||||
and rebuild your system.
|
||||
|
||||
``` nix
|
||||
nix.settings.experimental-features = "nix-command flakes";
|
||||
```
|
||||
|
||||
- If you are not using NixOS, add the following to `nix.conf`
|
||||
(located at `~/.config/nix/` or `/etc/nix/nix.conf`).
|
||||
|
||||
``` bash
|
||||
experimental-features = nix-command flakes
|
||||
```
|
||||
|
||||
You may need to restart the Nix daemon with, for example,
|
||||
`sudo systemctl restart nix-daemon.service`.
|
||||
|
||||
- Alternatively, you can enable flakes on a per-command basis with
|
||||
the following additional flags to `nix` and `home-manager`:
|
||||
|
||||
``` shell
|
||||
$ nix --extra-experimental-features "nix-command flakes" <sub-commands>
|
||||
$ home-manager --extra-experimental-features "nix-command flakes" <sub-commands>
|
||||
```
|
||||
|
||||
- Prepare your Home Manager configuration (`home.nix`).
|
||||
|
||||
Unlike the channel-based setup, `home.nix` will be evaluated when
|
||||
the flake is built, so it must be present before bootstrap of Home
|
||||
Manager from the flake. See [Configuration Example](../usage/configuration.md#sec-usage-configuration) for
|
||||
introduction about writing a Home Manager configuration.
|
||||
@@ -1,90 +0,0 @@
|
||||
# Standalone setup {#sec-flakes-standalone}
|
||||
|
||||
To prepare an initial Home Manager configuration for your logged in
|
||||
user, you can run the Home Manager `init` command directly from its
|
||||
flake.
|
||||
|
||||
For example, if you are using the unstable version of Nixpkgs or NixOS,
|
||||
then to generate and activate a basic configuration run the command
|
||||
|
||||
``` shell
|
||||
$ nix run home-manager/master -- init --switch
|
||||
```
|
||||
|
||||
For Nixpkgs or NixOS version 26.05 run
|
||||
|
||||
``` shell
|
||||
$ nix run home-manager/release-26.05 -- init --switch
|
||||
```
|
||||
|
||||
This will generate a `flake.nix` and a `home.nix` file in
|
||||
`~/.config/home-manager`, creating the directory if it does not exist.
|
||||
|
||||
If you need to pass additional values from your flake to `home.nix` or any
|
||||
imported Home Manager modules, use `extraSpecialArgs` in the call to
|
||||
`home-manager.lib.homeManagerConfiguration`:
|
||||
|
||||
``` nix
|
||||
{
|
||||
inputs = {
|
||||
nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
|
||||
home-manager.url = "github:nix-community/home-manager";
|
||||
};
|
||||
|
||||
outputs = inputs@{ nixpkgs, home-manager, ... }: {
|
||||
homeConfigurations.jdoe = home-manager.lib.homeManagerConfiguration {
|
||||
pkgs = nixpkgs.legacyPackages.x86_64-linux;
|
||||
extraSpecialArgs = { inherit inputs; };
|
||||
modules = [ ./home.nix ];
|
||||
};
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
Any attribute in `extraSpecialArgs` becomes a module argument, so `home.nix`
|
||||
or imported modules can declare arguments such as `{ inputs, ... }:`.
|
||||
|
||||
The lower-level mechanism behind this is `_module.args`. Set
|
||||
`_module.args.<name>` from inside a module only when you need to provide a
|
||||
module argument from within the module graph itself. For values that originate
|
||||
outside the module graph, such as flake inputs, prefer `extraSpecialArgs`.
|
||||
|
||||
If you omit the `--switch` option then the activation will not happen.
|
||||
This is useful if you want to inspect and edit the configuration before
|
||||
activating it.
|
||||
|
||||
``` shell
|
||||
$ nix run home-manager/$branch -- init
|
||||
$ # Edit files in ~/.config/home-manager
|
||||
$ nix run home-manager/$branch -- init --switch
|
||||
```
|
||||
|
||||
Where `$branch` is one of `master` or `release-26.05`.
|
||||
|
||||
After the initial activation has completed successfully then building
|
||||
and activating your flake-based configuration is as simple as
|
||||
|
||||
``` shell
|
||||
$ home-manager switch
|
||||
```
|
||||
|
||||
It is possible to override the default configuration directory, if you
|
||||
want. For example,
|
||||
|
||||
``` shell
|
||||
$ nix run home-manager/$branch -- init --switch ~/hmconf
|
||||
$ # And after the initial activation.
|
||||
$ home-manager switch --flake ~/hmconf
|
||||
```
|
||||
|
||||
::: {.note}
|
||||
The flake inputs are not automatically updated by Home Manager. Update
|
||||
the lock file with `nix flake update` before switching if you want to
|
||||
use newer input revisions.
|
||||
|
||||
If you only want to update specific flake inputs, name them explicitly,
|
||||
for example `nix flake update nixpkgs home-manager`.
|
||||
|
||||
These commands assume that your current directory is the flake. If not,
|
||||
pass the flake path or URI with `--flake <flake-uri>`.
|
||||
:::
|
||||
@@ -1,7 +0,0 @@
|
||||
# NixOS Configuration Options {#ch-nixos-options}
|
||||
|
||||
```{=include=} options
|
||||
id-prefix: nixos-opt-
|
||||
list-id: nixos-options
|
||||
source: @OPTIONS_JSON@
|
||||
```
|
||||
@@ -1,7 +0,0 @@
|
||||
# Home Manager Configuration Options {#ch-options}
|
||||
|
||||
```{=include=} options
|
||||
id-prefix: opt-
|
||||
list-id: home-manager-options
|
||||
source: @OPTIONS_JSON@
|
||||
```
|
||||
@@ -1,20 +0,0 @@
|
||||
# Preface {#preface}
|
||||
|
||||
This manual will eventually describe how to install, use, and extend Home
|
||||
Manager.
|
||||
|
||||
If you encounter problems then please reach out on the IRC channel
|
||||
[#home-manager](https://webchat.oftc.net/?channels=home-manager)
|
||||
hosted by [OFTC](https://oftc.net/).
|
||||
There is also a [Matrix room](https://matrix.to/#/%23hm:rycee.net),
|
||||
which is bridged to the IRC channel.
|
||||
If your problem is caused by a bug in Home Manager then it should
|
||||
be reported on the
|
||||
[Home Manager issue tracker](https://github.com/nix-community/home-manager/issues).
|
||||
|
||||
|
||||
:::{.note}
|
||||
Commands prefixed with `$ sudo` have to be run as root, either
|
||||
requiring to login as root user or temporarily switching to it using
|
||||
`sudo` for example.
|
||||
:::
|
||||
@@ -1,66 +0,0 @@
|
||||
# Using Home Manager {#ch-usage}
|
||||
|
||||
Your use of Home Manager is centered around the configuration file,
|
||||
which is typically found at `~/.config/home-manager/home.nix` in the
|
||||
standard installation or `~/.config/home-manager/flake.nix` in a Nix
|
||||
flake based installation.
|
||||
|
||||
::: {.note}
|
||||
The default configuration used to be placed in `~/.config/nixpkgs`¸ so
|
||||
you may see references to that elsewhere. The old directory still works
|
||||
but Home Manager will print a warning message when used.
|
||||
:::
|
||||
|
||||
This configuration file can be *built* and *activated*.
|
||||
|
||||
Building a configuration produces a directory in the Nix store that
|
||||
contains all files and programs that should be available in your home
|
||||
directory and Nix user profile, respectively. The build step also checks
|
||||
that the configuration is valid and it will fail with an error if you,
|
||||
for example, assign a value to an option that does not exist or assign a
|
||||
value of the wrong type. Some modules also have custom assertions that
|
||||
perform more detailed, module specific, checks.
|
||||
|
||||
Concretely, if your configuration contains
|
||||
|
||||
``` nix
|
||||
programs.emacs.enable = "yes";
|
||||
```
|
||||
|
||||
then building it, for example using `home-manager build`, will result in
|
||||
an error message saying something like
|
||||
|
||||
```console
|
||||
$ home-manager build
|
||||
error: A definition for option `programs.emacs.enable' is not of type `boolean'. Definition values:
|
||||
- In `/home/jdoe/.config/home-manager/home.nix': "yes"
|
||||
(use '--show-trace' to show detailed location information)
|
||||
```
|
||||
|
||||
The message indicates that you must provide a Boolean value for this
|
||||
option, that is, either `true` or `false`. The documentation of each
|
||||
option will state the expected type, for
|
||||
[programs.emacs.enable](#opt-programs.emacs.enable) you will see "Type: boolean". You
|
||||
there also find information about the default value and a description of
|
||||
the option. You can find the complete option documentation in
|
||||
[Home Manager Configuration Options](options.md#ch-options) or directly in the terminal by running
|
||||
|
||||
``` shell
|
||||
man home-configuration.nix
|
||||
```
|
||||
|
||||
Once a configuration is successfully built, it can be activated. The
|
||||
activation performs the steps necessary to make the files, programs, and
|
||||
services available in your user environment. The `home-manager switch`
|
||||
command performs a combined build and activation.
|
||||
|
||||
```{=include=} sections
|
||||
usage/configuration.md
|
||||
usage/rollbacks.md
|
||||
usage/dotfiles.md
|
||||
usage/graphical.md
|
||||
usage/gpu-non-nixos.md
|
||||
usage/modular-services.md
|
||||
usage/updating.md
|
||||
usage/upgrading.md
|
||||
```
|
||||
@@ -1,112 +0,0 @@
|
||||
# Configuration Example {#sec-usage-configuration}
|
||||
|
||||
A fresh install of Home Manager will generate a minimal
|
||||
`~/.config/home-manager/home.nix` file containing something like
|
||||
|
||||
``` nix
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
# Home Manager needs a bit of information about you and the
|
||||
# paths it should manage.
|
||||
home.username = "jdoe";
|
||||
home.homeDirectory = "/home/jdoe";
|
||||
|
||||
# This value determines the Home Manager release that your
|
||||
# configuration is compatible with. This helps avoid breakage
|
||||
# when a new Home Manager release introduces backwards
|
||||
# incompatible changes.
|
||||
#
|
||||
# You can update Home Manager without changing this value. See
|
||||
# the Home Manager release notes for a list of state version
|
||||
# changes in each release.
|
||||
home.stateVersion = "26.05";
|
||||
|
||||
# Let Home Manager install and manage itself.
|
||||
programs.home-manager.enable = true;
|
||||
}
|
||||
```
|
||||
|
||||
You can use this as a base for your further configurations.
|
||||
|
||||
::: {.note}
|
||||
If you are not very familiar with the Nix language and NixOS modules
|
||||
then it is encouraged to start with small and simple changes. As you
|
||||
learn you can gradually grow the configuration with confidence.
|
||||
:::
|
||||
|
||||
As an example, let us expand the initial configuration file to also
|
||||
install the htop and fortune packages, install Emacs with a few extra
|
||||
packages available, and enable the user gpg-agent service.
|
||||
|
||||
To satisfy the above setup we should elaborate the `home.nix` file as
|
||||
follows:
|
||||
|
||||
``` nix
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
# Home Manager needs a bit of information about you and the
|
||||
# paths it should manage.
|
||||
home.username = "jdoe";
|
||||
home.homeDirectory = "/home/jdoe";
|
||||
|
||||
# Packages that should be installed to the user profile.
|
||||
home.packages = [
|
||||
pkgs.htop
|
||||
pkgs.fortune
|
||||
];
|
||||
|
||||
# This value determines the Home Manager release that your
|
||||
# configuration is compatible with. This helps avoid breakage
|
||||
# when a new Home Manager release introduces backwards
|
||||
# incompatible changes.
|
||||
#
|
||||
# You can update Home Manager without changing this value. See
|
||||
# the Home Manager release notes for a list of state version
|
||||
# changes in each release.
|
||||
home.stateVersion = "26.05";
|
||||
|
||||
# Let Home Manager install and manage itself.
|
||||
programs.home-manager.enable = true;
|
||||
|
||||
programs.emacs = {
|
||||
enable = true;
|
||||
extraPackages = epkgs: [
|
||||
epkgs.nix-mode
|
||||
epkgs.magit
|
||||
];
|
||||
};
|
||||
|
||||
services.gpg-agent = {
|
||||
enable = true;
|
||||
defaultCacheTtl = 1800;
|
||||
enableSshSupport = true;
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
- Nixpkgs packages can be installed to the user profile using
|
||||
[home.packages](#opt-home.packages).
|
||||
|
||||
- The option names of a program module typically start with
|
||||
`programs.<package name>`.
|
||||
|
||||
- Similarly, for a service module, the names start with
|
||||
`services.<package name>`. Note in some cases a package has both
|
||||
programs *and* service options -- Emacs is such an example.
|
||||
|
||||
To activate this configuration you can run
|
||||
|
||||
``` shell
|
||||
home-manager switch
|
||||
```
|
||||
|
||||
or if you are not feeling so lucky,
|
||||
|
||||
``` shell
|
||||
home-manager build
|
||||
```
|
||||
|
||||
which will create a `result` link to a directory containing an
|
||||
activation script and the generated home directory files.
|
||||
@@ -1,169 +0,0 @@
|
||||
# Keeping your \~ safe from harm {#sec-usage-dotfiles}
|
||||
|
||||
To configure programs and services Home Manager must write various
|
||||
things to your home directory. To prevent overwriting any existing files
|
||||
when switching to a new generation, Home Manager will attempt to detect
|
||||
collisions between existing files and generated files. If any such
|
||||
collision is detected the activation will terminate before changing
|
||||
anything on your computer.
|
||||
|
||||
For example, suppose you have a wonderful, painstakingly created
|
||||
`~/.config/git/config` and add
|
||||
|
||||
``` nix
|
||||
{
|
||||
# …
|
||||
|
||||
programs.git = {
|
||||
enable = true;
|
||||
userName = "Jane Doe";
|
||||
userEmail = "jane.doe@example.org";
|
||||
};
|
||||
|
||||
# …
|
||||
}
|
||||
```
|
||||
|
||||
to your configuration. Attempting to switch to the generation will then
|
||||
result in
|
||||
|
||||
``` shell
|
||||
$ home-manager switch
|
||||
…
|
||||
Activating checkLinkTargets
|
||||
Existing file '/home/jdoe/.config/git/config' is in the way
|
||||
Please move the above files and try again
|
||||
```
|
||||
|
||||
This error is about a file that Home Manager wants to manage as a
|
||||
symbolic link in your home directory. It is separate from package
|
||||
profile collisions, which usually mention `installPackages` or a
|
||||
`collision between .../bin/...` path. For package collisions, see
|
||||
[Why is there a collision error when switching generation?](../faq/collision.md#_why_is_there_a_collision_error_when_switching_generation).
|
||||
|
||||
## Resolving file collisions {#sec-usage-dotfiles-collisions}
|
||||
|
||||
The safest resolution is to inspect the existing path, move any
|
||||
settings you want Home Manager to manage into your configuration, and
|
||||
remove or move the unmanaged file before switching again.
|
||||
|
||||
For a standalone Home Manager installation, you can ask Home Manager to
|
||||
move unmanaged non-symlink paths out of the way during activation:
|
||||
|
||||
``` shell
|
||||
home-manager switch -b backup
|
||||
```
|
||||
|
||||
With the command above, a colliding `~/.config/git/config` is moved to
|
||||
`~/.config/git/config.backup` before Home Manager links the managed
|
||||
file. If the backup path already exists then activation still aborts, so
|
||||
choose an extension whose backup path does not already exist.
|
||||
|
||||
Standalone activation can also run a custom command for each collision:
|
||||
|
||||
``` shell
|
||||
home-manager switch -B trash-put
|
||||
```
|
||||
|
||||
The command receives the colliding path as an argument and must move or
|
||||
remove that path. If both `-B` and `-b` are set, the custom command takes
|
||||
precedence; the command may still use the
|
||||
`HOME_MANAGER_BACKUP_EXT` environment variable set by `-b`.
|
||||
|
||||
When Home Manager is used as a NixOS or nix-darwin module, configure the
|
||||
corresponding module options instead of passing standalone command line
|
||||
flags:
|
||||
|
||||
``` nix
|
||||
{
|
||||
home-manager.backupFileExtension = "backup";
|
||||
}
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
``` nix
|
||||
{
|
||||
home-manager.backupCommand = "${pkgs.trash-cli}/bin/trash-put";
|
||||
}
|
||||
```
|
||||
|
||||
If both {option}`home-manager.backupCommand` and
|
||||
{option}`home-manager.backupFileExtension` are set, the command takes
|
||||
precedence. The extension is still exported to the command as
|
||||
`HOME_MANAGER_BACKUP_EXT`, so the command can use it when implementing
|
||||
its own backup naming. With
|
||||
{option}`home-manager.backupFileExtension`, Home Manager refuses to
|
||||
replace an existing backup path unless
|
||||
{option}`home-manager.overwriteBackup` is enabled:
|
||||
|
||||
``` nix
|
||||
{
|
||||
home-manager.backupFileExtension = "backup";
|
||||
home-manager.overwriteBackup = true;
|
||||
}
|
||||
```
|
||||
|
||||
::: {.warning}
|
||||
{option}`home-manager.overwriteBackup` allows activation to clobber
|
||||
existing backup files. Only enable it when those backup paths are
|
||||
disposable.
|
||||
:::
|
||||
|
||||
For individual files, many file options also support `force = true`:
|
||||
|
||||
``` nix
|
||||
{
|
||||
home.file.".config/example" = {
|
||||
source = ./example;
|
||||
force = true;
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
This skips the collision check for the affected target and lets Home
|
||||
Manager replace the existing file or link. Use it sparingly; it can
|
||||
silently delete local changes.
|
||||
|
||||
Backup commands and backup extensions are intended for unmanaged
|
||||
non-symlink paths. If the colliding target is an unmanaged symbolic
|
||||
link, move it manually or use `force = true` after checking that the
|
||||
link target is safe to replace.
|
||||
|
||||
## Advanced file behavior {#sec-usage-dotfiles-advanced}
|
||||
|
||||
The notes below apply to {option}`home.file` and to options based on the
|
||||
same file type, such as {option}`xdg.configFile`.
|
||||
|
||||
When a file source is a directory, {option}`home.file.<name>.recursive`
|
||||
changes how the directory is linked. With the default `recursive =
|
||||
false`, the target is one symbolic link to the source directory. With
|
||||
`recursive = true`, Home Manager creates a matching directory tree and
|
||||
links each leaf file into it.
|
||||
|
||||
Recursive directory linking has special overlap behavior. A direct
|
||||
duplicate target, such as two managed files both targeting `foo`, is an
|
||||
error. If a recursively linked directory provides `foo/bar` and another
|
||||
managed file also targets `foo/bar`, Home Manager keeps the recursive
|
||||
file by default and ignores the overlapping regular file.
|
||||
|
||||
The {option}`home.file.<name>.onChange` hook runs after the new files
|
||||
are linked. For recursive file entries, the hook is always run, so it
|
||||
should be written to be safe even when no leaf file actually changed.
|
||||
|
||||
Normally a path assigned to {option}`home.file.<name>.source` is copied
|
||||
or linked through the Nix store. To make Home Manager create a link to a
|
||||
live path outside the store, use
|
||||
`config.lib.file.mkOutOfStoreSymlink`:
|
||||
|
||||
``` nix
|
||||
{ config, ... }:
|
||||
|
||||
{
|
||||
home.file.".config/example".source =
|
||||
config.lib.file.mkOutOfStoreSymlink ./example;
|
||||
}
|
||||
```
|
||||
|
||||
This is useful when the target should follow changes to a mutable file
|
||||
or directory outside the store.
|
||||
@@ -1,203 +0,0 @@
|
||||
# GPU on non-NixOS systems {#sec-usage-gpu-non-nixos}
|
||||
|
||||
To access the GPU, programs need access to OpenGL and Vulkan libraries. While
|
||||
this works transparently on NixOS, it does not on other Linux systems. There are
|
||||
two options:
|
||||
|
||||
1. Recommended: modify the host system slightly so that the graphics libraries
|
||||
can be found where programs from Nixpkgs can find them.
|
||||
2. Wrap programs from Nixpkgs in an environment which tells them where to find
|
||||
graphics libraries.
|
||||
|
||||
The first option is very clean because the needed modifications to the host OS
|
||||
are small. However, it does require root/sudo access to the system, which may
|
||||
not be available. The second approach avoids that. However, it injects libraries
|
||||
from Nixpkgs into the environment of wrapped programs, which can make it
|
||||
impossible to launch programs of the host OS from wrapped programs.
|
||||
|
||||
|
||||
## When sudo is available: fixing the host OS {#sec-usage-gpu-sudo}
|
||||
|
||||
The {option}`targets.genericLinux.gpu` module is automatically enabled whenever
|
||||
the option {option}`targets.genericLinux.enable` is set (unless
|
||||
[NixGL](#sec-usage-gpu-nosudo) is used instead), which is recommended for
|
||||
non-NixOS Linux distributions in any case. The module can also be explicitly
|
||||
enabled by setting {option}`targets.genericLinux.gpu.enable`.
|
||||
|
||||
This module builds a directory containing GPU libraries. When activating the
|
||||
home configuration by `home-manager switch`, the host system is examined: for
|
||||
compatibility with NixOS, these libraries need to be placed in
|
||||
`/run/opengl-driver`. If this directory does not exist, or contains a different
|
||||
set of libraries, the activation script will print a warning such as
|
||||
|
||||
```text
|
||||
Activating checkExistingGpuDrivers
|
||||
GPU drivers require an update, run
|
||||
sudo /nix/store/HASH-non-nixos-gpu/bin/non-nixos-gpu-setup
|
||||
```
|
||||
|
||||
Because the `/run` directory is volatile and disappears on reboot, libraries
|
||||
cannot be simply copied or linked there. The `non-nixos-gpu-setup` script
|
||||
installs a
|
||||
[`tmpfiles.d`](https://www.freedesktop.org/software/systemd/man/latest/tmpfiles.d.html)
|
||||
config which ensures that the drivers are linked to `/run/opengl-driver` on
|
||||
boot. Home Manager will always check and warn you when this setup needs to be
|
||||
refreshed.
|
||||
|
||||
If you ever wish to uninstall these drivers, all you need to do is
|
||||
|
||||
```sh
|
||||
sudo rm /run/opengl-driver
|
||||
sudo rm /etc/tmpfiles.d/non-nixos-gpu.conf
|
||||
```
|
||||
|
||||
|
||||
### GPU offloading {#sec-usage-gpu-offloading}
|
||||
|
||||
You can use the {option}`targets.genericLinux.nixGL.prime.installScript` option.
|
||||
It installs the `prime-offload` script which is configured through options under
|
||||
{option}`targets.genericLinux.nixGL.prime`. This functionality is independent
|
||||
from the rest of NixGL and can be used when
|
||||
{option}`targets.genericLinux.nixGL.packages` is left `null`, which it should be
|
||||
when using drivers from `/run/opengl-driver`.
|
||||
|
||||
|
||||
### Nvidia drivers {#sec-usage-gpu-nvidia}
|
||||
|
||||
If you need to include the proprietary Nvidia drivers, the process is a bit more
|
||||
involved. You need to:
|
||||
|
||||
1. Determine the exact version used by the host system. Example: `550.163.01`
|
||||
|
||||
1. Fetch that version of the drivers from Nvidia and calculate their hash.
|
||||
Example:
|
||||
|
||||
```sh
|
||||
nix store prefetch-file \
|
||||
https://download.nvidia.com/XFree86/Linux-x86_64/550.163.01/NVIDIA-Linux-x86_64-550.163.01.run
|
||||
```
|
||||
|
||||
Attention: the version and architecture are present twice. If you are on an
|
||||
ARM system, replace `x86_64` with `aarch64`.
|
||||
|
||||
1. Put this information into your home configuration. Example:
|
||||
|
||||
```nix
|
||||
targets.genericLinux.gpu.nvidia = {
|
||||
enable = true;
|
||||
version = "550.163.01";
|
||||
sha256 = "sha256-74FJ9bNFlUYBRen7+C08ku5Gc1uFYGeqlIh7l1yrmi4=";
|
||||
};
|
||||
```
|
||||
|
||||
::: {.warning}
|
||||
The Nvidia driver version **must** match the host system. This means that you
|
||||
must pay attention when upgrading the system and update the home configuration
|
||||
as well.
|
||||
:::
|
||||
|
||||
|
||||
## No root access: wrapping programs {#sec-usage-gpu-nosudo}
|
||||
|
||||
The wrapping approach is facilitated by
|
||||
[NixGL](https://github.com/nix-community/nixGL), which can be integrated into
|
||||
Home Manager.
|
||||
|
||||
::: {.warning}
|
||||
|
||||
This approach can cause issues when a wrapped program from Nixpkgs executes a
|
||||
program from the host. For example, Firefox from Nixpkgs must be wrapped by
|
||||
NixGL in order for graphical acceleration to work. If you then download a PDF
|
||||
file and open it in a PDF viewer that is not installed from Nixpkgs but is
|
||||
provided by the host distribution, there may be issues. Because Firefox's
|
||||
environment injects libraries from NixGL, they are inherited by the PDF viewer,
|
||||
and unless they are the same or compatible version as the libraries on the host,
|
||||
the viewer will not work. This problem manifests more often with Vulkan because
|
||||
it needs a larger set of injected libraries than OpenGL.
|
||||
|
||||
The problem typically manifests with errors similar to
|
||||
|
||||
```text
|
||||
/nix/store/HASH-gcc-12.3.0-lib/lib/libstdc++.so.6: version `GLIBCXX_3.4.31' not found
|
||||
```
|
||||
|
||||
:::
|
||||
|
||||
To enable the integration, import NixGL into your home configuration, either as
|
||||
a channel, or as a flake input passed via `extraSpecialArgs`. Then, set the
|
||||
`targets.genericLinux.nixGL.packages` option to the package set provided by
|
||||
NixGL.
|
||||
|
||||
Once integration is enabled, it can be used in two ways: as Nix functions for
|
||||
wrapping programs installed via Home Manager, and as shell commands for running
|
||||
programs installed by other means (such as `nix shell`). In either case, there
|
||||
are several wrappers available. They can be broadly categorized
|
||||
|
||||
- by vendor: as Mesa (for Free drivers of all vendors) and Nvidia (for
|
||||
Nvidia-specific proprietary drivers).
|
||||
- by GPU selection: as primary and secondary (offloading).
|
||||
|
||||
For example, the `mesa` wrapper provides support for running programs on the
|
||||
primary GPU for Intel, AMD and Nouveau drivers, while the `mesaPrime` wrapper
|
||||
does the same for the secondary GPU.
|
||||
|
||||
**Note:** when using Nvidia wrappers together with flakes, your home
|
||||
configuration will not be pure and needs to be built using `home-manager switch
|
||||
--impure`. Otherwise, the build will fail, complaining about missing attribute
|
||||
`currentTime`.
|
||||
|
||||
Wrapper functions are available under `config.lib.nixGL.wrappers`. However, it
|
||||
can be more convenient to use the `config.lib.nixGL.wrap` alias, which can be
|
||||
configured to use any of the wrappers. It is intended to provide a customization
|
||||
point when the same home configuration is used across several machines with
|
||||
different hardware. There is also the `config.lib.nixGL.wrapOffload` alias for
|
||||
two-GPU systems.
|
||||
|
||||
Another convenience is that all wrapper functions are always available. However,
|
||||
when `targets.genericLinux.nixGL.packages` option is unset, they are no-ops.
|
||||
This allows them to be used even when the home configuration is used on NixOS
|
||||
machines. The exception is the `prime-offload` script which ignores
|
||||
`targets.genericLinux.nixGL.packages` and is installed into the environment
|
||||
whenever `targets.genericLinux.nixGL.prime.installScript` is set. This script,
|
||||
which can be used to start a program on a secondary GPU, does not depend on
|
||||
NixGL and is useful on NixOS systems as well.
|
||||
|
||||
Below is an abbreviated example for an Optimus laptop that makes use of both
|
||||
Mesa and Nvidia wrappers, where the latter is used in dGPU offloading mode. It
|
||||
demonstrates how to wrap `mpv` to run on the integrated Intel GPU, wrap FreeCAD
|
||||
to run on the Nvidia dGPU, and how to install the wrapper scripts. It also wraps
|
||||
Xonotic to run on the dGPU, but uses the wrapper function directly for
|
||||
demonstration purposes.
|
||||
|
||||
```nix
|
||||
{ config, lib, pkgs, nixgl, ... }:
|
||||
{
|
||||
targets.genericLinux.nixGL = {
|
||||
packages = nixgl.packages;
|
||||
defaultWrapper = "mesa";
|
||||
offloadWrapper = "nvidiaPrime";
|
||||
installScripts = [ "mesa" "nvidiaPrime" ];
|
||||
};
|
||||
|
||||
programs.mpv = {
|
||||
enable = true;
|
||||
package = config.lib.nixGL.wrap pkgs.mpv;
|
||||
};
|
||||
|
||||
home.packages = [
|
||||
(config.lib.nixGL.wrapOffload pkgs.freecad)
|
||||
(config.lib.nixGL.wrappers.nvidiaPrime pkgs.xonotic)
|
||||
];
|
||||
}
|
||||
```
|
||||
|
||||
The above example assumes a flake-based setup where `nixgl` was passed from the
|
||||
flake. When using channels, the example would instead begin with
|
||||
|
||||
```nix
|
||||
{ config, lib, pkgs, ... }:
|
||||
{
|
||||
targets.genericLinux.nixGL.packages = import <nixgl> { inherit pkgs; };
|
||||
# The rest is the same as above
|
||||
...
|
||||
```
|
||||
@@ -1,32 +0,0 @@
|
||||
# Graphical services {#sec-usage-graphical}
|
||||
|
||||
Home Manager includes a number of services intended to run in a
|
||||
graphical session, for example `xscreensaver` and `dunst`.
|
||||
Unfortunately, such services will not be started automatically unless
|
||||
you let Home Manager start your X session. That is, you have something
|
||||
like
|
||||
|
||||
``` nix
|
||||
{
|
||||
# …
|
||||
|
||||
services.xserver.enable = true;
|
||||
|
||||
# …
|
||||
}
|
||||
```
|
||||
|
||||
in your system configuration and
|
||||
|
||||
``` nix
|
||||
{
|
||||
# …
|
||||
|
||||
xsession.enable = true;
|
||||
xsession.windowManager.command = "…";
|
||||
|
||||
# …
|
||||
}
|
||||
```
|
||||
|
||||
in your Home Manager configuration.
|
||||
@@ -1,119 +0,0 @@
|
||||
# Modular Services {#sec-usage-modular-services}
|
||||
|
||||
Home Manager supports nixpkgs
|
||||
[modular services](https://nixos.org/manual/nixos/unstable/#modular-services)
|
||||
under [](#opt-home.services). This is the Home Manager analog to the
|
||||
NixOS `system.services` namespace: each entry is an abstract service
|
||||
sourced from `<nixpkgs/lib/services/lib.nix>` with the upstream portable
|
||||
systemd module loaded into it, so service modules shipped with packages
|
||||
(e.g. `pkgs.<name>.passthru.services.default`) drop in unchanged --
|
||||
the same module evaluates on NixOS and on Home Manager.
|
||||
|
||||
A minimal example -- run mpd as a user service:
|
||||
|
||||
```nix
|
||||
{ pkgs, ... }: {
|
||||
home.services.mpd = {
|
||||
process.argv = [ "${pkgs.mpd}/bin/mpd" "--no-daemon" ];
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
This produces `~/.config/systemd/user/mpd.service` with `ExecStart` set
|
||||
to the mpd binary and `WantedBy=default.target`.
|
||||
|
||||
Each service exposes the upstream NixOS-style schema: [`process.argv`],
|
||||
`systemd.lib`, `systemd.mainExecStart`, `systemd.service`,
|
||||
`systemd.services`, `systemd.sockets`. Lifted units are translated from
|
||||
NixOS-style attrs (`wantedBy`, `serviceConfig`, `unitConfig`,
|
||||
`environment`, ...) into the section-based INI shape
|
||||
(`{ Unit; Service; Install; }`) that Home Manager's
|
||||
[](#opt-systemd.user.services) consumes. Only common keys are mapped
|
||||
explicitly; uncommon options remain reachable via `unitConfig`,
|
||||
`serviceConfig`, or `socketConfig`.
|
||||
|
||||
Sub-services (nested `services.<sub>` inside another service) and their
|
||||
units are dashed under the parent service name. The empty unit key
|
||||
`""` denotes the service's *primary* unit (lifted to a unit named
|
||||
after the service itself); [`process.argv`] becomes the default
|
||||
`ExecStart` for that unit, which defaults to `WantedBy=default.target`.
|
||||
|
||||
## Reusing upstream package modules {#sec-usage-modular-services-upstream}
|
||||
|
||||
Modular services exposed by packages under
|
||||
`pkgs.<name>.passthru.services.default` can be imported directly.
|
||||
For example, `pkgs.php`'s [`php-fpm`]:
|
||||
|
||||
```nix
|
||||
{ pkgs, ... }: {
|
||||
home.services."php-fpm" = {
|
||||
imports = [ pkgs.php.passthru.services.default ];
|
||||
configData."php-fpm.conf".source = builtins.elemAt config.home.services.php-fpm.process.argv 2;
|
||||
php-fpm.settings.mypool = {
|
||||
listen = "127.0.0.1:9000";
|
||||
# FIXME: required by upstream modular service, but ignored when run as user
|
||||
"user" = "";
|
||||
"pm" = "dynamic";
|
||||
"pm.max_children" = 75;
|
||||
"pm.min_spare_servers" = 5;
|
||||
"pm.max_spare_servers" = 20;
|
||||
};
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
Some packages ship modules written for system services that include
|
||||
directives the user-session manager cannot honour (`DynamicUser`,
|
||||
`AmbientCapabilities`, ...). The unit is still generated with those
|
||||
directives -- user systemd silently ignores what it cannot apply.
|
||||
`WantedBy=multi-user.target` is automatically normalized to
|
||||
`WantedBy=default.target`. Other directives can be overridden per
|
||||
service:
|
||||
|
||||
```nix
|
||||
home.services."tunnel" = {
|
||||
imports = [ pkgs.ghostunnel.passthru.services.default ];
|
||||
# ...
|
||||
systemd.services."tunnel".serviceConfig.DynamicUser = lib.mkForce false;
|
||||
};
|
||||
```
|
||||
|
||||
## Configuration data {#sec-usage-modular-services-configdata}
|
||||
|
||||
Each service can declare configuration files via `configData.<name>`.
|
||||
These are materialized at `$XDG_CONFIG_HOME/home-services/<service>/<name>`
|
||||
(mirroring how NixOS lifts `configData` to `environment.etc`), with the
|
||||
absolute path injected back into `configData.<name>.path` so the service
|
||||
can refer to its files at a stable location:
|
||||
|
||||
```nix
|
||||
{ config, ... }:
|
||||
{
|
||||
home.services.demo = {
|
||||
process.argv = [ "/bin/myapp" "--config" config.home.services.demo.configData."app.toml".path ];
|
||||
configData."app.toml".text = ''
|
||||
port = 1234
|
||||
'';
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
The store paths of all enabled `configData` entries are automatically
|
||||
added to the primary unit's `X-Reload-Triggers`, so `home-manager switch`
|
||||
restarts the service whenever any of its configuration files change. To
|
||||
reload instead of restart, override `X-SwitchMethod`:
|
||||
|
||||
```nix
|
||||
home.services.demo.systemd.services."".unitConfig.X-SwitchMethod = "reload";
|
||||
```
|
||||
|
||||
## Scope notes {#sec-usage-modular-services-scope}
|
||||
|
||||
Home Manager mirrors the surface of nixpkgs' portable systemd module:
|
||||
services and sockets only. Other unit kinds Home Manager supports
|
||||
natively under [](#opt-systemd.user.services) (timers, paths, mounts, ...)
|
||||
are intentionally not modeled on `home.services` until upstream grows them,
|
||||
to keep both surfaces aligned.
|
||||
|
||||
[`process.argv`]: https://nixos.org/manual/nixos/unstable/#service-opt-process.argv
|
||||
[`php-fpm`]: https://nixos.org/manual/nixos/stable/options#opt-_imports_=___pkgs.php.services.default___
|
||||
@@ -1,45 +0,0 @@
|
||||
# Rollbacks {#sec-usage-rollbacks}
|
||||
|
||||
When you perform a `home-manager switch` and discover a problem then
|
||||
it is possible to _roll back_ to the previous version of your
|
||||
configuration using `home-manager switch --rollback`. This will turn
|
||||
the previous configuration into the current configuration.
|
||||
|
||||
::: {.example #ex-rollback-scenario}
|
||||
### Home Manager Rollback
|
||||
|
||||
Imagine you have just updated Nixpkgs and switched to a new Home
|
||||
Manager configuration. You discover that a package update included in
|
||||
your new configuration has a bug that was not present in the previous
|
||||
configuration.
|
||||
|
||||
You can then run `home-manager switch --rollback` to recover your
|
||||
previous configuration, which includes the working version of the
|
||||
package.
|
||||
|
||||
To see what happened above we can observe the list of Home Manager
|
||||
generations before and after the rollback:
|
||||
|
||||
``` shell
|
||||
$ home-manager generations
|
||||
2024-01-04 11:56 : id 765 -> /nix/store/kahm1rxk77mnvd2l8pfvd4jkkffk5ijk-home-manager-generation (current)
|
||||
2024-01-03 10:29 : id 764 -> /nix/store/2wsmsliqr5yynqkdyjzb1y57pr5q2lsj-home-manager-generation
|
||||
2024-01-01 12:21 : id 763 -> /nix/store/mv960kl9chn2lal5q8lnqdp1ygxngcd1-home-manager-generation
|
||||
2023-12-29 21:03 : id 762 -> /nix/store/6c0k1r03fxckql4vgqcn9ccb616ynb94-home-manager-generation
|
||||
2023-12-25 18:51 : id 761 -> /nix/store/czc5y6vi1rvnkfv83cs3rn84jarcgsgh-home-manager-generation
|
||||
…
|
||||
|
||||
$ home-manager switch --rollback
|
||||
Starting home manager activation
|
||||
…
|
||||
|
||||
$ home-manager generations
|
||||
2024-01-04 11:56 : id 765 -> /nix/store/kahm1rxk77mnvd2l8pfvd4jkkffk5ijk-home-manager-generation
|
||||
2024-01-03 10:29 : id 764 -> /nix/store/2wsmsliqr5yynqkdyjzb1y57pr5q2lsj-home-manager-generation (current)
|
||||
2024-01-01 12:21 : id 763 -> /nix/store/mv960kl9chn2lal5q8lnqdp1ygxngcd1-home-manager-generation
|
||||
2023-12-29 21:03 : id 762 -> /nix/store/6c0k1r03fxckql4vgqcn9ccb616ynb94-home-manager-generation
|
||||
2023-12-25 18:51 : id 761 -> /nix/store/czc5y6vi1rvnkfv83cs3rn84jarcgsgh-home-manager-generation
|
||||
…
|
||||
```
|
||||
|
||||
:::
|
||||
@@ -1,84 +0,0 @@
|
||||
# Updating {#sec-updating}
|
||||
|
||||
Updating means moving to a newer revision of the Home Manager branch
|
||||
that your configuration already follows. For example, a configuration
|
||||
using `release-25.11` can update to a newer revision of `release-25.11`
|
||||
without changing release branches.
|
||||
|
||||
If you want to move from one release branch to another, such as
|
||||
`release-25.05` to `release-25.11`, or between a release branch and
|
||||
`master`, see
|
||||
[Upgrading to a new Home Manager release](upgrading.md#sec-upgrade-release).
|
||||
|
||||
## Flake-Based Configurations {#sec-updating-flakes}
|
||||
|
||||
Flake inputs are pinned in `flake.lock`, and Home Manager will keep using
|
||||
the pinned revisions until you update that lock file.
|
||||
|
||||
To update all inputs in the flake:
|
||||
|
||||
``` shell
|
||||
$ nix flake update
|
||||
```
|
||||
|
||||
To update only specific inputs, name them explicitly:
|
||||
|
||||
``` shell
|
||||
$ nix flake update home-manager nixpkgs
|
||||
```
|
||||
|
||||
These commands assume that your current directory is the flake. If not,
|
||||
pass the flake path or URI with `--flake <flake-uri>`.
|
||||
|
||||
After updating the lock file, rebuild with the command for your
|
||||
installation method.
|
||||
|
||||
For a standalone Home Manager flake:
|
||||
|
||||
``` shell
|
||||
$ home-manager switch --flake .
|
||||
```
|
||||
|
||||
For Home Manager as a NixOS module:
|
||||
|
||||
``` shell
|
||||
$ sudo nixos-rebuild switch --flake .
|
||||
```
|
||||
|
||||
For Home Manager as a nix-darwin module:
|
||||
|
||||
``` shell
|
||||
$ darwin-rebuild switch --flake .
|
||||
```
|
||||
|
||||
## Channel-Based Configurations {#sec-updating-channels}
|
||||
|
||||
Channels are mutable references outside the Home Manager configuration
|
||||
itself. Updating a channel moves it to a newer revision of the same
|
||||
channel or branch.
|
||||
|
||||
For a standalone Home Manager channel installation, update the user's
|
||||
channels and then switch:
|
||||
|
||||
``` shell
|
||||
$ nix-channel --update
|
||||
…
|
||||
unpacking channels...
|
||||
$ home-manager switch
|
||||
```
|
||||
|
||||
For Home Manager as a NixOS module, update the root user's Home Manager
|
||||
channel and rebuild the system:
|
||||
|
||||
``` shell
|
||||
$ sudo nix-channel --update home-manager
|
||||
$ sudo nixos-rebuild switch
|
||||
```
|
||||
|
||||
For Home Manager as a nix-darwin module, update the Home Manager channel
|
||||
used by your nix-darwin configuration and rebuild the system:
|
||||
|
||||
``` shell
|
||||
$ nix-channel --update home-manager
|
||||
$ darwin-rebuild switch
|
||||
```
|
||||
@@ -1,202 +0,0 @@
|
||||
# Upgrading to a new Home Manager release {#sec-upgrade-release}
|
||||
|
||||
## Overview {#sec-upgrade-release-overview}
|
||||
|
||||
When moving your configuration to a new Nixpkgs release branch, you
|
||||
should also move Home Manager to the matching release branch. On NixOS
|
||||
this usually means upgrading Home Manager together with NixOS. On
|
||||
standalone and nix-darwin installations, match Home Manager to the
|
||||
Nixpkgs branch used by your configuration. The examples below use 25.11;
|
||||
replace this with the release branch you are upgrading to.
|
||||
|
||||
If your configuration follows `nixos-unstable` or `nixpkgs-unstable`,
|
||||
use Home Manager's `master` branch.
|
||||
|
||||
## Understanding Home Manager Versioning {#sec-upgrade-release-understanding-versioning}
|
||||
|
||||
Home Manager follows NixOS release cycles and provides corresponding branches:
|
||||
|
||||
- **release-\<version\>**: Stable branch for the matching NixOS or
|
||||
Nixpkgs release, such as `release-25.11`.
|
||||
|
||||
- **master**: Development branch (tracks nixpkgs-unstable)
|
||||
|
||||
:::{.note}
|
||||
Use the Home Manager branch that matches the Nixpkgs branch used to
|
||||
evaluate your Home Manager configuration. For stable NixOS
|
||||
configurations, this is normally the same as your NixOS version.
|
||||
:::
|
||||
|
||||
## Flake-Based Installation {#sec-upgrade-release-understanding-flake}
|
||||
|
||||
If you are using Home Manager with Nix flakes, update your `nixpkgs` and
|
||||
`home-manager` inputs together:
|
||||
|
||||
```nix
|
||||
{
|
||||
description = "Home Manager configuration";
|
||||
|
||||
inputs = {
|
||||
# Match the Nixpkgs branch to the release you are using.
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11";
|
||||
|
||||
home-manager = {
|
||||
# Match the Home Manager branch to the Nixpkgs branch above.
|
||||
url = "github:nix-community/home-manager/release-25.11";
|
||||
};
|
||||
};
|
||||
|
||||
outputs = { nixpkgs, home-manager, ... }: {
|
||||
homeConfigurations."yourusername" = home-manager.lib.homeManagerConfiguration {
|
||||
pkgs = nixpkgs.legacyPackages.x86_64-linux;
|
||||
modules = [ ./home.nix ];
|
||||
};
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
For `nixos-unstable` or `nixpkgs-unstable`, use the `master` branch
|
||||
instead:
|
||||
|
||||
```nix
|
||||
{
|
||||
inputs = {
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
|
||||
|
||||
home-manager = {
|
||||
url = "github:nix-community/home-manager";
|
||||
};
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
Then update the lock file and rebuild using the command for your
|
||||
installation method.
|
||||
|
||||
For a standalone Home Manager flake:
|
||||
|
||||
``` shell
|
||||
$ nix flake update
|
||||
$ home-manager switch --flake .
|
||||
```
|
||||
|
||||
For Home Manager as a NixOS module:
|
||||
|
||||
``` shell
|
||||
$ nix flake update
|
||||
$ sudo nixos-rebuild switch --flake .
|
||||
```
|
||||
|
||||
For Home Manager as a nix-darwin module:
|
||||
|
||||
``` shell
|
||||
$ nix flake update
|
||||
$ darwin-rebuild switch --flake .
|
||||
```
|
||||
|
||||
These commands assume that your current directory is the flake. If not,
|
||||
pass the flake path or URI with `--flake <flake-uri>`.
|
||||
|
||||
## Channel-Based Installation {#sec-upgrade-release-understanding-channel}
|
||||
|
||||
For a standalone channel-based installation, first verify your current
|
||||
Home Manager channel:
|
||||
|
||||
``` shell
|
||||
$ nix-channel --list
|
||||
```
|
||||
|
||||
The entry identifies the Home Manager branch currently in use. For
|
||||
example:
|
||||
|
||||
```
|
||||
home-manager https://github.com/nix-community/home-manager/archive/release-25.11.tar.gz
|
||||
```
|
||||
|
||||
Update the Home Manager channel to the branch matching your Nixpkgs
|
||||
release, then switch:
|
||||
|
||||
``` shell
|
||||
$ nix-channel --add https://github.com/nix-community/home-manager/archive/release-25.11.tar.gz home-manager
|
||||
$ nix-channel --update
|
||||
$ home-manager switch
|
||||
```
|
||||
|
||||
When Home Manager is installed as a NixOS module with channels, update
|
||||
the root user's Home Manager channel and rebuild the system:
|
||||
|
||||
``` shell
|
||||
$ sudo nix-channel --add https://github.com/nix-community/home-manager/archive/release-25.11.tar.gz home-manager
|
||||
$ sudo nix-channel --update
|
||||
$ sudo nixos-rebuild switch
|
||||
```
|
||||
|
||||
When Home Manager is installed as a nix-darwin module with channels,
|
||||
update the Home Manager channel used by your nix-darwin configuration
|
||||
and rebuild the system:
|
||||
|
||||
``` shell
|
||||
$ nix-channel --add https://github.com/nix-community/home-manager/archive/release-25.11.tar.gz home-manager
|
||||
$ nix-channel --update
|
||||
$ darwin-rebuild switch
|
||||
```
|
||||
|
||||
## State Version Management {#sec-upgrade-release-state-version}
|
||||
|
||||
:::{.warning}
|
||||
Careful updating your `home.stateVersion` when upgrading Home Manager.
|
||||
:::
|
||||
|
||||
The `stateVersion` should remain set to the Home Manager release you
|
||||
first used for this home configuration.
|
||||
|
||||
```nix
|
||||
{
|
||||
# Example: if this home configuration was first created on 24.11.
|
||||
home.stateVersion = "24.11";
|
||||
}
|
||||
```
|
||||
|
||||
**Why?** The `stateVersion` ensures backward compatibility and
|
||||
prevents breaking changes from affecting your existing configuration.
|
||||
|
||||
**Remember:** Channel or flake input version is not the same as state
|
||||
version. Update Home Manager, keep `home.stateVersion` unchanged, and
|
||||
only change it after reading the release notes and migrating any
|
||||
affected configuration.
|
||||
|
||||
## Troubleshooting {#sec-upgrade-release-state-troubleshooting}
|
||||
|
||||
### Common Issues {#sec-upgrade-release-state-troubleshooting-common-issues}
|
||||
|
||||
Check the [Home Manager Release Notes](../release-notes/release-notes.md#ch-release-notes) for breaking changes.
|
||||
|
||||
1. **Version Mismatch Warning**: If you see warnings about version
|
||||
mismatches, ensure your Home Manager branch matches the Nixpkgs
|
||||
branch used by your configuration. For NixOS stable releases, this
|
||||
usually means matching your NixOS version.
|
||||
|
||||
1. **Module Changes**: Modules are constantly being updated with new
|
||||
features to keep up with changes in upstream packaging or to fix
|
||||
bugs and add features. If you have an unexpected change, check if
|
||||
there was something noted in the release notes or news entries.
|
||||
|
||||
1. **Channel Not Found**: If `nix-channel --list` shows no channels,
|
||||
you might be using a different installation method, such as flakes,
|
||||
or Home Manager may be imported through your system configuration.
|
||||
|
||||
### Verification {#sec-upgrade-release-state-troubleshooting-verification}
|
||||
|
||||
After upgrading, verify the installation:
|
||||
|
||||
``` shell
|
||||
$ home-manager --version
|
||||
```
|
||||
|
||||
This should show the Home Manager version or indicate that it is using
|
||||
the expected release branch.
|
||||
|
||||
## Additional Resources {#sec-upgrade-release-resources}
|
||||
|
||||
- [NixOS Stable Release Notes](https://nixos.org/manual/nixos/stable/release-notes)
|
||||
- [Home Manager Release Notes](../release-notes/release-notes.md#ch-release-notes)
|
||||
@@ -1,13 +0,0 @@
|
||||
# Writing Home Manager Modules {#ch-writing-modules}
|
||||
|
||||
The module system in Home Manager is based entirely on the NixOS module
|
||||
system so we will here only highlight aspects that are specific for Home
|
||||
Manager. For information about the module system as such please refer to
|
||||
the [Writing NixOS
|
||||
Modules](https://nixos.org/nixos/manual/index.html#sec-writing-modules)
|
||||
chapter of the NixOS manual.
|
||||
|
||||
|
||||
```{=include=} sections
|
||||
writing-modules/types.md
|
||||
```
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user