v0.1.4: Rollback NRE fix + Gitea Actions builds (#8)

* Fix Rollback NRE: capture filename before refreshing the checkpoint list

The actual restore on the service was succeeding but the GUI showed
"Rollback failed: Object reference not set to an instance of an object."
because RefreshAsync clears the ObservableCollection, the SelectedItem
binding goes null when its source item disappears, and the next line
dereferenced Selected!.FileName.

Cache the filename and timestamp before any await so the post-refresh
status update doesn't depend on Selected still being non-null.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* v0.1.4

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-08 12:32:11 -04:00
committed by GitHub
parent 68706df2c5
commit 8743a70ddb
2 changed files with 10 additions and 4 deletions
+1 -1
View File
@@ -1,7 +1,7 @@
<Project>
<PropertyGroup>
<Version>0.1.3</Version>
<Version>0.1.4</Version>
<Authors>Justin Paul</Authors>
<Company>Justin Paul</Company>
<Product>Webhook Server</Product>
@@ -82,8 +82,14 @@ public sealed partial class ConfigCheckpointsViewModel : ObservableObject
{
if (Selected is null) return;
// Capture before the refresh; the ObservableCollection.Clear() in
// RefreshAsync nulls Selected (the original instance is gone from the
// collection so the SelectedItem binding clears).
var fileName = Selected.FileName;
var savedAt = Selected.SavedAt;
var ok = MessageBox.Show(
$"Roll the configuration back to the checkpoint from {Selected.SavedAt.ToLocalTime():yyyy-MM-dd HH:mm:ss}?\n\nThe current configuration is automatically saved as a new checkpoint first, so you can roll forward again.",
$"Roll the configuration back to the checkpoint from {savedAt.ToLocalTime():yyyy-MM-dd HH:mm:ss}?\n\nThe current configuration is automatically saved as a new checkpoint first, so you can roll forward again.",
"Confirm rollback",
MessageBoxButton.OKCancel,
MessageBoxImage.Warning);
@@ -91,10 +97,10 @@ public sealed partial class ConfigCheckpointsViewModel : ObservableObject
try
{
await _client.RestoreBackupAsync(Selected.FileName).ConfigureAwait(false);
await _client.RestoreBackupAsync(fileName).ConfigureAwait(false);
await RefreshAsync().ConfigureAwait(false);
Application.Current.Dispatcher.Invoke(() =>
StatusMessage = $"Rolled back to {Selected!.FileName}.");
StatusMessage = $"Rolled back to {fileName}.");
}
catch (Exception ex)
{