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 {