Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package forgejo-runner for openSUSE:Factory checked in at 2026-07-26 11:28:19 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/forgejo-runner (Old) and /work/SRC/openSUSE:Factory/.forgejo-runner.new.2004 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "forgejo-runner" Sun Jul 26 11:28:19 2026 rev:50 rq:1367690 version:12.13.2 Changes: -------- --- /work/SRC/openSUSE:Factory/forgejo-runner/forgejo-runner.changes 2026-06-22 17:30:17.623531412 +0200 +++ /work/SRC/openSUSE:Factory/.forgejo-runner.new.2004/forgejo-runner.changes 2026-07-26 11:31:20.904642522 +0200 @@ -1,0 +2,44 @@ +Thu Jul 23 21:10:34 UTC 2026 - Marcus Rueckert <[email protected]> + +- Update to version 12.13.2: + fix: EvaluateIf() loses ${{ inputs.x }} on reusable workflow + expansion (#1643) + + Fixes https://codeberg.org/forgejo/forgejo/issues/13558. + + When expanding a workflow, a new set of inputs is created in a + new parse context for evaluation. But that parse context was + being lost, rather than being preserved, causing future access to + `EvaluateIf` to have no access to the expanded workflow's inputs. + +------------------------------------------------------------------- +Thu Jul 23 11:02:45 UTC 2026 - Marcus Rueckert <[email protected]> + +- Update to version 12.13.1: + - bug fixes + - PR: fix(jobparser): nil dereference when EvaluateIf is called + w/ cancelled() expr +- Update to version 12.13.0: + - features + - PR: feat(interpreter): Add support for case statements + - bug fixes + - PR: fix: standardize runner.os and runner.arch + - other + - PR: Update dependency buildx to v0.35.0 + - PR: Update + https://data.forgejo.org/forgejo/forgejo-build-publish action + to v5.7.3 + - PR: Update https://data.forgejo.org/actions/setup-forgejo + action to v3.2.3 + - PR: Update dependency forgejo/release-notes-assistant to + v1.7.3 + - PR: Update data.forgejo.org/forgejo/forgejo Docker tag to + v11.0.15 + - PR: Update go toolchain directive to v1.25.12 + - PR: Update forgejo-runner to v12.12.0 + - PR: test: use flags instead of env variables for skipping + tests + - PR: docs: revise testing section of README + - PR: test: use environment variable for skipping Docker tests + +------------------------------------------------------------------- @@ -98,0 +143,6 @@ + +------------------------------------------------------------------- +Thu Mar 5 14:10:54 UTC 2026 - Marcus Rueckert <[email protected]> + +- fix --version output the prefix of the gopath changed from v11 to + v12 Old: ---- forgejo-runner-12.12.0.obscpio New: ---- forgejo-runner-12.13.2.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ forgejo-runner.spec ++++++ --- /var/tmp/diff_new_pack.qL3Pm7/_old 2026-07-26 11:31:21.996680048 +0200 +++ /var/tmp/diff_new_pack.qL3Pm7/_new 2026-07-26 11:31:22.000680184 +0200 @@ -18,7 +18,7 @@ %define services %{name}.service Name: forgejo-runner -Version: 12.12.0 +Version: 12.13.2 Release: 0 Summary: Daemon that connects to a Forgejo instance and runs CI jobs License: GPL-3.0-or-later @@ -84,6 +84,7 @@ -o bin/%{name} bin/%{name} generate-config > config.yaml +bin/%{name} --version %install # Install the binary. ++++++ _service ++++++ --- /var/tmp/diff_new_pack.qL3Pm7/_old 2026-07-26 11:31:22.032681284 +0200 +++ /var/tmp/diff_new_pack.qL3Pm7/_new 2026-07-26 11:31:22.040681560 +0200 @@ -2,7 +2,7 @@ <service name="obs_scm" mode="manual"> <param name="url">https://code.forgejo.org/forgejo/runner</param> <param name="scm">git</param> - <param name="revision">refs/tags/v12.12.0</param> + <param name="revision">refs/tags/v12.13.2</param> <param name="versionformat">@PARENT_TAG@</param> <param name="changesgenerate">disable</param> <param name="versionrewrite-pattern">v(.*)</param> ++++++ forgejo-runner-12.12.0.obscpio -> forgejo-runner-12.13.2.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/.forgejo/workflows/build-release-integration.yml new/forgejo-runner-12.13.2/.forgejo/workflows/build-release-integration.yml --- old/forgejo-runner-12.12.0/.forgejo/workflows/build-release-integration.yml 2026-06-20 03:41:19.000000000 +0200 +++ new/forgejo-runner-12.13.2/.forgejo/workflows/build-release-integration.yml 2026-07-23 16:16:48.000000000 +0200 @@ -19,7 +19,7 @@ enable-email-notifications: true env: - FORGEJO_VERSION: 11.0.14 # renovate: datasource=docker depName=data.forgejo.org/forgejo/forgejo + FORGEJO_VERSION: 11.0.15 # renovate: datasource=docker depName=data.forgejo.org/forgejo/forgejo jobs: release-simulation: @@ -29,7 +29,7 @@ - uses: https://data.forgejo.org/actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 - id: forgejo - uses: https://data.forgejo.org/actions/setup-forgejo@7c0ebca121589fe5de0dde4d6cf528043002f84f # v3.2.1 + uses: https://data.forgejo.org/actions/setup-forgejo@bb44e99c35dc50942a2a7b346a3de7c6c33c83f9 # v3.2.3 with: user: root password: admin1234 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/.forgejo/workflows/build-release.yml new/forgejo-runner-12.13.2/.forgejo/workflows/build-release.yml --- old/forgejo-runner-12.12.0/.forgejo/workflows/build-release.yml 2026-06-20 03:41:19.000000000 +0200 +++ new/forgejo-runner-12.13.2/.forgejo/workflows/build-release.yml 2026-07-23 16:16:48.000000000 +0200 @@ -62,7 +62,7 @@ - name: build without TOKEN if: ${{ secrets.TOKEN == '' }} - uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@c52f72f4738c131b40f5242148b565262b71cb73 # v5.7.2 + uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@c219f52c4d9a15f8f9f979111b1b79801f6857f3 # v5.7.3 with: forgejo: "${{ env.FORGEJO_SERVER_URL }}" owner: "${{ env.FORGEJO_REPOSITORY_OWNER }}" @@ -78,7 +78,7 @@ - name: build with TOKEN if: ${{ secrets.TOKEN != '' }} - uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@c52f72f4738c131b40f5242148b565262b71cb73 # v5.7.2 + uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@c219f52c4d9a15f8f9f979111b1b79801f6857f3 # v5.7.3 with: forgejo: "${{ env.FORGEJO_SERVER_URL }}" owner: "${{ env.FORGEJO_REPOSITORY_OWNER }}" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/.forgejo/workflows/docker-build-push-action-in-lxc.yml new/forgejo-runner-12.13.2/.forgejo/workflows/docker-build-push-action-in-lxc.yml --- old/forgejo-runner-12.12.0/.forgejo/workflows/docker-build-push-action-in-lxc.yml 2026-06-20 03:41:19.000000000 +0200 +++ new/forgejo-runner-12.13.2/.forgejo/workflows/docker-build-push-action-in-lxc.yml 2026-07-23 16:16:48.000000000 +0200 @@ -21,7 +21,7 @@ enable-email-notifications: true env: - FORGEJO_VERSION: 11.0.14 # renovate: datasource=docker depName=data.forgejo.org/forgejo/forgejo + FORGEJO_VERSION: 11.0.15 # renovate: datasource=docker depName=data.forgejo.org/forgejo/forgejo FORGEJO_USER: root FORGEJO_PASSWORD: admin1234 @@ -34,7 +34,7 @@ - name: install Forgejo so it can be used as a container registry id: registry - uses: https://data.forgejo.org/actions/setup-forgejo@7c0ebca121589fe5de0dde4d6cf528043002f84f # v3.2.1 + uses: https://data.forgejo.org/actions/setup-forgejo@bb44e99c35dc50942a2a7b346a3de7c6c33c83f9 # v3.2.3 with: user: ${{ env.FORGEJO_USER }} password: ${{ env.FORGEJO_PASSWORD }} @@ -58,7 +58,7 @@ - uses: https://data.forgejo.org/docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3.7.0 - uses: https://data.forgejo.org/docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0 with: - version: v0.34.1 # renovate: datasource=github-releases depName=buildx packageName=docker/buildx + version: v0.35.0 # renovate: datasource=github-releases depName=buildx packageName=docker/buildx # insecure / http connections to the registry are allowed config-inline: | [registry."${{ steps.registry.outputs.host-port }}"] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/.forgejo/workflows/example-lxc-systemd.yml new/forgejo-runner-12.13.2/.forgejo/workflows/example-lxc-systemd.yml --- old/forgejo-runner-12.12.0/.forgejo/workflows/example-lxc-systemd.yml 2026-06-20 03:41:19.000000000 +0200 +++ new/forgejo-runner-12.13.2/.forgejo/workflows/example-lxc-systemd.yml 2026-07-23 16:16:48.000000000 +0200 @@ -14,7 +14,7 @@ SERIAL: "30" LIFETIME: "60" SYSTEMD_OPTIONS: "--no-pager --full" - USE_VERSION: 11.0.14 # renovate: datasource=docker depName=data.forgejo.org/forgejo/forgejo + USE_VERSION: 11.0.15 # renovate: datasource=docker depName=data.forgejo.org/forgejo/forgejo jobs: example-lxc-systemd: @@ -54,7 +54,7 @@ done - id: forgejo - uses: https://data.forgejo.org/actions/setup-forgejo@7c0ebca121589fe5de0dde4d6cf528043002f84f # v3.2.1 + uses: https://data.forgejo.org/actions/setup-forgejo@bb44e99c35dc50942a2a7b346a3de7c6c33c83f9 # v3.2.3 with: user: root password: admin1234 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/.forgejo/workflows/example-on-demand.yml new/forgejo-runner-12.13.2/.forgejo/workflows/example-on-demand.yml --- old/forgejo-runner-12.12.0/.forgejo/workflows/example-on-demand.yml 2026-06-20 03:41:19.000000000 +0200 +++ new/forgejo-runner-12.13.2/.forgejo/workflows/example-on-demand.yml 2026-07-23 16:16:48.000000000 +0200 @@ -29,7 +29,7 @@ - uses: https://data.forgejo.org/actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - - uses: https://data.forgejo.org/actions/setup-forgejo@7c0ebca121589fe5de0dde4d6cf528043002f84f # v3.2.1 + - uses: https://data.forgejo.org/actions/setup-forgejo@bb44e99c35dc50942a2a7b346a3de7c6c33c83f9 # v3.2.3 with: user: "${{ env.username }}" password: "${{ env.password }}" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/.forgejo/workflows/publish-release.yml new/forgejo-runner-12.13.2/.forgejo/workflows/publish-release.yml --- old/forgejo-runner-12.12.0/.forgejo/workflows/publish-release.yml 2026-06-20 03:41:19.000000000 +0200 +++ new/forgejo-runner-12.13.2/.forgejo/workflows/publish-release.yml 2026-07-23 16:16:48.000000000 +0200 @@ -30,7 +30,7 @@ - uses: https://data.forgejo.org/actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - name: copy & sign - uses: https://data.forgejo.org/forgejo/forgejo-build-publish/publish@c52f72f4738c131b40f5242148b565262b71cb73 # v5.7.2 + uses: https://data.forgejo.org/forgejo/forgejo-build-publish/publish@c219f52c4d9a15f8f9f979111b1b79801f6857f3 # v5.7.3 with: from-forgejo: ${{ vars.FORGEJO }} to-forgejo: ${{ vars.FORGEJO }} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/.forgejo/workflows/release-notes-assistant.yml new/forgejo-runner-12.13.2/.forgejo/workflows/release-notes-assistant.yml --- old/forgejo-runner-12.12.0/.forgejo/workflows/release-notes-assistant.yml 2026-06-20 03:41:19.000000000 +0200 +++ new/forgejo-runner-12.13.2/.forgejo/workflows/release-notes-assistant.yml 2026-07-23 16:16:48.000000000 +0200 @@ -12,7 +12,7 @@ - labeled env: - RNA_VERSION: v1.7.2 # renovate: datasource=forgejo-releases depName=forgejo/release-notes-assistant + RNA_VERSION: v1.7.3 # renovate: datasource=forgejo-releases depName=forgejo/release-notes-assistant jobs: release-notes: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/.forgejo/workflows/test.yml new/forgejo-runner-12.13.2/.forgejo/workflows/test.yml --- old/forgejo-runner-12.12.0/.forgejo/workflows/test.yml 2026-06-20 03:41:19.000000000 +0200 +++ new/forgejo-runner-12.13.2/.forgejo/workflows/test.yml 2026-07-23 16:16:48.000000000 +0200 @@ -298,10 +298,10 @@ cp --recursive .* * /home/forgejo/runner chown --recursive forgejo:forgejo /home/forgejo/runner - - name: Run all tests + - name: Run tests run: | run0 -u forgejo --chdir=/home/forgejo/runner \ - bash --login -c 'make integration-test' + bash --login -c 'go test -race -v -timeout 30m ./... -args -features docker' validate-mocks: name: validate mocks diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/README.md new/forgejo-runner-12.13.2/README.md --- old/forgejo-runner-12.12.0/README.md 2026-06-20 03:41:19.000000000 +0200 +++ new/forgejo-runner-12.13.2/README.md 2026-07-23 16:16:48.000000000 +0200 @@ -31,7 +31,7 @@ - [linux-riscv64](https://code.forgejo.org/forgejo/runner/issues?labels=970) - [Windows](https://code.forgejo.org/forgejo/runner/issues?labels=365) -## Hacking +## Development The Forgejo runner is a dependency of the [setup-forgejo action](https://code.forgejo.org/actions/setup-forgejo). See [the full dependency graph](https://code.forgejo.org/actions/cascading-pr/#forgejo-dependencies) for a global view. @@ -47,37 +47,69 @@ ### Testing -The [workflow](.forgejo/workflows/test.yml) that runs in the CI uses similar commands. +There are three kinds of tests for Forgejo Runner: -#### Without a Forgejo instance +* Unit tests +* Integration tests +* [End-to-end tests](https://code.forgejo.org/forgejo/end-to-end/) that involve a running Forgejo instance -- Install [Docker](https://docs.docker.com/engine/install/) -- `make test integration-test` +Unit and integration tests are included in this repository, whereas [end-to-end tests](https://code.forgejo.org/forgejo/end-to-end/) are maintained separately. -The `TestRunner_RunEvent` test suite contains most integration tests -with real-world workflows and is time-consuming to run. During -development, it is helpful to run a specific test through a targeted -command such as this: +Tests can either be run using predefined GNU Make targets or `go test`. -- `go test -count=1 -run='TestRunner_RunEvent$/local-action-dockerfile$' ./act/runner` +#### Running Tests -#### With a Forgejo instance +To run all unit tests with GNU Make, run: -- Run a Forgejo instance locally (for instance at http://0.0.0.0:8080) and create as shared secret -```sh -export FORGEJO_RUNNER_SECRET='AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' -export FORGEJO_URL=http://0.0.0.0:8080 -forgejo forgejo-cli actions register --labels docker --name therunner --secret $FORGEJO_RUNNER_SECRET +```shell +$ make test ``` -- `make test integration-test` # which will run addional tests because FORGEJO_URL is set -#### end-to-end +Or with `go test`, run: -- Follow the instructions from the end-to-end tests to [run actions tests locally](https://code.forgejo.org/forgejo/end-to-end#running-from-locally-built-binary). -- `./end-to-end.sh actions_teardown` # stop the Forgejo and runner daemons running in the end-to-end environment -- `( cd ~/clone-of-the-runner-repo ; make build ; cp forgejo-runner /tmp/forgejo-end-to-end/forgejo-runner )` # install the runner built from sources -- `./end-to-end.sh actions_setup 13.0` # start Forgejo v13.0 and the runner daemon in the end-to-end environment -- `./end-to-end.sh actions_verify_example echo` # run the [echo workflow](https://code.forgejo.org/forgejo/end-to-end/src/branch/main/actions/example-echo/.forgejo/workflows/test.yml) -- `xdg-open http://127.0.0.1:3000/root/example-echo/actions/runs/1` # see the logs workflow -- `less /tmp/forgejo-end-to-end/forgejo-runner.log` # analyze the runner logs -- `less /tmp/forgejo-end-to-end/forgejo-work-path/log/forgejo.log` # analyze the Forgejo logs +```shell +$ go test -short ./... +``` + +To run all integration tests with GNU Make, run: + +```shell +$ make integration-test +``` + +Or with `go test`, run: + +```shell +$ go test ./... +``` + +#### Toggling Tests by Feature + +Forgejo Runner integrates with various technologies like [Docker](https://docker.com/) and [LXC](https://linuxcontainers.org/). They are not available on all platforms that Forgejo Runner can run on. The related tests take a long time to execute, too. It is possible to enable or disable the tests with the help of the test argument `-features`. **All feature-related tests are enabled by default**. + +`-features` takes a list of comma-separated feature names. For example, to run all tests including those related to `docker` and `lxc`, invoke: + +```shell +$ go test ./... -args -features "docker,lxc" +``` + +If all feature-related tests should be skipped, run: + +```shell +$ go test ./... -args -features "-" +``` + +If `-features` is not present, all feature-related tests will be enabled. + +List of all feature toggles: + +| Key | Purpose | +|----------|-------------------------------------------------------------------------------------------| +| `docker` | Toggles tests that require [Docker](https://docker.com/) or [Podman](https://podman.io/). | +| `lxc` | Toggles tests that require [LXC](https://linuxcontainers.org/). | + +#### Running End-to-End Tests + +For running end-to-end tests during development, please see the instructions in the respective [repository where the end-to-end tests are maintained](https://code.forgejo.org/forgejo/end-to-end/). + +During CI, the end-to-end tests can be triggered for a particular pull request by attaching the label [`run-end-to-end-tests`](https://code.forgejo.org/forgejo/runner/pulls?labels=1032). diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/act/artifactcache/main_test.go new/forgejo-runner-12.13.2/act/artifactcache/main_test.go --- old/forgejo-runner-12.12.0/act/artifactcache/main_test.go 1970-01-01 01:00:00.000000000 +0100 +++ new/forgejo-runner-12.13.2/act/artifactcache/main_test.go 2026-07-23 16:16:48.000000000 +0200 @@ -0,0 +1,8 @@ +// Copyright 2026 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package artifactcache + +import ( + _ "code.forgejo.org/forgejo/runner/v12/testutils" +) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/act/common/git/main_test.go new/forgejo-runner-12.13.2/act/common/git/main_test.go --- old/forgejo-runner-12.12.0/act/common/git/main_test.go 1970-01-01 01:00:00.000000000 +0100 +++ new/forgejo-runner-12.13.2/act/common/git/main_test.go 2026-07-23 16:16:48.000000000 +0200 @@ -0,0 +1,8 @@ +// Copyright 2026 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package git + +import ( + _ "code.forgejo.org/forgejo/runner/v12/testutils" +) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/act/common/gitignore/main_test.go new/forgejo-runner-12.13.2/act/common/gitignore/main_test.go --- old/forgejo-runner-12.12.0/act/common/gitignore/main_test.go 1970-01-01 01:00:00.000000000 +0100 +++ new/forgejo-runner-12.13.2/act/common/gitignore/main_test.go 2026-07-23 16:16:48.000000000 +0200 @@ -0,0 +1,8 @@ +// Copyright 2026 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package gitignore + +import ( + _ "code.forgejo.org/forgejo/runner/v12/testutils" +) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/act/common/main_test.go new/forgejo-runner-12.13.2/act/common/main_test.go --- old/forgejo-runner-12.12.0/act/common/main_test.go 1970-01-01 01:00:00.000000000 +0100 +++ new/forgejo-runner-12.13.2/act/common/main_test.go 2026-07-23 16:16:48.000000000 +0200 @@ -0,0 +1,8 @@ +// Copyright 2026 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package common + +import ( + _ "code.forgejo.org/forgejo/runner/v12/testutils" +) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/act/container/docker/endpoint.go new/forgejo-runner-12.13.2/act/container/docker/endpoint.go --- old/forgejo-runner-12.12.0/act/container/docker/endpoint.go 2026-06-20 03:41:19.000000000 +0200 +++ new/forgejo-runner-12.13.2/act/container/docker/endpoint.go 2026-07-23 16:16:48.000000000 +0200 @@ -91,10 +91,12 @@ return "X64" case "386": return "X86" + case "arm": + return "ARM" case "arm64": return "ARM64" } - return e.arch + return "undefined" } // CurrentSystemPlatform returns the daemon's platform as "os/arch", normalised diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/act/container/docker/images_test.go new/forgejo-runner-12.13.2/act/container/docker/images_test.go --- old/forgejo-runner-12.12.0/act/container/docker/images_test.go 2026-06-20 03:41:19.000000000 +0200 +++ new/forgejo-runner-12.13.2/act/container/docker/images_test.go 2026-07-23 16:16:48.000000000 +0200 @@ -3,15 +3,14 @@ import ( "io" "os" - "runtime" "testing" + "code.forgejo.org/forgejo/runner/v12/testutils" "github.com/docker/docker/api/types/image" v1 "github.com/opencontainers/image-spec/specs-go/v1" log "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "gotest.tools/v3/skip" ) func init() { @@ -19,7 +18,7 @@ } func TestImageExistsLocally(t *testing.T) { - skip.If(t, runtime.GOOS != "linux") // Windows and macOS cannot natively run Linux containers + testutils.RequireTestFeatures(t, testutils.TestFeatureDocker) if testing.Short() { t.Skip("skipping integration test") } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/act/container/docker/main_test.go new/forgejo-runner-12.13.2/act/container/docker/main_test.go --- old/forgejo-runner-12.12.0/act/container/docker/main_test.go 1970-01-01 01:00:00.000000000 +0100 +++ new/forgejo-runner-12.13.2/act/container/docker/main_test.go 2026-07-23 16:16:48.000000000 +0200 @@ -0,0 +1,8 @@ +// Copyright 2026 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package docker + +import ( + _ "code.forgejo.org/forgejo/runner/v12/testutils" +) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/act/container/docker/run_test.go new/forgejo-runner-12.13.2/act/container/docker/run_test.go --- old/forgejo-runner-12.12.0/act/container/docker/run_test.go 2026-06-20 03:41:19.000000000 +0200 +++ new/forgejo-runner-12.13.2/act/container/docker/run_test.go 2026-07-23 16:16:48.000000000 +0200 @@ -8,15 +8,13 @@ "io" "net" "os" - "runtime" "strings" "testing" "time" "code.forgejo.org/forgejo/runner/v12/act/common" actcontainer "code.forgejo.org/forgejo/runner/v12/act/container" - "gotest.tools/v3/skip" - + "code.forgejo.org/forgejo/runner/v12/testutils" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/container" "github.com/docker/docker/client" @@ -27,7 +25,7 @@ ) func TestDocker(t *testing.T) { - skip.If(t, runtime.GOOS != "linux") // Windows and macOS cannot natively run Linux containers + testutils.RequireTestFeatures(t, testutils.TestFeatureDocker) if testing.Short() { t.Skip("skipping integration test") } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/act/container/host_environment.go new/forgejo-runner-12.13.2/act/container/host_environment.go --- old/forgejo-runner-12.12.0/act/container/host_environment.go 2026-06-20 03:41:19.000000000 +0200 +++ new/forgejo-runner-12.13.2/act/container/host_environment.go 2026-07-23 16:16:48.000000000 +0200 @@ -453,39 +453,56 @@ return strings.Join(paths, string(filepath.ListSeparator)) } -// Reference for Arch values for runner.arch -// https://docs.github.com/en/actions/learn-github-actions/contexts#runner-context -func goArchToActionArch(arch string) string { - archMapper := map[string]string{ - "amd64": "X64", - "x86_64": "X64", - "386": "X86", - "aarch64": "ARM64", +// determineGitHubArch returns the architecture name used by GitHub that corresponds to the given value of +// [runtime.GOARCH]. Returns the literal string "undefined" (without quotes) if GitHub has not yet defined a +// corresponding architecture name. +func determineGitHubArch(goarch string) string { + // For a list of possible runner.arch values, see + // https://docs.github.com/en/actions/learn-github-actions/contexts#runner-context. It is wrong to return any other + // than the values sanctioned by GitHub because they are used to build the `runner` context. Matching GitHub's + // behaviour is required to retain compatibility. If additional architectures should be supported, define a separate + // context. + switch goarch { + case "386": + return "X86" + case "amd64": + return "X64" + case "arm": + return "ARM" + case "arm64": + return "ARM64" + default: + return "undefined" } - if arch, ok := archMapper[arch]; ok { - return arch - } - return arch } -func goOsToActionOs(os string) string { - osMapper := map[string]string{ - "linux": "Linux", - "windows": "Windows", - "darwin": "macOS", - } - if os, ok := osMapper[os]; ok { - return os +// determineGitHubOS returns the operating system name used by GitHub that corresponds to the given value of +// [runtime.GOOS]. Returns the literal string "undefined" (without quotes) if GitHub has not yet defined a +// corresponding operating system name. +func determineGitHubOS(goos string) string { + // For a list of possible runner.os values, see + // https://docs.github.com/en/actions/learn-github-actions/contexts#runner-context. It is wrong to return any other + // than the values sanctioned by GitHub because they are used to build the `runner` context. Matching GitHub's + // behaviour is required to retain compatibility. If additional operating systems should be supported, define a + // separate context. + switch goos { + case "linux": + return "Linux" + case "windows": + return "Windows" + case "darwin": + return "macOS" + default: + return "undefined" } - return os } func (e *HostEnvironment) GetRunnerContext(_ context.Context) map[string]any { return map[string]any{ - "os": goOsToActionOs(runtime.GOOS), - "arch": goArchToActionArch(runtime.GOARCH), - "temp": e.TmpDir, + "os": determineGitHubOS(runtime.GOOS), + "arch": determineGitHubArch(runtime.GOARCH), "tool_cache": e.ToolCache, + "temp": e.TmpDir, } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/act/container/host_environment_test.go new/forgejo-runner-12.13.2/act/container/host_environment_test.go --- old/forgejo-runner-12.12.0/act/container/host_environment_test.go 2026-06-20 03:41:19.000000000 +0200 +++ new/forgejo-runner-12.13.2/act/container/host_environment_test.go 2026-07-23 16:16:48.000000000 +0200 @@ -337,3 +337,58 @@ return stdoutBuffer.Bytes(), nil } + +func TestDetermineGitHubArch(t *testing.T) { + // The keys are possible values of runtime.GOARCH. The list can be compiled by running: + // go tool dist list | cut -d/ -f2 | sort -u + expectedMappings := map[string]string{ + "386": "X86", + "amd64": "X64", + "arm": "ARM", + "arm64": "ARM64", + "loong64": "undefined", + "mips": "undefined", + "mips64": "undefined", + "mips64le": "undefined", + "mipsle": "undefined", + "ppc64": "undefined", + "ppc64le": "undefined", + "riscv64": "undefined", + "s390x": "undefined", + "wasm": "undefined", + } + + for key, value := range expectedMappings { + t.Run(key, func(t *testing.T) { + assert.Equal(t, value, determineGitHubArch(key)) + }) + } +} + +func TestDetermineGitHubOS(t *testing.T) { + // The keys are possible values of runtime.GOOS. The list can be compiled by running: + // go tool dist list | cut -d/ -f1 | sort -u + expectedMappings := map[string]string{ + "aix": "undefined", + "android": "undefined", + "darwin": "macOS", + "dragonfly": "undefined", + "freebsd": "undefined", + "illumos": "undefined", + "ios": "undefined", + "js": "undefined", + "linux": "Linux", + "netbsd": "undefined", + "openbsd": "undefined", + "plan9": "undefined", + "solaris": "undefined", + "wasip1": "undefined", + "windows": "Windows", + } + + for key, value := range expectedMappings { + t.Run(key, func(t *testing.T) { + assert.Equal(t, value, determineGitHubOS(key)) + }) + } +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/act/container/main_test.go new/forgejo-runner-12.13.2/act/container/main_test.go --- old/forgejo-runner-12.12.0/act/container/main_test.go 1970-01-01 01:00:00.000000000 +0100 +++ new/forgejo-runner-12.13.2/act/container/main_test.go 2026-07-23 16:16:48.000000000 +0200 @@ -0,0 +1,8 @@ +// Copyright 2026 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package container + +import ( + _ "code.forgejo.org/forgejo/runner/v12/testutils" +) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/act/exprparser/functions.go new/forgejo-runner-12.13.2/act/exprparser/functions.go --- old/forgejo-runner-12.12.0/act/exprparser/functions.go 2026-06-20 03:41:19.000000000 +0200 +++ new/forgejo-runner-12.13.2/act/exprparser/functions.go 2026-07-23 16:16:48.000000000 +0200 @@ -301,3 +301,32 @@ func (impl *interpreterImpl) cancelled() (bool, error) { return impl.env.Job.Status == "cancelled", nil } + +func (impl *interpreterImpl) caseStatement(args ...reflect.Value) (any, error) { + lengthOfRealArguments := len(args) - 1 + defaultValue := args[lengthOfRealArguments] + + if len(args) < 3 { + return nil, fmt.Errorf("'case' expected at least three arguments") + } + + if len(args)%2 != 1 { + return nil, fmt.Errorf("'case' expected odd number of arguments") + } + + for i := 0; i < lengthOfRealArguments; i++ { + predicate := args[i] + i++ + value := args[i] + + if predicate.Kind() != reflect.Bool { + return nil, fmt.Errorf("'case' expected predicate '%s' to be boolean", impl.coerceToString(predicate).String()) + } + + if predicate.Bool() { + return impl.coerceToString(value).String(), nil + } + } + + return defaultValue.String(), nil +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/act/exprparser/functions_test.go new/forgejo-runner-12.13.2/act/exprparser/functions_test.go --- old/forgejo-runner-12.12.0/act/exprparser/functions_test.go 2026-06-20 03:41:19.000000000 +0200 +++ new/forgejo-runner-12.13.2/act/exprparser/functions_test.go 2026-07-23 16:16:48.000000000 +0200 @@ -260,7 +260,7 @@ env := &EvaluationEnvironment{} for _, tt := range table { - skip.If(t, runtime.GOOS != "windows" && strings.HasPrefix(tt.name, "dos")) // Windows and macOS cannot run linux docker container natively + skip.If(t, runtime.GOOS != "windows" && strings.HasPrefix(tt.name, "dos")) t.Run(tt.name, func(t *testing.T) { workdir, err := filepath.Abs("testdata") assert.Nil(t, err) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/act/exprparser/interpreter.go new/forgejo-runner-12.13.2/act/exprparser/interpreter.go --- old/forgejo-runner-12.12.0/act/exprparser/interpreter.go 2026-06-20 03:41:19.000000000 +0200 +++ new/forgejo-runner-12.13.2/act/exprparser/interpreter.go 2026-07-23 16:16:48.000000000 +0200 @@ -38,8 +38,9 @@ WorkingDir string Context string - OverrideSuccess func() (bool, error) - OverrideFailure func() (bool, error) + OverrideSuccess func() (bool, error) + OverrideFailure func() (bool, error) + OverrideCancelled func() (bool, error) } type DefaultStatusCheck int @@ -918,7 +919,15 @@ } return nil, fmt.Errorf("Context '%s' must be one of 'job' or 'step'", impl.config.Context) case "cancelled": + if impl.config.OverrideCancelled != nil { + return impl.config.OverrideCancelled() + } return impl.cancelled() + case "case": + if err := argAtLeastCheck(3); err != nil { + return nil, err + } + return impl.caseStatement(args...) default: return nil, fmt.Errorf("TODO: '%s' not implemented", funcCallNode.Callee) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/act/exprparser/interpreter_test.go new/forgejo-runner-12.13.2/act/exprparser/interpreter_test.go --- old/forgejo-runner-12.12.0/act/exprparser/interpreter_test.go 2026-06-20 03:41:19.000000000 +0200 +++ new/forgejo-runner-12.13.2/act/exprparser/interpreter_test.go 2026-07-23 16:16:48.000000000 +0200 @@ -77,6 +77,26 @@ {"github.event.commits[0].author.username != github.event.commits[1].author.username1", true, "property-comparison3", ""}, {"github.event.commits[0].author.username1 != github.event.commits[1].author.username2", true, "property-comparison4", ""}, {"secrets != env", nil, "property-comparison5", "Compare not implemented for types: left: ptr, right: ptr"}, + {"case(true,'correct',false,'incorrect','nochance')", "correct", "case-bool1", ""}, + {"case(false,'incorrect',true,'correct','nochance')", "correct", "case-bool2", ""}, + {"case(false,'incorrect','correct')", "correct", "case-bool3", ""}, + {"case(true,'correct','incorrect')", "correct", "case-bool4", ""}, + {"case(1 == 1,'correct',1 == 2,'incorrect','nochance')", "correct", "case-expression1", ""}, + {"case(1 == 2,'incorrect',1 == 1,'correct','nochance')", "correct", "case-expression2", ""}, + {"case(1 == 2,'incorrect',2 == 1,'nochance','correct')", "correct", "case-expression3", ""}, + {"case()", nil, "case-empty", "'case' expected at least 3 arguments but got 0 instead"}, + {"case('incorrect')", nil, "case-missing-arguments1", "'case' expected at least 3 arguments but got 1 instead"}, + {"case(true,'incorrect')", nil, "case-missing-arguments2", "'case' expected at least 3 arguments but got 2 instead"}, + {"case(1 == 2,'incorrect',2 == 1,'nochance')", nil, "case-missing-arguments3", "'case' expected odd number of arguments"}, + {"case('string','incorrect',2 == 1,'nochance','false')", nil, "case-incorrect-argument1", "'case' expected predicate 'string' to be boolean"}, + {"case(1,'incorrect',2 == 1,'nochance','false')", nil, "case-incorrect-argument2", "'case' expected predicate '1' to be boolean"}, + {"case(1,'incorrect',2 == 1,'nochance','false')", nil, "case-incorrect-argument2", "'case' expected predicate '1' to be boolean"}, + {"case(1.1,'incorrect',2 == 1,'nochance','false')", nil, "case-incorrect-argument2", "'case' expected predicate '1.1' to be boolean"}, + {"case(true,'correct','string','nochance','false')", "correct", "case-incorrect-type-after-selected-branch-passes", ""}, // predicates are evaluated lazily + {"case(true,true,false,'nochance','incorrect')", "true", "case-bool-return", ""}, + {"case(true,1,'incorrect')", "1", "case-integer-return", ""}, + {"case(true,1,'incorrect')", "1", "case-float-return1", ""}, + {"case(true,1.1,'incorrect')", "1.1", "case-float-return2", ""}, } env := &EvaluationEnvironment{ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/act/exprparser/main_test.go new/forgejo-runner-12.13.2/act/exprparser/main_test.go --- old/forgejo-runner-12.12.0/act/exprparser/main_test.go 1970-01-01 01:00:00.000000000 +0100 +++ new/forgejo-runner-12.13.2/act/exprparser/main_test.go 2026-07-23 16:16:48.000000000 +0200 @@ -0,0 +1,8 @@ +// Copyright 2026 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package exprparser + +import ( + _ "code.forgejo.org/forgejo/runner/v12/testutils" +) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/act/filecollector/main_test.go new/forgejo-runner-12.13.2/act/filecollector/main_test.go --- old/forgejo-runner-12.12.0/act/filecollector/main_test.go 1970-01-01 01:00:00.000000000 +0100 +++ new/forgejo-runner-12.13.2/act/filecollector/main_test.go 2026-07-23 16:16:48.000000000 +0200 @@ -0,0 +1,8 @@ +// Copyright 2026 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package filecollector + +import ( + _ "code.forgejo.org/forgejo/runner/v12/testutils" +) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/act/jobparser/interpreter.go new/forgejo-runner-12.13.2/act/jobparser/interpreter.go --- old/forgejo-runner-12.12.0/act/jobparser/interpreter.go 2026-06-20 03:41:19.000000000 +0200 +++ new/forgejo-runner-12.13.2/act/jobparser/interpreter.go 2026-07-23 16:16:48.000000000 +0200 @@ -199,6 +199,16 @@ OverrideFailure: func() (bool, error) { return !neededJobsSucceeded, nil }, + OverrideCancelled: func() (bool, error) { + // Implementation of `if: ${{ cancelled() }}` at a job-level. Forgejo doesn't attempt to evaluate the `if` + // blocks of jobs when the workflow has been cancelled; it just marks all jobs as cancelled. Until this + // behaviour is changed (if ever), `cancelled()` -> `false`, because we'd never be checking it otherwise. + // + // Changing this behaviour would require that Forgejo pass the workflow-level state of cancellation into the + // jobparser. It can't be inferred by the data we have available today, which is just the status of + // dependent jobs; not all jobs, and not the workflow itself. + return false, nil + }, } return exprparser.NewInterpreter(ee, config) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/act/jobparser/jobparser.go new/forgejo-runner-12.13.2/act/jobparser/jobparser.go --- old/forgejo-runner-12.12.0/act/jobparser/jobparser.go 2026-06-20 03:41:19.000000000 +0200 +++ new/forgejo-runner-12.13.2/act/jobparser/jobparser.go 2026-07-23 16:16:48.000000000 +0200 @@ -24,6 +24,7 @@ id string jobParserJob *Job workflowJob *model.Job + parseContext *parseContext matrix map[string]any jobNeeds []string @@ -126,6 +127,7 @@ workflowJob: origin.GetJob(jobName), workflowLevelEnableOpenIDConnect: origin.EnableOpenIDConnect, workflowLevelEnv: workflow.Env, + parseContext: pc, } } @@ -209,7 +211,7 @@ WorkflowCallParent: bothJobs.workflowCallParent, }, Permissions: workflow.Permissions, - parseContext: pc, + parseContext: bothJobs.parseContext, } if bothJobs.overrideOnClause != nil { swf.RawOn = *bothJobs.overrideOnClause @@ -392,6 +394,7 @@ matrix: matrix, jobNeeds: jobNeeds, overrideOnClause: bothJobs.overrideOnClause, + parseContext: pc, workflowLevelEnv: bothJobs.workflowLevelEnv, workflowLevelEnableOpenIDConnect: bothJobs.workflowLevelEnableOpenIDConnect, @@ -609,6 +612,12 @@ workflowJob: workflow.GetJob(id), overrideOnClause: &swf.RawOn, + // During workflow expansion we created a new parse context, replacing ${{ inputs.* }} with the results of + // `evaluateReusableWorkflowInputs`. We need to preserve that parse context as we pass the jobs pass up to + // the outer evaluation as the parse context is used in `EvaluateIf()` later, after jobs are returned from + // the jobparser. + parseContext: swf.parseContext, + workflowLevelEnv: workflowLevelEnv, workflowLevelEnableOpenIDConnect: workflowLevelEnableOpenIDConnect, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/act/jobparser/jobparser_test.go new/forgejo-runner-12.13.2/act/jobparser/jobparser_test.go --- old/forgejo-runner-12.12.0/act/jobparser/jobparser_test.go 2026-06-20 03:41:19.000000000 +0200 +++ new/forgejo-runner-12.13.2/act/jobparser/jobparser_test.go 2026-07-23 16:16:48.000000000 +0200 @@ -1225,6 +1225,8 @@ test("failure", "failure", true) test("always", "success", true) test("always", "failure", true) + test("cancelled", "success", false) + test("cancelled", "failure", false) }) t.Run("unsupported server-side access", func(t *testing.T) { @@ -1264,6 +1266,56 @@ _, err = job.EvaluateIf() require.ErrorContains(t, err, "cannot evaluate in job parser: secrets value \"something\" referenced") }) + + t.Run("workflow expansion inputs", func(t *testing.T) { + outerWorkflow := ` +on: + workflow_dispatch: + inputs: + outer_input: + type: boolean + default: true +jobs: + outer-job: + # if: ${{ inputs.outer_input }} # FIXME: doesn't work as the 'if' condition is merged into the child job, but this has a different set of inputs + uses: some-org/some-repo/.forgejo/workflows/recursive.yaml@v1 +` + innerWorkflow := ` +on: + workflow_call: + inputs: + inner_input: + type: boolean + default: true +jobs: + inner-job: + if: ${{ inputs.inner_input }} + steps: + - run: echo "OK" +` + + swf, err := Parse( + []byte(outerWorkflow), + false, + ExpandInstanceReusableWorkflows(func(job *Job, ref *model.NonLocalReusableWorkflowReference) ([]byte, error) { + return []byte(innerWorkflow), nil + }), + ) + require.NoError(t, err) + require.Len(t, swf, 2) // 'outer-job' and 'inner-job' + + name, outer := swf[0].Job() + assert.Equal(t, "outer-job", name) + require.NotNil(t, outer) + + name, inner := swf[1].Job() + assert.Equal(t, "outer-job.inner-job", name) + require.NotNil(t, inner) + + ifCond, err := inner.EvaluateIf() + require.NoError(t, err) + assert.True(t, ifCond) + }) } func TestEvaluateRunName(t *testing.T) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/act/jobparser/main_test.go new/forgejo-runner-12.13.2/act/jobparser/main_test.go --- old/forgejo-runner-12.12.0/act/jobparser/main_test.go 1970-01-01 01:00:00.000000000 +0100 +++ new/forgejo-runner-12.13.2/act/jobparser/main_test.go 2026-07-23 16:16:48.000000000 +0200 @@ -0,0 +1,8 @@ +// Copyright 2026 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package jobparser + +import ( + _ "code.forgejo.org/forgejo/runner/v12/testutils" +) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/act/model/main_test.go new/forgejo-runner-12.13.2/act/model/main_test.go --- old/forgejo-runner-12.12.0/act/model/main_test.go 1970-01-01 01:00:00.000000000 +0100 +++ new/forgejo-runner-12.13.2/act/model/main_test.go 2026-07-23 16:16:48.000000000 +0200 @@ -0,0 +1,8 @@ +// Copyright 2026 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package model + +import ( + _ "code.forgejo.org/forgejo/runner/v12/testutils" +) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/act/runner/job_executor_test.go new/forgejo-runner-12.13.2/act/runner/job_executor_test.go --- old/forgejo-runner-12.12.0/act/runner/job_executor_test.go 2026-06-20 03:41:19.000000000 +0200 +++ new/forgejo-runner-12.13.2/act/runner/job_executor_test.go 2026-07-23 16:16:48.000000000 +0200 @@ -5,7 +5,6 @@ "errors" "fmt" "io" - "runtime" "sync" "testing" "time" @@ -14,11 +13,11 @@ "code.forgejo.org/forgejo/runner/v12/act/container" "code.forgejo.org/forgejo/runner/v12/act/container/docker" "code.forgejo.org/forgejo/runner/v12/act/model" + "code.forgejo.org/forgejo/runner/v12/testutils" "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" - "gotest.tools/v3/skip" ) func TestJobExecutor(t *testing.T) { @@ -26,7 +25,7 @@ t.Skip("skipping integration test") } - skip.If(t, runtime.GOOS != "linux") // Windows and macOS cannot natively run Linux containers + testutils.RequireTestFeatures(t, testutils.TestFeatureDocker) tables := []TestJobFileInfo{ {workdir, "uses-and-run-in-one-step", "push", "Invalid run/uses syntax for job:test step:Test", platforms, secrets}, {workdir, "uses-github-empty", "push", "job:test step:empty", platforms, secrets}, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/act/runner/main_test.go new/forgejo-runner-12.13.2/act/runner/main_test.go --- old/forgejo-runner-12.12.0/act/runner/main_test.go 1970-01-01 01:00:00.000000000 +0100 +++ new/forgejo-runner-12.13.2/act/runner/main_test.go 2026-07-23 16:16:48.000000000 +0200 @@ -0,0 +1,8 @@ +// Copyright 2026 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package runner + +import ( + _ "code.forgejo.org/forgejo/runner/v12/testutils" +) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/act/runner/run_context_test.go new/forgejo-runner-12.13.2/act/runner/run_context_test.go --- old/forgejo-runner-12.12.0/act/runner/run_context_test.go 2026-06-20 03:41:19.000000000 +0200 +++ new/forgejo-runner-12.13.2/act/runner/run_context_test.go 2026-07-23 16:16:48.000000000 +0200 @@ -729,7 +729,8 @@ } func TestRunContext_PrepareJobContainer(t *testing.T) { - skip.If(t, runtime.GOOS != "linux") // Windows and macOS cannot natively run Linux containers + testutils.RequireTestFeatures(t, testutils.TestFeatureDocker) + yaml := ` on: push: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/act/runner/runner_test.go new/forgejo-runner-12.13.2/act/runner/runner_test.go --- old/forgejo-runner-12.12.0/act/runner/runner_test.go 2026-06-20 03:41:19.000000000 +0200 +++ new/forgejo-runner-12.13.2/act/runner/runner_test.go 2026-07-23 16:16:48.000000000 +0200 @@ -14,6 +14,9 @@ "testing" "time" + "code.forgejo.org/forgejo/runner/v12/act/common" + "code.forgejo.org/forgejo/runner/v12/act/model" + "code.forgejo.org/forgejo/runner/v12/testutils" "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/image" "github.com/docker/docker/api/types/network" @@ -24,10 +27,6 @@ assert "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.yaml.in/yaml/v3" - "gotest.tools/v3/skip" - - "code.forgejo.org/forgejo/runner/v12/act/common" - "code.forgejo.org/forgejo/runner/v12/act/model" ) var ( @@ -240,7 +239,7 @@ if testing.Short() { t.Skip("skipping integration test") } - skip.If(t, runtime.GOOS != "linux") // Windows and macOS cannot run linux docker container natively + testutils.RequireTestFeatures(t, testutils.TestFeatureDocker) ctx := t.Context() @@ -398,7 +397,7 @@ if testing.Short() { t.Skip("skipping integration test") } - skip.If(t, runtime.GOOS != "linux") // Windows and macOS cannot run linux docker container natively + testutils.RequireTestFeatures(t, testutils.TestFeatureDocker) ctx := common.WithDryrun(t.Context(), true) @@ -428,7 +427,7 @@ if testing.Short() { t.Skip("skipping integration test") } - skip.If(t, runtime.GOOS != "linux") // Windows and macOS cannot run linux docker container natively + testutils.RequireTestFeatures(t, testutils.TestFeatureDocker) ctx := t.Context() @@ -454,7 +453,7 @@ if testing.Short() { t.Skip("skipping integration test") } - skip.If(t, runtime.GOOS != "linux") // Windows and macOS cannot run linux docker container natively + testutils.RequireTestFeatures(t, testutils.TestFeatureDocker) tjfi := TestJobFileInfo{ workdir: workdir, @@ -487,7 +486,7 @@ if testing.Short() { t.Skip("skipping integration test") } - skip.If(t, runtime.GOOS != "linux") // Windows and macOS cannot run linux docker container natively + testutils.RequireTestFeatures(t, testutils.TestFeatureDocker) for _, what := range []string{"step", "job"} { t.Run(what, func(t *testing.T) { @@ -539,6 +538,11 @@ } func TestRunner_MaskValues(t *testing.T) { + if testing.Short() { + t.Skip("skipping integration test") + } + testutils.RequireTestFeatures(t, testutils.TestFeatureDocker) + assertNoSecret := func(text, secret string) { index := strings.Index(text, "composite secret") if index > -1 { @@ -547,11 +551,6 @@ assert.False(t, strings.Contains(text, "composite secret")) } - if testing.Short() { - t.Skip("skipping integration test") - } - skip.If(t, runtime.GOOS != "linux") // Windows and macOS cannot run linux docker container natively - log.SetLevel(log.DebugLevel) tjfi := TestJobFileInfo{ @@ -574,7 +573,8 @@ if testing.Short() { t.Skip("skipping integration test") } - skip.If(t, runtime.GOOS != "linux") // Windows and macOS cannot run linux docker container natively + testutils.RequireTestFeatures(t, testutils.TestFeatureDocker) + workflowPath := "secrets" tjfi := TestJobFileInfo{ @@ -597,7 +597,7 @@ if testing.Short() { t.Skip("skipping integration test") } - skip.If(t, runtime.GOOS != "linux") // Windows and macOS cannot run linux docker container natively + testutils.RequireTestFeatures(t, testutils.TestFeatureDocker) log.SetLevel(log.DebugLevel) ctx := t.Context() @@ -636,7 +636,8 @@ if testing.Short() { t.Skip("skipping integration test") } - skip.If(t, runtime.GOOS != "linux") // Windows and macOS cannot run linux docker container natively + testutils.RequireTestFeatures(t, testutils.TestFeatureDocker) + workflowPath := "input-from-cli" tjfi := TestJobFileInfo{ @@ -658,7 +659,7 @@ if testing.Short() { t.Skip("skipping integration test") } - skip.If(t, runtime.GOOS != "linux") // Windows and macOS cannot run linux docker container natively + testutils.RequireTestFeatures(t, testutils.TestFeatureDocker) workflowPath := "pull-request" @@ -677,7 +678,8 @@ if testing.Short() { t.Skip("skipping integration test") } - skip.If(t, runtime.GOOS != "linux") // Windows and macOS cannot run linux docker container natively + testutils.RequireTestFeatures(t, testutils.TestFeatureDocker) + workflowPath := "matrix-with-user-inclusions" tjfi := TestJobFileInfo{ @@ -707,7 +709,7 @@ if testing.Short() { t.Skip("skipping integration test") } - skip.If(t, runtime.GOOS != "linux") // Windows and macOS cannot run linux docker container natively + testutils.RequireTestFeatures(t, testutils.TestFeatureDocker) log.SetLevel(log.DebugLevel) @@ -798,7 +800,8 @@ t.Skip("skipping integration test") } - skip.If(t, runtime.GOOS != "linux") // Windows and macOS cannot run linux docker container natively + testutils.RequireTestFeatures(t, testutils.TestFeatureDocker) + if !supportsMixedArchitecture(t) { // For CI testing we want confidence that this test is run, but it's OK if it's skipped for developers since it // has complex environmental requiremetns. @@ -846,7 +849,7 @@ if testing.Short() { t.Skip("skipping integration test") } - skip.If(t, runtime.GOOS != "linux") // Windows and macOS cannot run linux docker container natively + testutils.RequireTestFeatures(t, testutils.TestFeatureDocker) tempDir := t.TempDir() volumePath := path.Join(tempDir, "file.txt") @@ -869,7 +872,7 @@ if testing.Short() { t.Skip("skipping integration test") } - skip.If(t, runtime.GOOS != "linux") // Windows and macOS cannot run linux docker container natively + testutils.RequireTestFeatures(t, testutils.TestFeatureDocker) expectedLogMessages := []string{ // stage=Pre @@ -918,7 +921,7 @@ if testing.Short() { t.Skip("skipping integration test") } - skip.If(t, runtime.GOOS != "linux") // Windows and macOS cannot run linux docker container natively + testutils.RequireTestFeatures(t, testutils.TestFeatureDocker) expectedLogMessages := []string{ // stage=Pre @@ -967,7 +970,7 @@ if testing.Short() { t.Skip("skipping integration test") } - skip.If(t, runtime.GOOS != "linux") // Windows and macOS cannot run linux docker container natively + testutils.RequireTestFeatures(t, testutils.TestFeatureDocker) jobFile := TestJobFileInfo{ workdir: workdir, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/act/schema/main_test.go new/forgejo-runner-12.13.2/act/schema/main_test.go --- old/forgejo-runner-12.12.0/act/schema/main_test.go 1970-01-01 01:00:00.000000000 +0100 +++ new/forgejo-runner-12.13.2/act/schema/main_test.go 2026-07-23 16:16:48.000000000 +0200 @@ -0,0 +1,8 @@ +// Copyright 2026 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package schema + +import ( + _ "code.forgejo.org/forgejo/runner/v12/testutils" +) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/act/schema/schema.go new/forgejo-runner-12.13.2/act/schema/schema.go --- old/forgejo-runner-12.12.0/act/schema/schema.go 2026-06-20 03:41:19.000000000 +0200 +++ new/forgejo-runner-12.13.2/act/schema/schema.go 2026-07-23 16:16:48.000000000 +0200 @@ -172,6 +172,7 @@ AddFunction(funcs, "startsWith", 2, 2) AddFunction(funcs, "toJson", 1, 1) AddFunction(funcs, "fromJson", 1, 1) + AddFunction(funcs, "case", 3, 255) for _, v := range s.Context { i := strings.Index(v, "(") if i == -1 { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/act/workflowpattern/main_test.go new/forgejo-runner-12.13.2/act/workflowpattern/main_test.go --- old/forgejo-runner-12.12.0/act/workflowpattern/main_test.go 1970-01-01 01:00:00.000000000 +0100 +++ new/forgejo-runner-12.13.2/act/workflowpattern/main_test.go 2026-07-23 16:16:48.000000000 +0200 @@ -0,0 +1,8 @@ +// Copyright 2026 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package workflowpattern + +import ( + _ "code.forgejo.org/forgejo/runner/v12/testutils" +) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/examples/docker-compose/compose-forgejo-and-runner.yml new/forgejo-runner-12.13.2/examples/docker-compose/compose-forgejo-and-runner.yml --- old/forgejo-runner-12.12.0/examples/docker-compose/compose-forgejo-and-runner.yml 2026-06-20 03:41:19.000000000 +0200 +++ new/forgejo-runner-12.13.2/examples/docker-compose/compose-forgejo-and-runner.yml 2026-07-23 16:16:48.000000000 +0200 @@ -57,7 +57,7 @@ - 8080:3000 runner-register: - image: data.forgejo.org/forgejo/runner:12.10.2 + image: data.forgejo.org/forgejo/runner:12.12.0 links: - docker-in-docker - forgejo @@ -81,7 +81,7 @@ ' runner-daemon: - image: data.forgejo.org/forgejo/runner:12.10.2 + image: data.forgejo.org/forgejo/runner:12.12.0 links: - docker-in-docker - forgejo diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/examples/lxc-systemd/forgejo-runner-service.sh new/forgejo-runner-12.13.2/examples/lxc-systemd/forgejo-runner-service.sh --- old/forgejo-runner-12.12.0/examples/lxc-systemd/forgejo-runner-service.sh 2026-06-20 03:41:19.000000000 +0200 +++ new/forgejo-runner-12.13.2/examples/lxc-systemd/forgejo-runner-service.sh 2026-07-23 16:16:48.000000000 +0200 @@ -22,7 +22,7 @@ : ${INPUTS_LIFETIME:=7d} DEFAULT_LXC_HELPERS_VERSION=1.1.3 # renovate: datasource=forgejo-tags depName=forgejo/lxc-helpers : ${INPUTS_LXC_HELPERS_VERSION:=$DEFAULT_LXC_HELPERS_VERSION} -DEFAULT_RUNNER_VERSION=12.10.2 # renovate: datasource=forgejo-releases depName=forgejo/runner +DEFAULT_RUNNER_VERSION=12.12.0 # renovate: datasource=forgejo-releases depName=forgejo/runner : ${INPUTS_RUNNER_VERSION:=$DEFAULT_RUNNER_VERSION} : ${KILL_AFTER:=21600} # 6h == 21600 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/go.mod new/forgejo-runner-12.13.2/go.mod --- old/forgejo-runner-12.12.0/go.mod 2026-06-20 03:41:19.000000000 +0200 +++ new/forgejo-runner-12.13.2/go.mod 2026-07-23 16:16:48.000000000 +0200 @@ -2,7 +2,7 @@ go 1.25.0 -toolchain go1.25.11 +toolchain go1.25.12 require ( code.forgejo.org/forgejo/actions-proto v0.7.0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/internal/app/cmd/create-runner-file_test.go new/forgejo-runner-12.13.2/internal/app/cmd/create-runner-file_test.go --- old/forgejo-runner-12.12.0/internal/app/cmd/create-runner-file_test.go 2026-06-20 03:41:19.000000000 +0200 +++ new/forgejo-runner-12.13.2/internal/app/cmd/create-runner-file_test.go 2026-07-23 16:16:48.000000000 +0200 @@ -24,7 +24,7 @@ configFile := "config.yml" ctx := context.Background() cmd := createRunnerFileCmd(ctx, &configFile) - output, _, _, err := executeCommand(ctx, t, cmd) + output, _, _, err := executeCommand(ctx, t, cmd, "--connect") assert.ErrorContains(t, err, `required flag(s) "instance", "secret" not set`) assert.Contains(t, output, "Usage:") } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/internal/app/cmd/exec_test.go new/forgejo-runner-12.13.2/internal/app/cmd/exec_test.go --- old/forgejo-runner-12.12.0/internal/app/cmd/exec_test.go 2026-06-20 03:41:19.000000000 +0200 +++ new/forgejo-runner-12.13.2/internal/app/cmd/exec_test.go 2026-07-23 16:16:48.000000000 +0200 @@ -7,13 +7,11 @@ "fmt" "os" "path/filepath" - "runtime" - "slices" "testing" + "code.forgejo.org/forgejo/runner/v12/testutils" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "gotest.tools/v3/skip" ) func TestRunExec(t *testing.T) { @@ -21,7 +19,7 @@ t.Skip("skipping integration test") } - skip.If(t, !slices.Contains([]string{"darwin", "linux", "windows"}, runtime.GOOS), "OS without supported container runtime") + testutils.RequireTestFeatures(t, testutils.TestFeatureDocker) testCases := []struct { name string diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/internal/app/poll/main_test.go new/forgejo-runner-12.13.2/internal/app/poll/main_test.go --- old/forgejo-runner-12.12.0/internal/app/poll/main_test.go 1970-01-01 01:00:00.000000000 +0100 +++ new/forgejo-runner-12.13.2/internal/app/poll/main_test.go 2026-07-23 16:16:48.000000000 +0200 @@ -0,0 +1,8 @@ +// Copyright 2026 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package poll + +import ( + _ "code.forgejo.org/forgejo/runner/v12/testutils" +) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/internal/app/run/main_test.go new/forgejo-runner-12.13.2/internal/app/run/main_test.go --- old/forgejo-runner-12.12.0/internal/app/run/main_test.go 1970-01-01 01:00:00.000000000 +0100 +++ new/forgejo-runner-12.13.2/internal/app/run/main_test.go 2026-07-23 16:16:48.000000000 +0200 @@ -0,0 +1,8 @@ +// Copyright 2026 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package run + +import ( + _ "code.forgejo.org/forgejo/runner/v12/testutils" +) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/internal/app/run/runner_test.go new/forgejo-runner-12.13.2/internal/app/run/runner_test.go --- old/forgejo-runner-12.12.0/internal/app/run/runner_test.go 2026-06-20 03:41:19.000000000 +0200 +++ new/forgejo-runner-12.13.2/internal/app/run/runner_test.go 2026-07-23 16:16:48.000000000 +0200 @@ -6,7 +6,6 @@ "fmt" "net" "os" - "os/exec" "runtime" "slices" "strconv" @@ -19,6 +18,7 @@ "code.forgejo.org/forgejo/runner/v12/internal/pkg/config" "code.forgejo.org/forgejo/runner/v12/internal/pkg/labels" "code.forgejo.org/forgejo/runner/v12/internal/pkg/report" + "code.forgejo.org/forgejo/runner/v12/testutils" "connectrpc.com/connect" gouuid "github.com/google/uuid" log "github.com/sirupsen/logrus" @@ -258,7 +258,7 @@ if testing.Short() { t.Skip("skipping integration test") } - skip.If(t, runtime.GOOS != "linux") // Windows and macOS cannot run linux docker container natively + testutils.RequireTestFeatures(t, testutils.TestFeatureDocker) forgejoClient := &forgejoClientMock{} @@ -476,7 +476,7 @@ if testing.Short() { t.Skip("skipping integration test") } - skip.If(t, runtime.GOOS != "linux") // Windows and macOS cannot run linux docker container natively + testutils.RequireTestFeatures(t, testutils.TestFeatureDocker) testCases := []struct { desc string @@ -581,8 +581,7 @@ if testing.Short() { t.Skip("skipping integration test") } - _, err := exec.LookPath("lxc-create") - skip.If(t, err != nil, "lxc-create is not on PATH") + testutils.RequireTestFeatures(t, testutils.TestFeatureLXC) forgejoClient := &forgejoClientMock{} @@ -874,7 +873,7 @@ if testing.Short() { t.Skip("skipping integration test") } - skip.If(t, runtime.GOOS != "linux") // Windows and macOS cannot run linux docker container natively + testutils.RequireTestFeatures(t, testutils.TestFeatureDocker) forgejoClient := &forgejoClientMock{} @@ -952,7 +951,8 @@ }) t.Run("config.yaml --memory set and within limits", func(t *testing.T) { - skip.If(t, runtime.GOOS != "linux") // Windows and macOS cannot run linux docker container natively + testutils.RequireTestFeatures(t, testutils.TestFeatureDocker) + ctx, cancel := context.WithCancel(t.Context()) defer cancel() @@ -1011,7 +1011,8 @@ }) t.Run("container --memory set and within limits", func(t *testing.T) { - skip.If(t, runtime.GOOS != "linux") // Windows and macOS cannot run linux docker container natively + testutils.RequireTestFeatures(t, testutils.TestFeatureDocker) + ctx, cancel := context.WithCancel(t.Context()) defer cancel() @@ -1035,7 +1036,7 @@ if testing.Short() { t.Skip("skipping integration test") } - skip.If(t, runtime.GOOS != "linux") // linux containers can only run on linux + testutils.RequireTestFeatures(t, testutils.TestFeatureDocker) skip.If(t, runtime.GOARCH != "amd64") // linux/386 images run natively on amd64, no emulation needed forgejoClient := &forgejoClientMock{} @@ -1100,7 +1101,7 @@ if testing.Short() { t.Skip("skipping integration test") } - skip.If(t, runtime.GOOS != "linux") // Windows and macOS cannot run linux docker container natively + testutils.RequireTestFeatures(t, testutils.TestFeatureDocker) forgejoClient := &forgejoClientMock{} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/internal/pkg/config/main_test.go new/forgejo-runner-12.13.2/internal/pkg/config/main_test.go --- old/forgejo-runner-12.12.0/internal/pkg/config/main_test.go 1970-01-01 01:00:00.000000000 +0100 +++ new/forgejo-runner-12.13.2/internal/pkg/config/main_test.go 2026-07-23 16:16:48.000000000 +0200 @@ -0,0 +1,8 @@ +// Copyright 2026 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package config + +import ( + _ "code.forgejo.org/forgejo/runner/v12/testutils" +) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/internal/pkg/labels/main_test.go new/forgejo-runner-12.13.2/internal/pkg/labels/main_test.go --- old/forgejo-runner-12.12.0/internal/pkg/labels/main_test.go 1970-01-01 01:00:00.000000000 +0100 +++ new/forgejo-runner-12.13.2/internal/pkg/labels/main_test.go 2026-07-23 16:16:48.000000000 +0200 @@ -0,0 +1,8 @@ +// Copyright 2026 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package labels + +import ( + _ "code.forgejo.org/forgejo/runner/v12/testutils" +) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/internal/pkg/report/main_test.go new/forgejo-runner-12.13.2/internal/pkg/report/main_test.go --- old/forgejo-runner-12.12.0/internal/pkg/report/main_test.go 1970-01-01 01:00:00.000000000 +0100 +++ new/forgejo-runner-12.13.2/internal/pkg/report/main_test.go 2026-07-23 16:16:48.000000000 +0200 @@ -0,0 +1,8 @@ +// Copyright 2026 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package report + +import ( + _ "code.forgejo.org/forgejo/runner/v12/testutils" +) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.12.0/testutils/test_main.go new/forgejo-runner-12.13.2/testutils/test_main.go --- old/forgejo-runner-12.12.0/testutils/test_main.go 1970-01-01 01:00:00.000000000 +0100 +++ new/forgejo-runner-12.13.2/testutils/test_main.go 2026-07-23 16:16:48.000000000 +0200 @@ -0,0 +1,75 @@ +// Copyright 2026 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package testutils + +import ( + "flag" + "fmt" + "strings" + "testing" +) + +type TestFeature string + +const ( + // TestFeatureDocker enables tests that exercise functionality that requires Docker or Podman. + TestFeatureDocker TestFeature = "docker" + + // TestFeatureLXC enables tests that exercise functionality that requires LXC. + TestFeatureLXC TestFeature = "lxc" +) + +type featureList map[TestFeature]struct{} + +var enabledTestFeatures featureList = map[TestFeature]struct{}{ + TestFeatureDocker: {}, + TestFeatureLXC: {}, +} + +func (f *featureList) String() string { + features := make([]string, 0, len(*f)) + for feature := range *f { + features = append(features, string(feature)) + } + + return strings.Join(features, ",") +} + +func (f *featureList) Set(value string) error { + enabledTestFeatures = map[TestFeature]struct{}{} + + requestedFeatures := strings.Split(value, ",") + for _, requestedFeature := range requestedFeatures { + switch strings.TrimSpace(requestedFeature) { + case string(TestFeatureDocker): + (*f)[TestFeatureDocker] = struct{}{} + case string(TestFeatureLXC): + (*f)[TestFeatureLXC] = struct{}{} + case "-": + for key := range *f { + delete(*f, key) + } + return nil + default: + return fmt.Errorf("unknown feature: %q", value) + } + } + return nil +} + +func init() { + flag.Var(&enabledTestFeatures, "features", + "comma-separated list of feature whose tests should be included, \"-\" for none") +} + +// RequireTestFeatures skips a test if not all the given TestFeature instances are enabled. +func RequireTestFeatures(t *testing.T, requiredFeatures ...TestFeature) { + t.Helper() + + for _, requiredFeature := range requiredFeatures { + if _, exists := enabledTestFeatures[requiredFeature]; !exists { + t.Skipf("Tests of feature %q are disabled", requiredFeature) + } + } +} ++++++ forgejo-runner.obsinfo ++++++ --- /var/tmp/diff_new_pack.qL3Pm7/_old 2026-07-26 11:31:23.520732417 +0200 +++ /var/tmp/diff_new_pack.qL3Pm7/_new 2026-07-26 11:31:23.532732830 +0200 @@ -1,5 +1,5 @@ name: forgejo-runner -version: 12.12.0 -mtime: 1781919679 -commit: 3750ea0ac30fad62105512deded582f58fa0f644 +version: 12.13.2 +mtime: 1784816208 +commit: 4140a19a2e1d1d865bbe5b9e7ee13e00c8c5f6a9 ++++++ vendor.tar.gz ++++++
