fix(deploy): report what enable actually did, and arm the tier's timers
Two lies in the unit loop, both reported as success: - `systemctl --user enable live-sync.service` fails on every deploy — the file has no [Install] section, because live-sync.timer is what arms it. The result was swallowed by `|| true` and the tool printed ENABLE anyway, so the line an operator reads after a rebuild was false on every box, on the repo's own heartbeat. The [Install] section is readable from the file being deployed, so the tool now checks it and prints INERT with the reason instead of making a call that cannot succeed; a real enable failure prints INERT too. - The loop walked *.service only. live-sync.timer was never enabled by anything, so a rebuilt box got the heartbeat and no schedule for it. Timers are walked now; a timer has no ExecStart, so the "does this unit belong on this box" test runs against the service it activates. The systemctl stub models systemd's refusal (no [Install] section -> non-zero), which is what makes the new tests red against the old loop; both new tests were run red first, and the five existing unit tests still pin #44's semantics. Refs #60
This commit is contained in:
1 parent
812be6a0a6
commit
f3ce42eb80
3 files changed
+109
-17
No files matched your search
@@ -25,10 +25,15 @@ is stowed last and its files replace symlinks coming from base packages.
|
||||
| `deploy.sh` (sync) | adopt identicals, link new, quarantine divergents into `.quarantine/` and replace them |
|
||||
| `deploy.sh --adopt` | like sync, but divergents are reported and skipped rather than quarantined |
|
||||
|
||||
Two package shapes are not symlinks. `dconf/dump.txt` is loaded with `dconf load /`, and
|
||||
`systemd-user` units get `daemon-reload` plus `enable`; a unit is **started** only when
|
||||
systemd reports it as nothing-yet (`""`/`disabled`), and never when its `ExecStart` binary
|
||||
is absent here, so a unit belonging to another box stays inert instead of crash-looping.
|
||||
Two package shapes are not symlinks. `dconf/dump.txt` is loaded with `dconf load /`. The
|
||||
`systemd-user` tier gets `daemon-reload`, then **every `*.service` and `*.timer` whose start
|
||||
command resolves on this box** is enabled — a timer is the schedule that makes a oneshot service
|
||||
run at all, and it carries no `ExecStart` of its own, so the belonging test is applied to the
|
||||
service it activates. A unit is **started** (`--now`) only when systemd reports it as nothing-yet
|
||||
(`""`/`disabled`), and never when its binary is absent here, so a unit belonging to another box
|
||||
stays inert instead of crash-looping. Three outcomes are printed, and each says what actually
|
||||
happened: `ENABLE` only when `systemctl enable` returned success, `INERT` when it could not or did
|
||||
not, `SKIP` when the unit is foreign. Refs #44, #60.
|
||||
Starting something already installed is what makes `deploy.sh` unsafe to run beside a live
|
||||
session — see *Never start a unit a session may already be running*.
|
||||
|
||||
@@ -167,6 +172,15 @@ fresh box — where everything reports `disabled` — still gets its units up. B
|
||||
are pinned in `tests/deploy.bats` over a stub `systemctl`, because the real one on this box
|
||||
is exactly what must not be invoked from a test. Refs #44.
|
||||
|
||||
**A third state exists, and it is not an error.** A unit file with no `[Install]` section cannot be
|
||||
enabled at all — `systemctl --user enable` answers with a non-zero exit and a paragraph about
|
||||
missing `WantedBy`. `live-sync.service` is one on purpose: `live-sync.timer` pulls it in, which is
|
||||
also why systemd reports it as `linked`. Until 2026-10-21 the deploy swallowed that failure and
|
||||
printed `ENABLE` anyway, so the line an operator reads to learn what a rebuild armed was false on
|
||||
every box, on the repo's own heartbeat. The section is readable from the file being deployed, so
|
||||
the tool checks it and prints `INERT …(no [Install] section — another unit arms it, enable cannot)`
|
||||
without making the call. Refs #60.
|
||||
|
||||
## Law: expand systemd specifiers before calling a unit foreign
|
||||
|
||||
`ExecStart=%h/.omp/scripts/live-sync.sh` is valid systemd and meaningless to a shell. The
|
||||
|
||||
Reference in new issue
Block a user