fix(installer): rollback-safe extract with .bak stash
This commit is contained in:
@@ -70,11 +70,16 @@ public sealed class DownloadAndExtractStep : IInstallStep
|
|||||||
return StepResult.Fail("Checksum mismatch — the downloaded zip may be corrupt or tampered with.");
|
return StepResult.Fail("Checksum mismatch — the downloaded zip may be corrupt or tampered with.");
|
||||||
|
|
||||||
// Only after verification do we touch the install directory.
|
// Only after verification do we touch the install directory.
|
||||||
progress.Report("Clearing previous app/worker binaries...");
|
progress.Report("Stashing previous app/worker binaries...");
|
||||||
var appDest = Path.Combine(ctx.InstallDirectory, "app");
|
var appDest = Path.Combine(ctx.InstallDirectory, "app");
|
||||||
var workerDest = Path.Combine(ctx.InstallDirectory, "worker");
|
var workerDest = Path.Combine(ctx.InstallDirectory, "worker");
|
||||||
if (Directory.Exists(appDest)) Directory.Delete(appDest, recursive: true);
|
var appBak = appDest + ".bak";
|
||||||
if (Directory.Exists(workerDest)) Directory.Delete(workerDest, recursive: true);
|
var workerBak = workerDest + ".bak";
|
||||||
|
|
||||||
|
if (Directory.Exists(appBak)) Directory.Delete(appBak, recursive: true);
|
||||||
|
if (Directory.Exists(workerBak)) Directory.Delete(workerBak, recursive: true);
|
||||||
|
if (Directory.Exists(appDest)) Directory.Move(appDest, appBak);
|
||||||
|
if (Directory.Exists(workerDest)) Directory.Move(workerDest, workerBak);
|
||||||
|
|
||||||
progress.Report("Extracting...");
|
progress.Report("Extracting...");
|
||||||
Directory.CreateDirectory(ctx.InstallDirectory);
|
Directory.CreateDirectory(ctx.InstallDirectory);
|
||||||
@@ -84,11 +89,19 @@ public sealed class DownloadAndExtractStep : IInstallStep
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
// Roll back to previous binaries.
|
||||||
|
if (Directory.Exists(appDest)) Directory.Delete(appDest, recursive: true);
|
||||||
|
if (Directory.Exists(workerDest)) Directory.Delete(workerDest, recursive: true);
|
||||||
|
if (Directory.Exists(appBak)) Directory.Move(appBak, appDest);
|
||||||
|
if (Directory.Exists(workerBak)) Directory.Move(workerBak, workerDest);
|
||||||
return StepResult.Fail(
|
return StepResult.Fail(
|
||||||
$"Extraction failed after old binaries were removed: {ex.Message}. " +
|
$"Extraction failed; previous binaries have been restored: {ex.Message}.");
|
||||||
"Your install directory may be incomplete. Re-run the installer to retry.");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Success — drop stash.
|
||||||
|
if (Directory.Exists(appBak)) Directory.Delete(appBak, recursive: true);
|
||||||
|
if (Directory.Exists(workerBak)) Directory.Delete(workerBak, recursive: true);
|
||||||
|
|
||||||
ctx.InstalledVersion = release.TagName.TrimStart('v', 'V');
|
ctx.InstalledVersion = release.TagName.TrimStart('v', 'V');
|
||||||
return StepResult.Ok();
|
return StepResult.Ok();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user