v0.2.2: device-sync guards — quit warning, sleep/shutdown inhibition

Quitting mid-transfer now asks (Keep Syncing / Quit Anyway) from
closeEvent, which every quit path hits — including the self-update
restart, which previously bypassed closeEvent via a bare quit() and now
routes through close(). A running sync holds its own GNOME inhibitor
(suspend + logout, "Syncing a playlist to a device") so the machine
won't sleep or shutdown/restart under a copy.

Along the way: the Inhibit D-Bus call marshaled Python ints as signed
against GNOME's (susu) signature, so every call was rejected and the
playback sleep inhibitor had silently never worked — _uint fixes both
holders (verified live: cookies taken, IsInhibited flips, releases
clean).

Also investigated trav's mid-copy Syncthing question: the transfer works
from a click-time snapshot and never reads live library state, so remote
changes can't corrupt it — no state freeze needed. Hardened the one real
gap: a source file relocated under the queue (remote metadata edit
moving files) is now skipped, dropped from the m3u, and reported,
instead of aborting the whole sync.
This commit is contained in:
2026-08-07 17:59:25 -04:00
parent dd3d86aa5c
commit a0a1aea57e
7 changed files with 251 additions and 24 deletions
+17
View File
@@ -24,6 +24,23 @@ When a round closes, move its finished items to `tasks-done.md`.
# old
## Round 27 — device-sync guards (v0.2.2)
- [x] Quit warning while a transfer is copying (closeEvent; covers X button,
Ctrl+Q, MPRIS Quit, and the self-update restart, which used to bypass
closeEvent entirely).
- [x] Machine can't sleep or shutdown/restart mid-transfer: second
SleepInhibitor (suspend+logout flags, its own reason text for GNOME's dialog).
- [x] Found & fixed: the GNOME Inhibit D-Bus call sent signed ints against a
(susu) signature, so the *playback* sleep inhibitor had silently never
worked — `_uint` marshalling repairs both.
- [x] Investigated Syncthing changes landing mid-copy: safe by design (the
SyncPlan is a click-time snapshot; the worker never reads live library
state). Hardened the one gap: a source file relocated under the queue is
skipped + dropped from the m3u + reported, instead of aborting the sync.
Tests in `tests/test_round27.py`. Fix round → patch bump **0.2.2**.
## Round 26 — Device menu: sync playlist to Rabbit R1 (v0.2.0)
- [x] Device menu (left of Track) with "Sync Playlist to Rabbit"; grayed out on