Skip to content

Commit 8e95e93

Browse files
ResoDrive 0.3.3
1 parent 3edc099 commit 8e95e93

7 files changed

Lines changed: 65 additions & 9 deletions

File tree

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
# Changelog
22

3+
## [0.3.3] - 2026-08-28
4+
5+
- Do not abort an upgrade when optional graceful-shutdown preparation fails.
6+
- Wait for path-matched installed processes to exit before replacing files.
7+
- Treat an already-stopped application as a successful installer no-op.
8+
- Include the MSI log path in failed application-update diagnostics.
9+
310
## [0.3.2] - 2026-08-28
411

512
- Keep the per-user startup task registered when Windows normalizes its saved
@@ -28,6 +35,7 @@ First public preview of the cleaned ResoDrive codebase.
2835
- Install through a small setup bundle that downloads the .NET Desktop Runtime
2936
only when it is missing.
3037

38+
[0.3.3]: https://github.com/alphasixtyfive/resodrive/releases/tag/v0.3.3
3139
[0.3.2]: https://github.com/alphasixtyfive/resodrive/releases/tag/v0.3.2
3240
[0.3.1]: https://github.com/alphasixtyfive/resodrive/releases/tag/v0.3.1
3341
[0.3.0]: https://github.com/alphasixtyfive/resodrive/releases/tag/v0.3.0

Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
1010
<Deterministic>true</Deterministic>
1111
<RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
12-
<VersionPrefix>0.3.2</VersionPrefix>
12+
<VersionPrefix>0.3.3</VersionPrefix>
1313
<ProductDisplayName>ResoDrive</ProductDisplayName>
1414
<ExecutableBaseName>resodrive</ExecutableBaseName>
1515
<ProductDescription>Mount Nextcloud, other WebDAV storage, and SFTP servers as drives in Windows</ProductDescription>

RELEASE_NOTES.md

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
ResoDrive 0.3.2 fixes Start with Windows registration on systems where Windows
2-
Task Scheduler normalizes the saved user identity and default privilege fields.
3-
ResoDrive now recognizes the normalized task as its own instead of removing it
4-
during post-registration verification.
1+
ResoDrive 0.3.3 fixes application updates that could stop with Windows Installer
2+
code 1603 when the optional graceful-shutdown preparation returned an error.
3+
Preparation is now best-effort; the installer always continues to a hidden,
4+
path-scoped fallback that stops only the installed ResoDrive processes and waits
5+
for them to exit before replacing files. An already-stopped application is now
6+
handled as a successful no-op instead of another installer error.
57

6-
Installer upgrades no longer open PowerShell windows while stopping the running
7-
application.
8+
Failed updates now include the exact installer-log path in their diagnostic
9+
message.
810

911
The normal download is `ResoDrive-Setup.exe`. Existing settings, credentials,
1012
mounts, and sync jobs are preserved during the upgrade.

installer/Package.wxs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,13 +92,13 @@
9292
FileRef="ResoDriveExecutableFile"
9393
ExeCommand="--prepare-update"
9494
Execute="immediate"
95-
Return="check"
95+
Return="ignore"
9696
Impersonate="yes"
9797
/>
9898
<CustomAction
9999
Id="StopResoDriveForUpgrade"
100100
Directory="INSTALLFOLDER"
101-
ExeCommand="&quot;[System64Folder]WindowsPowerShell\v1.0\powershell.exe&quot; -NoP -NonI -WindowStyle Hidden -Command &quot;$p=(pwd).Path+'\resodrive.exe';gps resodrive -ea 0|? Path -eq $p|kill -Force -ea Stop&quot;"
101+
ExeCommand="&quot;[System64Folder]WindowsPowerShell\v1.0\powershell.exe&quot; -NoP -NonI -WindowStyle Hidden -Command &quot;$p=(pwd).Path+'\resodrive.exe';gps resodrive -ea 0|? Path -eq $p|%{kill $_ -Force -ea Stop;$_.WaitForExit()};exit 0&quot;"
102102
Execute="immediate"
103103
Return="check"
104104
Impersonate="no"

src/ResoDrive.App/Infrastructure/ApplicationUpdateHandoff.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,11 @@ await runtime.WaitForParentExitAsync(request.ParentProcessId, cancellationToken)
234234
cancellationToken)
235235
.ConfigureAwait(false);
236236
(status, message) = ClassifyInstallerExitCode(installerExitCode.Value);
237+
if (status == "failed")
238+
{
239+
message += " See the installer log at " +
240+
Path.ChangeExtension(request.InstallerPath, ".msi.log") + ".";
241+
}
237242
}
238243
catch (Win32Exception exception) when (exception.NativeErrorCode == ErrorCancelled)
239244
{
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
using System.Xml.Linq;
2+
3+
namespace ResoDrive.App.Tests;
4+
5+
public sealed class InstallerPackageTests
6+
{
7+
private static readonly XNamespace Wix = "http://wixtoolset.org/schemas/v4/wxs";
8+
9+
[Fact]
10+
public void UpgradePreparationIsBestEffortAndRunsWithoutPowerShell()
11+
{
12+
var action = LoadAction("PrepareInstalledResoDriveForUpgrade");
13+
14+
Assert.Equal("ResoDriveExecutableFile", (string?)action.Attribute("FileRef"));
15+
Assert.Equal("--prepare-update", (string?)action.Attribute("ExeCommand"));
16+
Assert.Equal("ignore", (string?)action.Attribute("Return"));
17+
Assert.Equal("yes", (string?)action.Attribute("Impersonate"));
18+
}
19+
20+
[Fact]
21+
public void UpgradeStopFallbackIsHiddenPathScopedAndWaitsForExit()
22+
{
23+
var action = LoadAction("StopResoDriveForUpgrade");
24+
var command = Assert.IsType<XAttribute>(action.Attribute("ExeCommand")).Value;
25+
26+
Assert.Equal("check", (string?)action.Attribute("Return"));
27+
Assert.Equal("no", (string?)action.Attribute("Impersonate"));
28+
Assert.Contains("-WindowStyle Hidden", command, StringComparison.Ordinal);
29+
Assert.Contains("Path -eq $p", command, StringComparison.Ordinal);
30+
Assert.Contains("WaitForExit()", command, StringComparison.Ordinal);
31+
Assert.Contains(";exit 0", command, StringComparison.Ordinal);
32+
}
33+
34+
private static XElement LoadAction(string id)
35+
{
36+
var document = XDocument.Load(Path.Combine(AppContext.BaseDirectory, "Fixtures", "Package.wxs"));
37+
return Assert.Single(document.Descendants(Wix + "CustomAction"), action =>
38+
(string?)action.Attribute("Id") == id);
39+
}
40+
}

tests/ResoDrive.App.Tests/ResoDrive.App.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,6 @@
2828
<Content Include="..\..\src\ResoDrive.App\SyncEditorWindow.xaml" Link="Fixtures\SyncEditorWindow.xaml" CopyToOutputDirectory="PreserveNewest" />
2929
<Content Include="..\..\src\ResoDrive.App\MessageDialog.xaml" Link="Fixtures\MessageDialog.xaml" CopyToOutputDirectory="PreserveNewest" />
3030
<Content Include="..\..\src\ResoDrive.App\MainWindow.xaml.cs" Link="Fixtures\MainWindow.xaml.cs" CopyToOutputDirectory="PreserveNewest" />
31+
<Content Include="..\..\installer\Package.wxs" Link="Fixtures\Package.wxs" CopyToOutputDirectory="PreserveNewest" />
3132
</ItemGroup>
3233
</Project>

0 commit comments

Comments
 (0)