83 lines
3.1 KiB
YAML
83 lines
3.1 KiB
YAML
# The check every pull request goes through: the solution builds and the tests pass.
|
|
#
|
|
# The runner has to be a Windows one with the .NET 10 SDK: the application is
|
|
# WPF, so neither the build nor the tests happen anywhere else. The tests raise
|
|
# real windows and ask Windows for the foreground one, so the runner has to work
|
|
# in an interactive desktop session — as a service in session 0 the end-to-end
|
|
# checks have no window to wait for.
|
|
name: Pull request
|
|
|
|
on:
|
|
pull_request:
|
|
branches:
|
|
- master
|
|
|
|
# A new push into the branch makes the previous run pointless
|
|
concurrency:
|
|
group: pull-request-${{ github.event.pull_request.number }}
|
|
cancel-in-progress: true
|
|
|
|
defaults:
|
|
run:
|
|
shell: pwsh
|
|
|
|
jobs:
|
|
build:
|
|
runs-on: windows-x64
|
|
|
|
steps:
|
|
- name: Check out the sources
|
|
uses: actions/checkout@v4
|
|
|
|
# The exe icon lives in Git LFS, and without it the checkout leaves a text
|
|
# pointer that the build cannot read as an icon.
|
|
#
|
|
# The objects are fetched here rather than by `lfs: true` on the checkout:
|
|
# that way they arrive over a request the LFS endpoint accepts. See the
|
|
# comment on the header below
|
|
- name: Fetch the LFS objects
|
|
run: |
|
|
$ErrorActionPreference = 'Stop'
|
|
|
|
# actions/checkout leaves its own token in the config as an
|
|
# http.<server>/.extraheader, and git-lfs sends that header on to the
|
|
# LFS endpoint, which turns down the token of a workflow: every object
|
|
# comes back 401 and the fetch gives up. The repository is public and
|
|
# its LFS objects are readable without a token at all, so the header
|
|
# simply goes. A private repository would need credentials of its own
|
|
# in lfs.url instead
|
|
$keys = git config --local --list --name-only | Where-Object { $_ -like '*.extraheader' }
|
|
foreach ($key in $keys) { git config --local --unset-all $key }
|
|
|
|
git lfs pull
|
|
if ($LASTEXITCODE -ne 0) { throw "git lfs pull ended with exit code $LASTEXITCODE." }
|
|
|
|
# A pointer left in place of a file shows itself much later and in a
|
|
# way that is hard to read back: the build breaks on the icon
|
|
$pointers = git lfs ls-files --name-only |
|
|
Where-Object { (Get-Content $_ -TotalCount 1) -like 'version https://git-lfs*' }
|
|
|
|
if ($pointers) {
|
|
throw "Git LFS left pointers instead of files: $($pointers -join ', ')."
|
|
}
|
|
|
|
- name: Show the toolchain
|
|
run: dotnet --info
|
|
|
|
- name: Restore
|
|
run: dotnet restore CursorLang.sln --nologo
|
|
|
|
- name: Build
|
|
run: dotnet build CursorLang.sln --configuration Release --no-restore --nologo
|
|
|
|
# The tests take the application from bin\Release, which is why the whole
|
|
# run is a Release one: in Debug they would find no executable and skip
|
|
# themselves — a green run that checked nothing
|
|
- name: Test
|
|
run: >
|
|
dotnet test CursorLang.sln
|
|
--configuration Release
|
|
--no-build
|
|
--nologo
|
|
--settings CursorLang.Tests/coverage.runsettings
|