The previous deploy mechanism kept the old version under {target}.old
just long enough to swap, then deleted it — no way back if the new
report had a runtime bug only visible at use time.
Now each deploy keeps the previous active version under
{FolderName}.backup-yyyyMMdd-HHmmss/. The N most recent are kept
(MaxBackups, default 3) and older ones are pruned in best-effort.
UI in Settings → Avancés → Outil Report :
- "Conserver N backups" input (0 = no history, back to v0.12 behavior)
- List of backups with date + size + cryptic folder name + per-row "↶ Revert"
- Confirmation dialog: "Revert to {date}? The currently deployed
version will itself be saved as a new backup, so you can switch back."
Implementation
- IReportToolDeployer: + ListBackupsAsync, + RevertAsync, + BackupInfo,
+ DeployStatus.BackupNotFound.
- ReportToolDeployer: deploy renames {target} → backup-{ts}; PruneOldBackups
trims to MaxBackups; RevertAsync atomically swaps current ↔ chosen
backup, the previous current becoming itself a fresh backup.
- ReportBackupViewModel + DataTemplate for the list rows.
- Strings: backup labels, "↶ Revert", confirmation message.
Caveats documented in the design discussion:
- Backups cover ONLY the report tool files. DB migrations are not reverted
(irreversible). If a migration broke the schema, that's a separate fix.
- No HTTP-HEAD post-deploy auto-revert: too fragile for false positives.
Revert stays a deliberate manual action.
Versions bumped to 0.13.0.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
41 lines
1.7 KiB
XML
41 lines
1.7 KiB
XML
<Project Sdk="Microsoft.NET.Sdk">
|
|
|
|
<PropertyGroup>
|
|
<OutputType>WinExe</OutputType>
|
|
<TargetFramework>net8.0-windows</TargetFramework>
|
|
<Nullable>enable</Nullable>
|
|
<ImplicitUsings>enable</ImplicitUsings>
|
|
<LangVersion>latest</LangVersion>
|
|
<AssemblyName>PSLauncher.Updater</AssemblyName>
|
|
<RootNamespace>PSLauncher.Updater</RootNamespace>
|
|
<Version>0.13.0</Version>
|
|
<ApplicationIcon>..\PSLauncher.App\Resources\favicon.ico</ApplicationIcon>
|
|
<Company>ASTERION VR</Company>
|
|
<Copyright>© 2026 ASTERION VR — All rights reserved</Copyright>
|
|
|
|
<!-- Single-file self-contained pour le publish (~10 Mo) -->
|
|
<PublishSingleFile>true</PublishSingleFile>
|
|
<SelfContained>true</SelfContained>
|
|
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
|
|
<IncludeNativeLibrariesForSelfExtract>true</IncludeNativeLibrariesForSelfExtract>
|
|
<EnableCompressionInSingleFile>true</EnableCompressionInSingleFile>
|
|
<PublishTrimmed>false</PublishTrimmed>
|
|
</PropertyGroup>
|
|
|
|
<!-- Copie automatique du single-file Updater à la racine du repo après chaque
|
|
`dotnet publish -c Release`. -->
|
|
<Target Name="CopyPublishedToRepoRoot" AfterTargets="Publish"
|
|
Condition=" '$(Configuration)' == 'Release' ">
|
|
<PropertyGroup>
|
|
<RepoRoot>$([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)..\..\'))</RepoRoot>
|
|
</PropertyGroup>
|
|
<Copy SourceFiles="$(PublishDir)$(AssemblyName).exe"
|
|
DestinationFolder="$(RepoRoot)"
|
|
SkipUnchangedFiles="false"
|
|
OverwriteReadOnlyFiles="true"
|
|
ContinueOnError="WarnAndContinue" />
|
|
<Message Importance="high" Text="Copied $(AssemblyName).exe to $(RepoRoot)" />
|
|
</Target>
|
|
|
|
</Project>
|