Bump to v1.3.0: harden updater helper for Dropbox-installed copies

v1.2's self-updater silently failed when the install folder lived
inside a Dropbox sync path. Dropbox held write locks on the existing
RemSound.exe / DLLs during the brief window between the parent exiting
and the helper script copying the new files in. The helper's robocopy
(/R:5 /W:1) gave up after 5 seconds, and the helper then
unconditionally relaunched the OLD binary — so the user saw the same
version they started with after pressing "Yes" on the install prompt,
with no visible error.

Helper script (BuildInstallScript) changes:

* Robocopy retries bumped to /R:60 /W:1 — up to 60 seconds per file.
  Dropbox lock release happens reliably within that window in
  practice.

* Robocopy exit code is captured and checked. Codes >= 8 are real
  failures. On a failure the helper writes update-failed.txt to the
  install folder with the cause + recovery steps, leaves the staging
  folder intact, and does NOT relaunch the old binary. Earlier
  versions silently relaunched the unmodified old binary, hiding the
  failure.

* Helper appends a step-by-step trace to _update-helper.log (in the
  install folder), with robocopy's own output included via /LOG+:.

* update-failed.txt, _update-helper.log, and _apply-update.cmd are
  added to the /XF exclusion list so the helper's own state files
  don't get copied to themselves on a repeat update run.

DownloadAndStageInstallAsync also clears any stale update-failed.txt
at the start of every new attempt, so a successful run leaves the
install folder clean.

readme.html "If install fails" section expanded with the new
update-failed.txt marker file behaviour and the _update-helper.log
location.

Wire format, audio pipeline, and recording feature unchanged from
v1.2 — this is updater-machinery-only.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Ednunp
2026-05-15 13:07:36 +01:00
co-authored by Claude Opus 4.7
parent c59e413c1f
commit 9a5c46eecf
5 changed files with 111 additions and 33 deletions
+30
View File
@@ -20,6 +20,36 @@ internal sealed class AboutDialog : Form
/// updates" path.</summary>
private const string ReleaseNotes =
"""
RemSound v1.3
Updater hardening. The v1.2 self-updater silently failed on
installs inside Dropbox-synced folders because Dropbox held
write locks on the existing files during the brief window
between the parent exiting and the helper script copying the
new files in. Robocopy gave up after 5 seconds and the helper
relaunched the old binary anyway so the user saw the same
version they started with after pressing "Yes" on the install
prompt.
What's new:
* Helper script retries robocopy for up to 60 seconds per
file (was 5). Dropbox lock release happens reliably within
that window in practice.
* Helper now checks robocopy's exit code. On a true failure
(exit code 8 or higher), it writes update-failed.txt next
to RemSound.exe with diagnostic detail and does NOT
relaunch the old binary. Earlier versions silently
relaunched the unmodified old binary, hiding the failure.
* Helper writes a step-by-step log to _update-helper.log in
the install folder. If a future update goes wrong this is
where the trace lives.
* Stale failure markers are cleared at the start of every
new update attempt, so a successful run leaves the install
folder clean.
Wire format, audio pipeline, and recording feature are
unchanged from v1.2.
RemSound v1.2
Recording, sound cues, and receiver-side drift compensation.