From 883f9d037ca7f43ce96922579b1482f2cd4cb461 Mon Sep 17 00:00:00 2001 From: Justin Paul Date: Fri, 8 May 2026 12:32:22 -0400 Subject: [PATCH] Sync from GitHub main: v0.1.4 --- .gitea/workflows/release.yml | 102 ++++++++++++++++++ .github/workflows/ci.yml | 1 + .github/workflows/release.yml | 3 + .github/workflows/wiki-sync.yml | 4 + Directory.Build.props | 2 +- .../ViewModels/ConfigCheckpointsViewModel.cs | 12 ++- 6 files changed, 120 insertions(+), 4 deletions(-) create mode 100644 .gitea/workflows/release.yml diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml new file mode 100644 index 0000000..0abb5ee --- /dev/null +++ b/.gitea/workflows/release.yml @@ -0,0 +1,102 @@ +name: Release (Gitea) + +# Lives in .gitea/workflows/ so it runs on Gitea Actions only. The GitHub-side +# release lives in .github/workflows/release.yml. +# +# Triggered automatically on v* tag pushes; can also be invoked manually via +# workflow_dispatch with a version override (useful for testing the runner +# without bumping the project version). + +on: + push: + tags: + - 'v*' + workflow_dispatch: + inputs: + version: + description: 'Version to build (e.g. 0.1.4). Defaults to Directory.Build.props.' + required: false + +jobs: + build-installer: + runs-on: windows-latest + steps: + - uses: actions/checkout@v4 + + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: '8.0.x' + + - name: Resolve version + id: ver + shell: pwsh + run: | + if ('${{ github.event_name }}' -eq 'push') { + $v = '${{ github.ref_name }}'.TrimStart('v') + } elseif ('${{ inputs.version }}') { + $v = '${{ inputs.version }}' + } else { + [xml]$p = Get-Content Directory.Build.props + $v = $p.Project.PropertyGroup.Version + } + "version=$v" | Out-File $env:GITHUB_OUTPUT -Append + Write-Host "Building version $v" + + - name: Restore + test + shell: pwsh + run: | + dotnet restore WebhookServer.sln + dotnet test WebhookServer.sln -c Release + + - name: Ensure Inno Setup is installed + shell: pwsh + run: | + if (-not (Get-Command iscc -ErrorAction SilentlyContinue) -and ` + -not (Test-Path 'C:\Program Files (x86)\Inno Setup 6\ISCC.exe') -and ` + -not (Test-Path 'C:\Program Files\Inno Setup 6\ISCC.exe')) { + choco install innosetup --no-progress -y + } + + - name: Build installer + shell: pwsh + run: ./scripts/build-installer.ps1 -VersionOverride ${{ steps.ver.outputs.version }} + + - name: Upload installer artifact + uses: actions/upload-artifact@v4 + with: + name: WebhookServer-Setup-${{ steps.ver.outputs.version }} + path: dist/WebhookServer-Setup-*.exe + + - name: Create Gitea release with installer attached + if: startsWith(github.ref, 'refs/tags/v') + shell: pwsh + env: + GITEA_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + $version = '${{ steps.ver.outputs.version }}' + $tag = '${{ github.ref_name }}' + $repo = '${{ github.repository }}' + $serverUrl = '${{ github.server_url }}' + $apiBase = "$serverUrl/api/v1/repos/$repo" + $headers = @{ Authorization = "token $env:GITEA_TOKEN" } + + # 1. Create the release. + $isPre = $version.StartsWith('0.') + $createBody = @{ + tag_name = $tag + name = "Webhook Server $version" + body = "Automated build via Gitea Actions runner." + draft = $false + prerelease = $isPre + } | ConvertTo-Json + $rel = Invoke-RestMethod -Uri "$apiBase/releases" -Method Post ` + -Headers $headers -ContentType 'application/json' -Body $createBody + Write-Host "Created release id=$($rel.id) tag=$tag" + + # 2. Attach the installer. + $file = Get-Item "dist/WebhookServer-Setup-$version.exe" + $uploadUri = "$apiBase/releases/$($rel.id)/assets?name=$($file.Name)" + Invoke-RestMethod -Uri $uploadUri -Method Post -Headers $headers ` + -ContentType 'application/octet-stream' -InFile $file.FullName | Out-Null + Write-Host "Uploaded $($file.Name) ($([math]::Round($file.Length / 1MB, 2)) MB) to $tag" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2646469..69e19ee 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,6 +5,7 @@ on: branches: [main] pull_request: branches: [main] + workflow_dispatch: jobs: build: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b7e6750..38c8648 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -12,6 +12,9 @@ on: jobs: build-installer: + # Gitea reads .github/workflows/ for compatibility, but the create-release + # step uses a GitHub-only action. Skip the whole job on non-GitHub runners. + if: github.server_url == 'https://github.com' runs-on: windows-latest permissions: contents: write # needed to create releases / upload assets diff --git a/.github/workflows/wiki-sync.yml b/.github/workflows/wiki-sync.yml index 349fefa..289eee8 100644 --- a/.github/workflows/wiki-sync.yml +++ b/.github/workflows/wiki-sync.yml @@ -11,6 +11,10 @@ on: jobs: sync: + # Gitea reads .github/workflows/ for compatibility, but this workflow + # pushes to a GitHub-hosted wiki. Skip on non-GitHub runners; the Gitea + # wiki is synced separately via scripts/sync-wiki.ps1. + if: github.server_url == 'https://github.com' runs-on: windows-latest permissions: contents: write diff --git a/Directory.Build.props b/Directory.Build.props index 4f3a527..78ecee5 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,7 +1,7 @@ - 0.1.3 + 0.1.4 Justin Paul Justin Paul Webhook Server diff --git a/src/WebhookServer.Gui/ViewModels/ConfigCheckpointsViewModel.cs b/src/WebhookServer.Gui/ViewModels/ConfigCheckpointsViewModel.cs index d0fa3fc..817cc68 100644 --- a/src/WebhookServer.Gui/ViewModels/ConfigCheckpointsViewModel.cs +++ b/src/WebhookServer.Gui/ViewModels/ConfigCheckpointsViewModel.cs @@ -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) {