From 6ff9da25907a6495cbfba17daa0f7d50539a42d6 Mon Sep 17 00:00:00 2001 From: Jelle Buning Date: Fri, 6 Nov 2026 14:34:59 +0100 Subject: [PATCH 1/2] Upgraded to WinUia 0.3.0 --- Directory.Packages.props | 3 +-- tests/Kontext.UiTests/Kontext.UiTests.csproj | 3 --- tests/Kontext.UiTests/Tests/KontextFixture.cs | 4 ++++ 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 85ab017..a30c6e6 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -15,7 +15,6 @@ - - + \ No newline at end of file diff --git a/tests/Kontext.UiTests/Kontext.UiTests.csproj b/tests/Kontext.UiTests/Kontext.UiTests.csproj index 37018cf..483cbf3 100644 --- a/tests/Kontext.UiTests/Kontext.UiTests.csproj +++ b/tests/Kontext.UiTests/Kontext.UiTests.csproj @@ -14,8 +14,6 @@ - - <_Parameter1>System.Threading.ApartmentState.MTA @@ -39,7 +37,6 @@ - diff --git a/tests/Kontext.UiTests/Tests/KontextFixture.cs b/tests/Kontext.UiTests/Tests/KontextFixture.cs index c32dae4..bef3386 100644 --- a/tests/Kontext.UiTests/Tests/KontextFixture.cs +++ b/tests/Kontext.UiTests/Tests/KontextFixture.cs @@ -1,4 +1,5 @@ using Kontext.UiTests.Application; +using WinUia; namespace Kontext.UiTests.Tests; @@ -24,4 +25,7 @@ public void CloseApp() App.Dispose(); Data.Dispose(); } + + protected static void Eventually(Func condition, string because = "", TimeSpan? timeout = null) => + Assert.That(Poll.Until(condition, timeout), Is.True, because); } From c0c1c2f7aba7f56c308d82cdf4c92eaba86eb660 Mon Sep 17 00:00:00 2001 From: Jelle Buning Date: Fri, 6 Nov 2026 14:37:21 +0100 Subject: [PATCH 2/2] updated readme --- .github/README.md | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/.github/README.md b/.github/README.md index 1f1f17e..eba80a8 100644 --- a/.github/README.md +++ b/.github/README.md @@ -35,6 +35,7 @@
  • Requirements
  • Build and run
  • Test
  • +
  • Install a release
  • Release
  • @@ -115,16 +116,29 @@ To run only the unit tests: Get-ChildItem tests -Recurse -Filter *.UnitTests.csproj | ForEach-Object { dotnet test $_.FullName -c Release } ``` +### Install a release + +Each [release](https://github.com/buning-software/kontext/releases) has a signed MSIX and `Kontext.cer`, the certificate it is signed with. Windows only installs the package once you trust that certificate. + +1. Trust the certificate once, from an elevated PowerShell: + + ```powershell + Import-Certificate -FilePath .\Kontext.cer -CertStoreLocation Cert:\LocalMachine\TrustedPeople + ``` + +2. Open the `.msix` and choose **Install**. + +Kontext still keeps its data under `%LOCALAPPDATA%\Kontext`: the package turns off file redirection so your clones and worktrees stay visible to Explorer, terminals and IDEs. + ### Release Publishing a GitHub release tagged like `v1.2.3` runs the tests, then builds a signed, self-contained x64 MSIX and attaches it to the release together with `Kontext.cer`, the public certificate. The tag sets the package version. The workflow imports the certificate into the runner's certificate store and signs by thumbprint, which avoids the APPX0105 and APPX0107 warnings that come from pointing MSBuild at the `.pfx`. The signature is timestamped (DigiCert), so the package keeps verifying after the certificate expires. ARM64 is not built because the embedded terminal control only ships x64 binaries. One-time setup: -* Signing uses the `CERTIFICATE_BASE64` (the `.pfx`, base64 encoded) and `CERTIFICATE_PASSWORD` secrets. They are organization secrets of `buning-software`, shared with the other Buning Software apps, and this repository has to be allowed to use them (organization Settings, Secrets and variables, Actions). The certificate subject must equal `Publisher` in `src/Kontext/Package.appxmanifest` (`CN=BuningSoftware`). To create a new certificate, for example when it expires, use `generate_certificate.ps1` in the [Surveil repository](https://github.com/buning-software/surveil), update both organization secrets, and never commit the `.pfx`. +* Signing uses the `CERTIFICATE_BASE64` (the `.pfx`, base64 encoded) and `CERTIFICATE_PASSWORD` secrets. They are organization secrets of `buning-software`, and this repository has to be allowed to use them (organization Settings, Secrets and variables, Actions). The certificate subject must equal `Publisher` in `src/Kontext/Package.appxmanifest` (`CN=BuningSoftware`). To create a new certificate, for example when it expires, generate a self-signed code-signing certificate with that subject, update both organization secrets, and never commit the `.pfx`. * Set the repository variable `KONTEXT_GITHUB_CLIENT_ID`. An installed MSIX is read-only, so the client id has to be built in; the release fails without it. -To install a release, first trust `Kontext.cer` once (open it, choose Install Certificate, Local Machine, Trusted People), then open the `.msix`. Kontext still keeps its data under `%LOCALAPPDATA%\Kontext`: the package turns off file redirection so your clones and worktrees stay visible to Explorer, terminals and IDEs. ## Contributing