mirror of
https://github.com/nix-community/home-manager.git
synced 2026-06-05 21:02:51 +00:00
modular-services: add config files to X-Reload-Triggers
Assisted-by: Claude:claude-sonnet-4-7 Signed-off-by: cinereal <cinereal@riseup.net>
This commit is contained in:
committed by
Robert Helgesson
parent
61031d425e
commit
4fa2493b30
@@ -58,6 +58,15 @@ can refer to its files at a stable location:
|
||||
}
|
||||
```
|
||||
|
||||
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:
|
||||
|
||||
@@ -106,10 +106,45 @@ let
|
||||
];
|
||||
}).config;
|
||||
|
||||
# Collect the `source` store paths of a service's enabled `configData`
|
||||
# entries. When `text` is set, the upstream `config-data-item.nix` module
|
||||
# automatically derives `source` via `pkgs.writeText`, so `source` is
|
||||
# always non-null for enabled entries.
|
||||
configDataSources =
|
||||
service:
|
||||
lib.mapAttrsToList (_: cfg: cfg.source) (
|
||||
lib.filterAttrs (_: cfg: cfg.enable) (service.configData or { })
|
||||
);
|
||||
|
||||
makeUnits =
|
||||
translator: unitType: prefix: service:
|
||||
let
|
||||
# Wire each service's `configData` sources into the primary unit's
|
||||
# `X-Reload-Triggers` so `home-manager switch` restarts it whenever
|
||||
# a config file changes. Preserves any triggers the unit already sets.
|
||||
triggers = configDataSources service;
|
||||
primaryTranslator =
|
||||
if triggers == [ ] then
|
||||
translator
|
||||
else
|
||||
(
|
||||
unit:
|
||||
let
|
||||
ini = translator unit;
|
||||
existing = lib.toList (ini.Unit.X-Reload-Triggers or [ ]);
|
||||
in
|
||||
ini
|
||||
// {
|
||||
Unit = ini.Unit // {
|
||||
X-Reload-Triggers = lib.unique (existing ++ triggers);
|
||||
};
|
||||
}
|
||||
);
|
||||
in
|
||||
concatMapAttrs (unitName: unitModule: {
|
||||
"${dashed prefix unitName}" = evalDeferred translator unitModule;
|
||||
"${dashed prefix unitName}" = evalDeferred (
|
||||
if unitName == "" then primaryTranslator else translator
|
||||
) unitModule;
|
||||
}) service.systemd.${unitType}
|
||||
// concatMapAttrs (
|
||||
subName: subService: makeUnits translator unitType (dashed prefix subName) subService
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{ pkgs, ... }:
|
||||
{
|
||||
home.services.demo = {
|
||||
home.services."basic" = {
|
||||
process.argv = [
|
||||
"${pkgs.mpd}/bin/mpd"
|
||||
"--no-daemon"
|
||||
@@ -8,6 +8,6 @@
|
||||
};
|
||||
|
||||
nmt.script = ''
|
||||
assertFileContent home-files/.config/systemd/user/demo.service ${./demo.service}
|
||||
assertFileContent home-files/.config/systemd/user/basic.service ${./basic.service}
|
||||
'';
|
||||
}
|
||||
|
||||
@@ -10,5 +10,6 @@
|
||||
|
||||
nmt.script = ''
|
||||
assertFileContent home-files/.config/home-services/demo/config.toml ${./config.toml}
|
||||
assertFileContains home-files/.config/systemd/user/demo.service 'X-Reload-Triggers=/nix/store/'
|
||||
'';
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user