diff --git a/CMakeLists.txt b/CMakeLists.txt index 1b7a88d..5139ba4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.24) -project(KSwitcher VERSION 0.6.15 LANGUAGES CXX RC) +project(KSwitcher VERSION 0.6.16 LANGUAGES CXX RC) if(NOT WIN32) message(FATAL_ERROR "KSwitcher uses native Windows APIs") endif() diff --git a/Release/KSwitcher-win-x64.zip b/Release/KSwitcher-win-x64.zip index 266aaa6..4492555 100644 Binary files a/Release/KSwitcher-win-x64.zip and b/Release/KSwitcher-win-x64.zip differ diff --git a/Release/README.md b/Release/README.md index 7ae83e7..6957701 100644 --- a/Release/README.md +++ b/Release/README.md @@ -1,8 +1,10 @@ # Latest Windows release -## v0.6.15 — 2026-10-30 +## v0.6.16 — 2026-10-30 ## Changes +- Fix repeated offers to install the same release: the runtime updater version now matches the packaged executable version. +- Add regression checks comparing updater, executable and CMake versions, and rejecting the already-installed modern release. - Preserve typing that arrives while a snippet is being expanded. - Add `{enter}` to press Enter after insertion and cursor placement, with an Insert Enter marker button. Use `{{enter}}` for literal text. - Suppress automatic correction during snippet expansion and buffered typing, without changing the global setting. Normal typing resumes automatic correction afterward. @@ -11,7 +13,7 @@ Includes the earlier automatic-correction and log-viewer improvements. Existing modern releases update directly to this version without installing intermediate releases. ## Validation -223 native regression checks, 472 input/UI checks, screenshot editor and notification registration checks, 45 updater checks and updater progress checks. Targeted native integration checks cover continuous snippet typing, clipboard restoration, actual Enter key events, punctuation preservation, suppression of automatic correction and its resumption afterward. The updated development build was also confirmed by the user in Notepad. The broader integration suite showed intermittent failures during earlier interactive runs; it is not claimed as fully passing. +223 native regression checks, 472 input/UI checks, screenshot editor and notification registration checks, 48 updater checks and updater progress checks. Targeted native integration checks cover continuous snippet typing, clipboard restoration, actual Enter key events, punctuation preservation, suppression of automatic correction and its resumption afterward. The updated development build was also confirmed by the user in Notepad. The broader integration suite showed intermittent failures during earlier interactive runs; it is not claimed as fully passing. **Upgrade:** choose Update in the tray menu. Legacy v0.3.0–v0.4.1 clients first receive the v0.4.2 compatibility bridge, then the current full release. v0.2.3 and earlier require manual installation. For manual installation, exit KSwitcher and extract the entire ZIP into its installation folder. Keep personal `data/` and customized dictionaries. diff --git a/Release/SHA256SUMS.txt b/Release/SHA256SUMS.txt index e1ae36b..f517572 100644 --- a/Release/SHA256SUMS.txt +++ b/Release/SHA256SUMS.txt @@ -1 +1 @@ -04229e97b239683db7c113342f7c1e95e6f50b8fcbd1994e7b0920987766b9ab KSwitcher-win-x64.zip +65c5d4c41c0b062eab29e5c100fd5cbff3839d808907935160cf7f5b904af6b7 KSwitcher-win-x64.zip diff --git a/resources/app.rc b/resources/app.rc index 32795b3..010c538 100644 --- a/resources/app.rc +++ b/resources/app.rc @@ -9,8 +9,8 @@ IDC_SCREENSHOT_PENCIL CURSOR "icons/lucide/pencil.cur" 1 RT_MANIFEST "app.manifest" 201 RCDATA "update.ps1" 1 VERSIONINFO - FILEVERSION 0,6,15,0 - PRODUCTVERSION 0,6,15,0 + FILEVERSION 0,6,16,0 + PRODUCTVERSION 0,6,16,0 FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_APP BEGIN @@ -20,7 +20,7 @@ BEGIN BEGIN VALUE "FileDescription", "KSwitcher — native keyboard and clipboard utility" VALUE "ProductName", "KSwitcher" - VALUE "FileVersion", "0.6.15" + VALUE "FileVersion", "0.6.16" END END BLOCK "VarFileInfo" diff --git a/src/update.h b/src/update.h index 18f8b73..90ce818 100644 --- a/src/update.h +++ b/src/update.h @@ -2,7 +2,7 @@ #include "platform.h" namespace ks { -inline constexpr wchar_t AppVersion[] = L"0.6.14"; +inline constexpr wchar_t AppVersion[] = L"0.6.16"; inline constexpr UINT UpdateMessage = WM_APP + 7; inline constexpr UINT UpdateCheckIntervalMs = 6 * 60 * 60 * 1000; inline constexpr UINT UpdateNotificationRetryMs = 5 * 60 * 1000; diff --git a/tests/update.ps1 b/tests/update.ps1 index cfe9029..ff7b04b 100644 --- a/tests/update.ps1 +++ b/tests/update.ps1 @@ -10,6 +10,12 @@ try { $binaryInfo = [Diagnostics.FileVersionInfo]::GetVersionInfo((Resolve-Path -LiteralPath $Executable).Path) $binaryVersion = Get-StableVersion $binaryInfo.FileVersion Assert ($null -ne $binaryVersion) 'executable has a stable version' + $header = Get-Content -LiteralPath (Join-Path $PSScriptRoot '../src/update.h') -Raw + $match = [regex]::Match($header, 'AppVersion\[\]\s*=\s*L"([0-9.]+)"') + Assert ($match.Success -and (Get-StableVersion $match.Groups[1].Value) -eq $binaryVersion) 'updater runtime version matches packaged executable' + $cmake = Get-Content -LiteralPath (Join-Path $PSScriptRoot '../CMakeLists.txt') -Raw + $projectVersion = [regex]::Match($cmake, 'project\(KSwitcher VERSION ([0-9.]+)') + Assert ($projectVersion.Success -and (Get-StableVersion $projectVersion.Groups[1].Value) -eq $binaryVersion) 'CMake version matches packaged executable' Assert ($binaryInfo.FileDescription -ceq ('KSwitcher ' + [char]0x2014 + ' native keyboard and clipboard utility')) 'executable description preserves Unicode em dash' Assert ((Get-StableVersion 'v0.10.0') -gt (Get-StableVersion 'v0.2.9')) 'numeric versions' Assert ($null -eq (Get-StableVersion 'v1.0.0-beta')) 'prerelease rejected' @@ -24,6 +30,8 @@ try { Assert ($null -eq (Select-Release @($release) ([version]'0.3.0'))) 'no downgrade' Assert ((Get-StableVersion 'release-v0.5.0') -eq [version]'0.5.0') 'modern stable release tag' $modern=@{draft=$false;prerelease=$false;tag_name='release-v0.5.0';assets=$assets} + $installedRelease=@{draft=$false;prerelease=$false;tag_name=('release-v'+$binaryInfo.FileVersion);assets=$assets} + Assert ($null -eq (Select-Release @($installedRelease) (Get-StableVersion $match.Groups[1].Value))) 'runtime updater does not offer the installed modern release again' Assert ((Select-Release @($release,$modern) ([version]'0.4.2')).version -eq 'release-v0.5.0') 'bridge discovers modern channel' $draft=@{draft=$true;prerelease=$false;tag_name='v9.0.0';assets=$assets} Assert ((Select-Release @($draft,$release) ([version]'0.2.0')).version -eq 'v0.2.1') 'draft ignored'