diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 92ccaae..3cb1656 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -10,10 +10,10 @@ jobs:
build:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
- - uses: actions/setup-node@v4
+ - uses: actions/checkout@v6
+ - uses: actions/setup-node@v6
with:
- node-version: 20
+ node-version: 24
cache: 'npm'
- run: |
npm install
@@ -22,7 +22,7 @@ jobs:
self-test:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v6
- uses: ./
id: filter
with:
diff --git a/.github/workflows/pull-request-verification.yml b/.github/workflows/pull-request-verification.yml
index fea75cc..45f4dcb 100644
--- a/.github/workflows/pull-request-verification.yml
+++ b/.github/workflows/pull-request-verification.yml
@@ -10,21 +10,28 @@ jobs:
build:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
- - uses: actions/setup-node@v4
+ - uses: actions/checkout@v6
+ - uses: actions/setup-node@v6
with:
- node-version: 20
+ node-version: 24
cache: 'npm'
- run: |
npm install
npm run all
+ - name: Check dist is up to date
+ run: |
+ if [ -n "$(git diff --name-only dist/)" ]; then
+ echo "::error::dist/index.js is out of date. Run 'npm run all' and commit the result."
+ git diff --stat dist/
+ exit 1
+ fi
test-inline:
runs-on: ubuntu-latest
permissions:
pull-requests: read
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v6
- uses: ./
id: filter
with:
@@ -45,7 +52,7 @@ jobs:
permissions:
pull-requests: read
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v6
- uses: ./
id: filter
with:
@@ -57,7 +64,7 @@ jobs:
test-without-token:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v6
- uses: ./
id: filter
with:
@@ -70,7 +77,7 @@ jobs:
test-wd-without-token:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v6
with:
path: somewhere
- uses: ./somewhere
@@ -86,7 +93,7 @@ jobs:
test-local-changes:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v6
- run: echo "NEW FILE" > local
- run: git add local
- uses: ./
@@ -106,7 +113,7 @@ jobs:
test-change-type:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v6
- name: configure GIT user
run: git config user.email "john@nowhere.local" && git config user.name "John Doe"
- name: modify working tree
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7f3a7af..c0e11e8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,11 @@
# Changelog
+## v4.0.0
+- [Update action runtime to node24](https://github.com/dorny/paths-filter/pull/294)
+
+## v3.0.3
+- [Add missing predicate-quantifier](https://github.com/dorny/paths-filter/pull/279)
+
## v3.0.2
- [Add config parameter for predicate quantifier](https://github.com/dorny/paths-filter/pull/224)
diff --git a/README.md b/README.md
index b5e0f4c..a4b1035 100644
--- a/README.md
+++ b/README.md
@@ -27,6 +27,11 @@ don't allow this because they don't work on a level of individual jobs or steps.
- The `base` input parameter must not be the same as the branch that triggered the workflow
- Changes are detected against the merge-base with the configured base branch or the default branch
- Uses git commands to detect changes - repository must be already [checked out](https://github.com/actions/checkout)
+- **[Merge queue](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/configuring-pull-request-merges/managing-a-merge-queue):**
+ - Workflow triggered by **[merge_group](https://docs.github.com/en/actions/reference/events-that-trigger-workflows#merge_group)**
+ - The `base` and `ref` input parameters default to commit hashes from the event
+ unless explicitly specified.
+ - Uses git commands to detect changes - repository must be already [checked out](https://github.com/actions/checkout)
- **Master, Release, or other long-lived branches:**
- Workflow triggered by **[push](https://docs.github.com/en/actions/reference/events-that-trigger-workflows#push)** event
when `base` input parameter is the same as the branch that triggered the workflow:
@@ -46,7 +51,7 @@ don't allow this because they don't work on a level of individual jobs or steps.
## Example
```yaml
-- uses: dorny/paths-filter@v3
+- uses: dorny/paths-filter@v4
id: changes
with:
filters: |
@@ -72,7 +77,7 @@ For more scenarios see [examples](#examples) section.
## What's New
-- New major release `v3` after update to Node 20 [Breaking change]
+- New major release `v4` after update to Node 24 [Breaking change]
- Add `ref` input parameter
- Add `list-files: csv` format
- Configure matrix job to run for each folder with changes using `changes` output
@@ -84,7 +89,7 @@ For more information, see [CHANGELOG](https://github.com/dorny/paths-filter/blob
## Usage
```yaml
-- uses: dorny/paths-filter@v3
+- uses: dorny/paths-filter@v4
with:
# Defines filters applied to detected changed files.
# Each filter has a name and a list of rules.
@@ -104,6 +109,8 @@ For more information, see [CHANGELOG](https://github.com/dorny/paths-filter/blob
# Branch, tag, or commit SHA against which the changes will be detected.
# If it references the same branch it was pushed to,
# changes are detected against the most recent commit before the push.
+ # If it is empty and action is triggered by merge_group event,
+ # the base commit in the event will be used.
# Otherwise, it uses git merge-base to find the best common ancestor between
# current branch (HEAD) and base.
# When merge-base is found, it's used for change detection - only changes
@@ -117,6 +124,8 @@ For more information, see [CHANGELOG](https://github.com/dorny/paths-filter/blob
# Git reference (e.g. branch name) from which the changes will be detected.
# Useful when workflow can be triggered only on the default branch (e.g. repository_dispatch event)
# but you want to get changes on a different branch.
+ # If this is empty and action is triggered by merge_group event,
+ # the head commit in the event will be used.
# This option is ignored if action is triggered by pull_request event.
# default: ${{ github.ref }}
ref:
@@ -154,14 +163,14 @@ For more information, see [CHANGELOG](https://github.com/dorny/paths-filter/blob
# Default: ${{ github.token }}
token: ''
- # Optional parameter to override the default behavior of file matching algorithm.
+ # Optional parameter to override the default behavior of file matching algorithm.
# By default files that match at least one pattern defined by the filters will be included.
# This parameter allows to override the "at least one pattern" behavior to make it so that
- # all of the patterns have to match or otherwise the file is excluded.
- # An example scenario where this is useful if you would like to match all
- # .ts files in a sub-directory but not .md files.
- # The filters below will match markdown files despite the exclusion syntax UNLESS
- # you specify 'every' as the predicate-quantifier parameter. When you do that,
+ # all of the patterns have to match or otherwise the file is excluded.
+ # An example scenario where this is useful if you would like to match all
+ # .ts files in a sub-directory but not .md files.
+ # The filters below will match markdown files despite the exclusion syntax UNLESS
+ # you specify 'every' as the predicate-quantifier parameter. When you do that,
# it will only match the .ts files in the subdirectory as expected.
#
# backend:
@@ -192,8 +201,8 @@ jobs:
tests:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
- - uses: dorny/paths-filter@v3
+ - uses: actions/checkout@v6
+ - uses: dorny/paths-filter@v4
id: filter
with:
filters: |
@@ -237,7 +246,7 @@ jobs:
frontend: ${{ steps.filter.outputs.frontend }}
steps:
# For pull requests it's not necessary to checkout the code
- - uses: dorny/paths-filter@v3
+ - uses: dorny/paths-filter@v4
id: filter
with:
filters: |
@@ -252,7 +261,7 @@ jobs:
if: ${{ needs.changes.outputs.backend == 'true' }}
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v6
- ...
# JOB to build and test frontend code
@@ -261,7 +270,7 @@ jobs:
if: ${{ needs.changes.outputs.frontend == 'true' }}
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v6
- ...
```
@@ -283,7 +292,7 @@ jobs:
packages: ${{ steps.filter.outputs.changes }}
steps:
# For pull requests it's not necessary to checkout the code
- - uses: dorny/paths-filter@v3
+ - uses: dorny/paths-filter@v4
id: filter
with:
filters: |
@@ -300,7 +309,7 @@ jobs:
package: ${{ fromJSON(needs.changes.outputs.packages) }}
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v6
- ...
```
@@ -317,6 +326,12 @@ on:
branches: # PRs to the following branches will trigger the workflow
- master
- develop
+ # Optionally you can use the action in the merge queue
+ # if your repository enables the feature.
+ merge_group:
+ branches:
+ - master
+ - develop
jobs:
build:
runs-on: ubuntu-latest
@@ -324,8 +339,8 @@ jobs:
permissions:
pull-requests: read
steps:
- - uses: actions/checkout@v4
- - uses: dorny/paths-filter@v3
+ - uses: actions/checkout@v6
+ - uses: dorny/paths-filter@v4
id: filter
with:
filters: ... # Configure your filters
@@ -345,12 +360,12 @@ jobs:
build:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v6
with:
# This may save additional git fetch roundtrip if
# merge-base is found within latest 20 commits
fetch-depth: 20
- - uses: dorny/paths-filter@v3
+ - uses: dorny/paths-filter@v4
id: filter
with:
base: develop # Change detection against merge-base with this branch
@@ -373,8 +388,8 @@ jobs:
build:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
- - uses: dorny/paths-filter@v3
+ - uses: actions/checkout@v6
+ - uses: dorny/paths-filter@v4
id: filter
with:
# Use context to get the branch where commits were pushed.
@@ -401,14 +416,14 @@ jobs:
build:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v6
# Some action that modifies files tracked by git (e.g. code linter)
- uses: johndoe/some-action@v1
# Filter to detect which files were modified
# Changes could be, for example, automatically committed
- - uses: dorny/paths-filter@v3
+ - uses: dorny/paths-filter@v4
id: filter
with:
base: HEAD
@@ -423,7 +438,7 @@ jobs:
Define filter rules in own file
```yaml
-- uses: dorny/paths-filter@v3
+- uses: dorny/paths-filter@v4
id: filter
with:
# Path to file where filters are defined
@@ -436,7 +451,7 @@ jobs:
Use YAML anchors to reuse path expression(s) inside another rule
```yaml
-- uses: dorny/paths-filter@v3
+- uses: dorny/paths-filter@v4
id: filter
with:
# &shared is YAML anchor,
@@ -457,7 +472,7 @@ jobs:
Consider if file was added, modified or deleted
```yaml
-- uses: dorny/paths-filter@v3
+- uses: dorny/paths-filter@v4
id: filter
with:
# Changed file can be 'added', 'modified', or 'deleted'.
@@ -483,7 +498,7 @@ jobs:
Detect changes in folder only for some file extensions
```yaml
-- uses: dorny/paths-filter@v3
+- uses: dorny/paths-filter@v4
id: filter
with:
# This makes it so that all the patterns have to match a file for it to be
@@ -511,7 +526,7 @@ jobs:
Passing list of modified files as command line args in Linux shell
```yaml
-- uses: dorny/paths-filter@v3
+- uses: dorny/paths-filter@v4
id: filter
with:
# Enable listing of files matching each filter.
@@ -537,7 +552,7 @@ jobs:
Passing list of modified files as JSON array to another action
```yaml
-- uses: dorny/paths-filter@v3
+- uses: dorny/paths-filter@v4
id: filter
with:
# Enable listing of files matching each filter.
diff --git a/action.yml b/action.yml
index e7d24f5..914524f 100644
--- a/action.yml
+++ b/action.yml
@@ -44,11 +44,16 @@ inputs:
This option takes effect only when changes are detected using git against different base branch.
required: false
default: '100'
+ predicate-quantifier:
+ description: |
+ allows to override the "at least one pattern" behavior to make it so that all of the patterns have to match or otherwise the file is excluded.
+ required: false
+ default: 'some'
outputs:
changes:
description: JSON array with names of all filters matching any of changed files
runs:
- using: 'node20'
+ using: 'node24'
main: 'dist/index.js'
branding:
color: blue
diff --git a/dist/index.js b/dist/index.js
index cc7d7d4..4d82840 100644
--- a/dist/index.js
+++ b/dist/index.js
@@ -617,33 +617,49 @@ async function getChangedFiles(token, base, ref, initialFetchDepth) {
}
return await git.getChangesOnHead();
}
- const prEvents = ['pull_request', 'pull_request_review', 'pull_request_review_comment', 'pull_request_target'];
- if (prEvents.includes(github.context.eventName)) {
- if (ref) {
- core.warning(`'ref' input parameter is ignored when 'base' is set to HEAD`);
+ switch (github.context.eventName) {
+ // To keep backward compatibility, commits in GitHub pull request event
+ // take precedence over manual inputs.
+ case 'pull_request':
+ case 'pull_request_review':
+ case 'pull_request_review_comment':
+ case 'pull_request_target': {
+ if (ref) {
+ core.warning(`'ref' input parameter is ignored when action is triggered by pull request event`);
+ }
+ if (base) {
+ core.warning(`'base' input parameter is ignored when action is triggered by pull request event`);
+ }
+ const pr = github.context.payload.pull_request;
+ if (token) {
+ return await getChangedFilesFromApi(token, pr);
+ }
+ if (github.context.eventName === 'pull_request_target') {
+ // pull_request_target is executed in context of base branch and GITHUB_SHA points to last commit in base branch
+ // Therefore it's not possible to look at changes in last commit
+ // At the same time we don't want to fetch any code from forked repository
+ throw new Error(`'token' input parameter is required if action is triggered by 'pull_request_target' event`);
+ }
+ core.info('Github token is not available - changes will be detected using git diff');
+ const baseSha = (_a = github.context.payload.pull_request) === null || _a === void 0 ? void 0 : _a.base.sha;
+ const defaultBranch = (_b = github.context.payload.repository) === null || _b === void 0 ? void 0 : _b.default_branch;
+ const currentRef = await git.getCurrentRef();
+ return await git.getChanges(base || baseSha || defaultBranch, currentRef);
}
- if (base) {
- core.warning(`'base' input parameter is ignored when action is triggered by pull request event`);
+ // To keep backward compatibility, manual inputs take precedence over
+ // commits in GitHub merge queue event.
+ case 'merge_group': {
+ const mergeGroup = github.context.payload;
+ if (!base) {
+ base = mergeGroup.merge_group.base_sha;
+ }
+ if (!ref) {
+ ref = mergeGroup.merge_group.head_sha;
+ }
+ break;
}
- const pr = github.context.payload.pull_request;
- if (token) {
- return await getChangedFilesFromApi(token, pr);
- }
- if (github.context.eventName === 'pull_request_target') {
- // pull_request_target is executed in context of base branch and GITHUB_SHA points to last commit in base branch
- // Therefor it's not possible to look at changes in last commit
- // At the same time we don't want to fetch any code from forked repository
- throw new Error(`'token' input parameter is required if action is triggered by 'pull_request_target' event`);
- }
- core.info('Github token is not available - changes will be detected using git diff');
- const baseSha = (_a = github.context.payload.pull_request) === null || _a === void 0 ? void 0 : _a.base.sha;
- const defaultBranch = (_b = github.context.payload.repository) === null || _b === void 0 ? void 0 : _b.default_branch;
- const currentRef = await git.getCurrentRef();
- return await git.getChanges(base || baseSha || defaultBranch, currentRef);
- }
- else {
- return getChangedFilesFromGit(base, ref, initialFetchDepth);
}
+ return getChangedFilesFromGit(base, ref, initialFetchDepth);
}
async function getChangedFilesFromGit(base, head, initialFetchDepth) {
var _a;
diff --git a/package-lock.json b/package-lock.json
index d1a475f..d26a673 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -18,7 +18,7 @@
"@octokit/webhooks-types": "^7.3.1",
"@types/jest": "^29.5.11",
"@types/js-yaml": "^4.0.9",
- "@types/node": "^20.11.6",
+ "@types/node": "^24.0.0",
"@types/picomatch": "^2.3.3",
"@typescript-eslint/eslint-plugin": "^6.19.1",
"@typescript-eslint/parser": "^6.19.1",
@@ -34,7 +34,7 @@
"typescript": "^5.3.3"
},
"engines": {
- "node": ">= 20"
+ "node": ">= 24"
}
},
"node_modules/@aashutoshrathi/word-wrap": {
@@ -199,6 +199,7 @@
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz",
"integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==",
"dev": true,
+ "peer": true,
"dependencies": {
"@ampproject/remapping": "^2.2.0",
"@babel/code-frame": "^7.23.5",
@@ -1390,6 +1391,7 @@
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.1.0.tgz",
"integrity": "sha512-BDa2VAMLSh3otEiaMJ/3Y36GU4qf6GI+VivQ/P41NC6GHcdxpKlqV0ikSZ5gdQsmS3ojXeRx5vasgNTinF0Q4g==",
+ "peer": true,
"dependencies": {
"@octokit/auth-token": "^4.0.0",
"@octokit/graphql": "^7.0.0",
@@ -1641,12 +1643,13 @@
"dev": true
},
"node_modules/@types/node": {
- "version": "20.11.6",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.6.tgz",
- "integrity": "sha512-+EOokTnksGVgip2PbYbr3xnR7kZigh4LbybAfBAw5BpnQ+FqBYUsvCEjYd70IXKlbohQ64mzEYmMtlWUY8q//Q==",
+ "version": "24.12.0",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.0.tgz",
+ "integrity": "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "undici-types": "~5.26.4"
+ "undici-types": "~7.16.0"
}
},
"node_modules/@types/picomatch": {
@@ -1892,6 +1895,7 @@
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
"integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
"dev": true,
+ "peer": true,
"bin": {
"acorn": "bin/acorn"
},
@@ -2332,6 +2336,7 @@
"url": "https://github.com/sponsors/ai"
}
],
+ "peer": true,
"dependencies": {
"caniuse-lite": "^1.0.30001565",
"electron-to-chromium": "^1.4.601",
@@ -2878,6 +2883,7 @@
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz",
"integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==",
"dev": true,
+ "peer": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.6.1",
@@ -2933,6 +2939,7 @@
"resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz",
"integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==",
"dev": true,
+ "peer": true,
"bin": {
"eslint-config-prettier": "bin/cli.js"
},
@@ -3107,6 +3114,7 @@
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.4.tgz",
"integrity": "sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==",
"dev": true,
+ "peer": true,
"bin": {
"prettier": "bin/prettier.cjs"
},
@@ -4614,6 +4622,7 @@
"resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz",
"integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==",
"dev": true,
+ "peer": true,
"dependencies": {
"@jest/core": "^29.7.0",
"@jest/types": "^29.6.3",
@@ -6789,6 +6798,7 @@
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz",
"integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==",
"dev": true,
+ "peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -6824,10 +6834,11 @@
}
},
"node_modules/undici-types": {
- "version": "5.26.5",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
- "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
- "dev": true
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
+ "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/universal-user-agent": {
"version": "6.0.1",
diff --git a/package.json b/package.json
index efc2691..a50dd9b 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,7 @@
"name": "paths-filter",
"version": "1.0.0",
"engines": {
- "node": ">= 20"
+ "node": ">= 24"
},
"private": true,
"description": "Execute your workflow steps only if relevant files are modified.",
@@ -37,7 +37,7 @@
"@octokit/webhooks-types": "^7.3.1",
"@types/jest": "^29.5.11",
"@types/js-yaml": "^4.0.9",
- "@types/node": "^20.11.6",
+ "@types/node": "^24.0.0",
"@types/picomatch": "^2.3.3",
"@typescript-eslint/eslint-plugin": "^6.19.1",
"@typescript-eslint/parser": "^6.19.1",
diff --git a/src/main.ts b/src/main.ts
index 8516b0b..6a5fab2 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -2,7 +2,7 @@ import * as fs from 'fs'
import * as core from '@actions/core'
import * as github from '@actions/github'
import {GetResponseDataTypeFromEndpointMethod} from '@octokit/types'
-import {PushEvent, PullRequestEvent} from '@octokit/webhooks-types'
+import {MergeGroupEvent, PullRequest, PushEvent} from '@octokit/webhooks-types'
import {
isPredicateQuantifier,
@@ -84,32 +84,50 @@ async function getChangedFiles(token: string, base: string, ref: string, initial
return await git.getChangesOnHead()
}
- const prEvents = ['pull_request', 'pull_request_review', 'pull_request_review_comment', 'pull_request_target']
- if (prEvents.includes(github.context.eventName)) {
- if (ref) {
- core.warning(`'ref' input parameter is ignored when 'base' is set to HEAD`)
+ switch (github.context.eventName) {
+ // To keep backward compatibility, commits in GitHub pull request event
+ // take precedence over manual inputs.
+ case 'pull_request':
+ case 'pull_request_review':
+ case 'pull_request_review_comment':
+ case 'pull_request_target': {
+ if (ref) {
+ core.warning(`'ref' input parameter is ignored when action is triggered by pull request event`)
+ }
+ if (base) {
+ core.warning(`'base' input parameter is ignored when action is triggered by pull request event`)
+ }
+ const pr = github.context.payload.pull_request as PullRequest
+ if (token) {
+ return await getChangedFilesFromApi(token, pr)
+ }
+ if (github.context.eventName === 'pull_request_target') {
+ // pull_request_target is executed in context of base branch and GITHUB_SHA points to last commit in base branch
+ // Therefore it's not possible to look at changes in last commit
+ // At the same time we don't want to fetch any code from forked repository
+ throw new Error(`'token' input parameter is required if action is triggered by 'pull_request_target' event`)
+ }
+ core.info('GitHub token is not available - changes will be detected using git diff')
+ const baseSha = github.context.payload.pull_request?.base.sha
+ const defaultBranch = github.context.payload.repository?.default_branch
+ const currentRef = await git.getCurrentRef()
+ return await git.getChanges(base || baseSha || defaultBranch, currentRef)
}
- if (base) {
- core.warning(`'base' input parameter is ignored when action is triggered by pull request event`)
+ // To keep backward compatibility, manual inputs take precedence over
+ // commits in GitHub merge queue event.
+ case 'merge_group': {
+ const mergeGroup = github.context.payload as MergeGroupEvent
+ if (!base) {
+ base = mergeGroup.merge_group.base_sha
+ }
+ if (!ref) {
+ ref = mergeGroup.merge_group.head_sha
+ }
+ break
}
- const pr = github.context.payload.pull_request as PullRequestEvent
- if (token) {
- return await getChangedFilesFromApi(token, pr)
- }
- if (github.context.eventName === 'pull_request_target') {
- // pull_request_target is executed in context of base branch and GITHUB_SHA points to last commit in base branch
- // Therefor it's not possible to look at changes in last commit
- // At the same time we don't want to fetch any code from forked repository
- throw new Error(`'token' input parameter is required if action is triggered by 'pull_request_target' event`)
- }
- core.info('GitHub token is not available - changes will be detected using git diff')
- const baseSha = github.context.payload.pull_request?.base.sha
- const defaultBranch = github.context.payload.repository?.default_branch
- const currentRef = await git.getCurrentRef()
- return await git.getChanges(base || baseSha || defaultBranch, currentRef)
- } else {
- return getChangedFilesFromGit(base, ref, initialFetchDepth)
}
+
+ return getChangedFilesFromGit(base, ref, initialFetchDepth)
}
async function getChangedFilesFromGit(base: string, head: string, initialFetchDepth: number): Promise {