# 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./.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 coverage.runsettings