diff options
| author | Danilo M. <danix@danix.xyz> | 2026-08-03 09:01:32 +0200 |
|---|---|---|
| committer | Danilo M. <danix@danix.xyz> | 2026-08-03 09:01:32 +0200 |
| commit | 376323043a6b7a02e23cd9b6232bc25ec5fc1ce6 (patch) | |
| tree | 4140c48b8c1b493c2998bd094dca76613f0d2917 /docs | |
| parent | c6c1011222361b446fb3cdee1ad324fe54931abc (diff) | |
| download | qtmaildir-376323043a6b7a02e23cd9b6232bc25ec5fc1ce6.tar.gz qtmaildir-376323043a6b7a02e23cd9b6232bc25ec5fc1ce6.zip | |
feat: add MailSync process wrapper
Runs the configured sync script through QProcess, merging stdout and
stderr into one log so a failing mbsync run has something to show. The
script is never run through a shell: the command is a config value, and
splitCommand keeps its arguments literal.
Two fixes against the drafted version:
- start() no longer calls waitForStarted(). It blocked the UI thread for
up to five seconds, which contradicts the spec's requirement that the UI
stay usable during sync, and it swallowed launch failures into a bare
false return. A missing script now surfaces asynchronously through
errorOccurred as finished(false, -1) with an explanatory log line, so
the spinner cannot hang with nothing to explain it.
- Removed a double-emit guard I had added on the assumption that QProcess
follows errorOccurred(FailedToStart) with finished(). Verified it does
not: FailedToStart is emitted instead of finished, never before it. The
guard was dead state and the comment justifying it was wrong.
Also corrects the sync interval throughout: the user's cron runs every 10
minutes, not hourly. The shorter interval strengthens the flock rationale
rather than weakening it, since collisions with a manual sync are that
much more likely.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Diffstat (limited to 'docs')
| -rw-r--r-- | docs/superpowers/plans/2026-08-02-qtmaildir-v1.md | 8 | ||||
| -rw-r--r-- | docs/superpowers/specs/2026-08-02-qtmaildir-design.md | 4 |
2 files changed, 6 insertions, 6 deletions
diff --git a/docs/superpowers/plans/2026-08-02-qtmaildir-v1.md b/docs/superpowers/plans/2026-08-02-qtmaildir-v1.md index 1e14105..41bf1bb 100644 --- a/docs/superpowers/plans/2026-08-02-qtmaildir-v1.md +++ b/docs/superpowers/plans/2026-08-02-qtmaildir-v1.md @@ -3200,10 +3200,10 @@ Expected: FAIL, `mailsync.h: No such file or directory`. /// Runs the configured external sync command. /// /// qtmaildir deliberately does not implement sync itself. The existing script -/// holds a flock that is the shared mutex between the user's hourly cron sync -/// and any manual sync; running the script joins that mutex, whereas a built-in -/// implementation would sit outside it and could run mbsync concurrently with -/// cron, corrupting Maildir UID state. +/// holds a flock that is the shared mutex between the user's cron sync, which +/// runs every 10 minutes, and any manual sync; running the script joins that +/// mutex, whereas a built-in implementation would sit outside it and could run +/// mbsync concurrently with cron, corrupting Maildir UID state. class MailSync : public QObject { Q_OBJECT diff --git a/docs/superpowers/specs/2026-08-02-qtmaildir-design.md b/docs/superpowers/specs/2026-08-02-qtmaildir-design.md index 3089341..02c969e 100644 --- a/docs/superpowers/specs/2026-08-02-qtmaildir-design.md +++ b/docs/superpowers/specs/2026-08-02-qtmaildir-design.md @@ -94,7 +94,7 @@ notmuch access happens on that thread; the UI never blocks. **Sync.** qtmaildir runs a configured external command rather than reimplementing `mbsync` orchestration. The decisive reason is the `flock` guard in the existing script: it is the shared mutex between the user's -hourly cron sync and any manual sync. Reimplementing the sync internally +cron sync (every 10 minutes) and any manual sync. Reimplementing it internally would place qtmaildir outside that mutex, and two concurrent `mbsync -a` runs on one Maildir corrupt UID state. Calling the script joins the mutex for free. Reimplementing would also not remove the dependency, since `mbsync` @@ -379,7 +379,7 @@ query re-runs so new mail appears. On non-zero, the status bar shows the last stderr lines with a "Show log" link. Sync never runs automatically in v1: no timer, no sync on startup. The user's -cron already syncs hourly, and a second scheduler competing with the first is +cron already syncs every 10 minutes, and a second scheduler competing with it is exactly what the script's `flock` guard exists to prevent. The button means "now". |
