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:
cinereal
2026-05-05 17:11:54 +02:00
committed by Robert Helgesson
parent 61031d425e
commit 4fa2493b30
5 changed files with 48 additions and 3 deletions

View File

@@ -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:

View File

@@ -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

View File

@@ -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}
'';
}

View File

@@ -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/'
'';
}