From aae26bf569ac86b0e2f5bcc869937c16d58e0fe9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 16 Mar 2026 22:42:53 +0000 Subject: [PATCH 1/3] Initial plan From bd6aed11d59fe9e0cd93d91e1396bb575221cf24 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 16 Mar 2026 22:46:36 +0000 Subject: [PATCH 2/3] Add release workflow and git-tag-based versioning Co-authored-by: gunicsba <3919203+gunicsba@users.noreply.github.com> --- .github/workflows/release.yml | 77 +++++++++++++++++++++++++++++++++++ CMakeLists.txt | 25 ++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..ee10078 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,77 @@ +name: Release + +on: + push: + tags: + - "v*" + +permissions: + contents: write + +jobs: + windows_release: + name: Windows Release (NSIS) + runs-on: windows-latest + + steps: + - name: Checkout (full history) + uses: actions/checkout@v4 + with: + submodules: recursive + fetch-depth: 0 + + - name: Ensure tag commit is on develop + shell: bash + run: | + set -euo pipefail + git fetch origin develop:refs/remotes/origin/develop + + TAG_SHA="$(git rev-list -n 1 "$GITHUB_REF")" + echo "Tag ref: $GITHUB_REF" + echo "Tag SHA: $TAG_SHA" + + if git merge-base --is-ancestor "$TAG_SHA" "origin/develop"; then + echo "OK: Tag commit is reachable from origin/develop" + else + echo "::error::Tag commit is NOT on develop. Refusing to release." + exit 1 + fi + + - name: Decide prerelease flag + shell: bash + run: | + set -euo pipefail + TAG="${GITHUB_REF_NAME}" + if [[ "$TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+-beta\.[0-9]+$ ]]; then + IS_PRERELEASE=true + else + IS_PRERELEASE=false + fi + echo "PRERELEASE=${IS_PRERELEASE}" >> "$GITHUB_ENV" + echo "Tag: ${TAG}, Prerelease: ${IS_PRERELEASE}" + + - name: Install NSIS + run: choco install nsis -y + + - name: Configure (CMake) + run: cmake -S . -B build -DBUILD_EXAMPLES=OFF -DBUILD_TESTING=OFF -Wno-dev + + - name: Build + Package (CPack/NSIS) + run: cmake --build build --config Release --target package + + - name: Find installer + shell: pwsh + run: | + $installer = Get-ChildItem -Path "build/_CPack_Packages/win64/NSIS" -Filter *.exe -Recurse | Select-Object -First 1 + if (-not $installer) { throw "Installer .exe not found" } + "INSTALLER_PATH=$($installer.FullName)" | Out-File -FilePath $env:GITHUB_ENV -Append + Write-Host "Found installer: $($installer.FullName)" + + - name: Create GitHub Release and upload NSIS installer + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ github.ref_name }} + name: ${{ github.ref_name }} + generate_release_notes: true + prerelease: ${{ env.PRERELEASE }} + files: ${{ env.INSTALLER_PATH }} diff --git a/CMakeLists.txt b/CMakeLists.txt index c36781c..1fae26a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,6 +7,31 @@ set(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}" ) +find_package(Git QUIET) +if(GIT_FOUND) + execute_process( + COMMAND ${GIT_EXECUTABLE} describe --tags --exact-match HEAD + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE GIT_TAG + ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) + if(GIT_TAG MATCHES "^v([0-9]+)\\.([0-9]+)\\.([0-9]+)(-beta\\.[0-9]+)?$") + set(PROJECT_VERSION_MAJOR ${CMAKE_MATCH_1}) + set(PROJECT_VERSION_MINOR ${CMAKE_MATCH_2}) + set(PROJECT_VERSION_PATCH ${CMAKE_MATCH_3}) + if(CMAKE_MATCH_4) + set(PROJECT_VERSION + "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}${CMAKE_MATCH_4}" + ) + else() + set(PROJECT_VERSION + "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}" + ) + endif() + message( + STATUS "Building from git tag: ${GIT_TAG}, version: ${PROJECT_VERSION}") + endif() +endif() + set(BUILD_EXAMPLES OFF) set(BUILD_TESTING OFF) From 87b05a201a03738a6fdf24a49204d496c2116816 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 16 Mar 2026 22:47:46 +0000 Subject: [PATCH 3/3] Address code review: add clarifying comments Co-authored-by: gunicsba <3919203+gunicsba@users.noreply.github.com> --- .github/workflows/release.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ee10078..2af85c6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -39,6 +39,8 @@ jobs: - name: Decide prerelease flag shell: bash + # Pattern must match vMAJOR.MINOR.PATCH-beta.N; keep in sync with the + # regex used in CMakeLists.txt for git-tag-based version extraction. run: | set -euo pipefail TAG="${GITHUB_REF_NAME}" @@ -60,6 +62,9 @@ jobs: run: cmake --build build --config Release --target package - name: Find installer + # CPack places the generated installer under this fixed directory when + # targeting the NSIS generator on Windows (win64). The same path is + # used in build.yml's upload-artifact step. shell: pwsh run: | $installer = Get-ChildItem -Path "build/_CPack_Packages/win64/NSIS" -Filter *.exe -Recurse | Select-Object -First 1