v0.3.0: cancelable device sync

A "✕" button sits left of the sync progress group and expands to
"cancel transfer" on hover; clicking asks Cancel Transfer / Keep
Copying (the copy keeps running under the dialog). Cancel stops the
worker at the next chunk boundary, removes the in-flight partial file,
and rewrites the m3u to list only tracks actually on the device — so a
cancelled sync always leaves a coherent partial playlist. That last bit
also closes a pre-existing gap: stale files are deleted before copying,
so an interruption could previously leave the old m3u pointing at
deleted files.

Recoverability proven both ways: a test asserts cancel-then-resync ends
byte-identical to an uninterrupted sync, and a live run against the
real Rabbit (cancel mid-file-2 of 3) recovered with kept=1/copies=2.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-07 18:08:41 -04:00
co-authored by Claude Fable 5
parent c9c8971243
commit b6b6dc01f7
5 changed files with 285 additions and 10 deletions
+14
View File
@@ -24,6 +24,20 @@ When a round closes, move its finished items to `tasks-done.md`.
# old
## Round 28 — cancelable device sync (v0.3.0)
- [x] "✕" button left of the sync progress group; expands to "cancel transfer"
on hover; confirm dialog (Cancel Transfer / Keep Copying) before cancelling.
- [x] `DeviceSyncWorker.cancel()`: stops at the next chunk boundary, removes
the in-flight partial file, emits `cancelled` with copied/total counts.
- [x] Cancelled syncs always leave a coherent device folder: the m3u is
rewritten to list only tracks actually present (fixes the pre-existing gap
where stale files deleted before a cancel could leave dangling m3u refs).
- [x] Recoverability verified: cancel-then-resync produces byte-identical
results to an uninterrupted sync (test + live run against the real Rabbit).
Tests in `tests/test_round28.py`. Feature round → minor bump **0.3.0**.
## Round 27 — device-sync guards (v0.2.2)
- [x] Quit warning while a transfer is copying (closeEvent; covers X button,