Bump to v1.9.0: fix the robocopy trailing-backslash bug — auto-updater finally works
The install helper's robocopy line was:
robocopy "{stagingRoot}" "{installDir}" ...
installDir is AppContext.BaseDirectory, which always ends in a directory
separator, so the destination argument was a quoted path ending in a
backslash: "D:\...\publish\". Windows command-line parsing reads the \"
as an escaped quote, so robocopy never received a valid destination,
rejected the command line, and exited 16 (usage error, nothing copied)
instantly. The auto-updater has never worked in any release because of
this — v1.0-v1.2 failed silently, v1.3+ detected the failure and wrote
update-failed.txt but never fixed the robocopy line.
Fix: BuildInstallScript now strips trailing separators —
stagingArg = stagingRoot.TrimEnd('\','/'), installArg likewise — and
the robocopy line uses the trimmed forms. Verified by running the
corrected robocopy against real staged files: exit 3 (success), files
copied.
The broken helper is baked into every shipped build including v1.8, and
the helper is generated by the running version — so v1.8 and earlier
cannot auto-install v1.9. v1.9 must be installed by hand once; from v1.9
onward the updater works.
No wire-format or audio-pipeline changes — v1.5 through v1.9 interoperate.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.7
parent
e6d47e229d
commit
4344e3439d
+15
-18
@@ -1,29 +1,26 @@
|
||||
# RemSound v1.8
|
||||
# RemSound v1.9
|
||||
|
||||
Updater improvements and a rewritten user manual. Wire format and audio pipeline are unchanged from v1.4 onward — all versions interoperate.
|
||||
A critical fix to the auto-updater. Wire format and audio pipeline are unchanged from v1.4 onward — all versions interoperate.
|
||||
|
||||
## Updater improvements
|
||||
## The fix
|
||||
|
||||
- **Check for updates is more reliable.** It now looks further down the GitHub release list when deciding what the newest version is, so it always finds the latest RemSound release.
|
||||
- **An update can no longer overwrite your own data.** The update now replaces RemSound's program files only — it leaves your settings file, and your profiles, logs and recordings folders, untouched. Previously a release package could in principle carry stray files over the top of yours; the updater now refuses to copy those even if they were present.
|
||||
- **A successful update leaves a tidy folder.** Once an update finishes cleanly, the temporary update files, the update log, and any leftover failure note are all cleared automatically.
|
||||
- **The "update failed" note is now plain English.** If an update can't finish, the `update-failed.txt` note left next to RemSound is written in clear, non-technical language with simple numbered steps. Technical detail for support stays in the separate update log.
|
||||
**The auto-updater now actually installs updates.** Every release of RemSound up to and including v1.8 had a fault in the update step: the install-folder path passed to the internal file-copy command ended in a backslash, which Windows mis-interpreted, so the copy command was rejected and no files were ever replaced. "Check for updates" would download the new version, but the swap silently never happened and you stayed on the old version. That copy step is now fixed.
|
||||
|
||||
## Rewritten user manual
|
||||
## Important — install v1.9 by hand, just this once
|
||||
|
||||
The user manual (press F1 inside RemSound, or open `readme.html`) has been rewritten from the ground up in plain language. Technical jargon has been removed or explained in everyday terms, and the writing now describes what to do rather than narrating keystrokes.
|
||||
Because the fault was in the *old* version doing the updating, **"Check for updates" on v1.8 or earlier cannot install v1.9** — it will download it but fail to apply it. You need to install v1.9 manually this one time. After that the updater works correctly and every future update is automatic.
|
||||
|
||||
## Install
|
||||
To install v1.9 over an existing copy:
|
||||
|
||||
1. Download `RemSound-v1.8.zip` from this release.
|
||||
2. Extract somewhere with write permission (e.g. `C:\RemSound\`, `Documents\RemSound\`). Avoid `Program Files` unless you grant write permission so the self-updater can replace files in place.
|
||||
3. Run `RemSound.exe`. Allow on private networks when Windows Firewall prompts.
|
||||
4. Press F1 (or use the Help menu) for the user manual.
|
||||
1. Download `RemSound-v1.9.zip` from this release.
|
||||
2. Close RemSound.
|
||||
3. Extract the zip **over your existing RemSound folder**, overwriting the program files when prompted. The zip contains program files only — it will **not** touch your profiles or your settings.
|
||||
4. Run `RemSound.exe`.
|
||||
|
||||
For a fresh install, just extract the zip anywhere you have write permission (e.g. `C:\RemSound\`, `Documents\RemSound\` — avoid `Program Files`) and run `RemSound.exe`. Allow on private networks when Windows Firewall prompts. Press F1 for the user manual.
|
||||
|
||||
Requires the .NET 10 Desktop Runtime. If it's missing, Windows offers to fetch it on first launch.
|
||||
|
||||
## Upgrading
|
||||
## From v1.9 onward
|
||||
|
||||
v1.5 / v1.6 / v1.7 users: use **Help → Check for updates** — it pulls v1.8 cleanly. The manual install above always works too.
|
||||
|
||||
If you installed RemSound inside a Dropbox-synced (or other file-sync) folder and your install is v1.0 / v1.1 / v1.2, see the [v1.3 release notes](https://github.com/Ednunp/RemSound/releases/tag/v1.3) for one-time manual install steps. From v1.3 onward Check-for-updates handles synced folders correctly.
|
||||
**Help → Check for updates** works properly — v1.9 → v1.10 and every future release installs itself, no manual step needed.
|
||||
|
||||
@@ -20,6 +20,28 @@ internal sealed class AboutDialog : Form
|
||||
/// updates" path.</summary>
|
||||
private const string ReleaseNotes =
|
||||
"""
|
||||
RemSound v1.9
|
||||
|
||||
Critical auto-updater fix. No wire-format or
|
||||
audio-pipeline changes — v1.5 through v1.9 peers
|
||||
interoperate.
|
||||
|
||||
Bug fix:
|
||||
* The auto-updater now actually installs updates.
|
||||
Every previous version had a fault in the update
|
||||
step: the folder path handed to the file-copy
|
||||
command ended in a backslash, which Windows
|
||||
mis-read, so the copy was rejected and no files
|
||||
were ever replaced. Check for updates would
|
||||
download the new version but never apply it. That
|
||||
copy step is fixed.
|
||||
|
||||
Because the fault was in the OLD version doing the
|
||||
updating, v1.8 and earlier cannot install v1.9 for you
|
||||
— install v1.9 by hand once (download the zip, extract
|
||||
it over your RemSound folder). From v1.9 onward, Check
|
||||
for updates installs every update automatically.
|
||||
|
||||
RemSound v1.8
|
||||
|
||||
Updater polish and a rewritten user manual. No
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
tag_name on the latest GitHub release; bump it on every public release. The
|
||||
AssemblyVersion / FileVersion default to this value, and Assembly.GetName().Version
|
||||
is what the About dialog and the updater both read. -->
|
||||
<Version>1.8.0</Version>
|
||||
<Version>1.9.0</Version>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@@ -232,6 +232,15 @@ internal sealed class RemSoundUpdater : IDisposable
|
||||
var failureMarker = Path.Combine(installDir, "update-failed.txt");
|
||||
var stagingDir = Path.Combine(installDir, "_update");
|
||||
var remsoundExe = Path.Combine(installDir, "RemSound.exe");
|
||||
// Robocopy source/destination, with any trailing directory separator stripped.
|
||||
// CRITICAL BUG FIX (2026-05-19): installDir is AppContext.BaseDirectory, which ends
|
||||
// in a backslash. A quoted path that ends in a backslash — "D:\dir\" — is mis-parsed
|
||||
// on the command line: the \" is read as an ESCAPED quote, so robocopy never receives
|
||||
// a valid destination argument and exits immediately with code 16 (no files copied).
|
||||
// That silently broke EVERY auto-update in every release to date. The robocopy line
|
||||
// below MUST use these trimmed forms, never the raw {installDir} / {stagingRoot}.
|
||||
var stagingArg = stagingRoot.TrimEnd('\\', '/');
|
||||
var installArg = installDir.TrimEnd('\\', '/');
|
||||
return $"""
|
||||
@echo off
|
||||
setlocal
|
||||
@@ -256,7 +265,7 @@ internal sealed class RemSoundUpdater : IDisposable
|
||||
rem startup settings) and their data folders (logs / profiles / recordings). An update
|
||||
rem replaces APP files only. build-release.ps1 already keeps those out of the release
|
||||
rem zip; this is the second line of defence so a bad zip still can't clobber them.
|
||||
robocopy "{stagingRoot}" "{installDir}" /E /IS /IT /NFL /NDL /NJH /NJS /R:60 /W:1 /XF _apply-update.cmd /XF _update-helper.log /XF update-failed.txt /XF remsound.config.json /XD logs profiles recordings _update /LOG+:"%LOG%"
|
||||
robocopy "{stagingArg}" "{installArg}" /E /IS /IT /NFL /NDL /NJH /NJS /R:60 /W:1 /XF _apply-update.cmd /XF _update-helper.log /XF update-failed.txt /XF remsound.config.json /XD logs profiles recordings _update /LOG+:"%LOG%"
|
||||
set "ROBO_EXIT=%ERRORLEVEL%"
|
||||
echo %DATE% %TIME% robocopy exit=%ROBO_EXIT% >> "%LOG%"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user