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 ++++++

Reply via email to