diff --git a/dist/helpers/filter-paths.js b/dist/helpers/filter-paths.js index 857ad5f7..255389b9 100644 --- a/dist/helpers/filter-paths.js +++ b/dist/helpers/filter-paths.js @@ -27,36 +27,39 @@ import { var import_micromatch = __toESM(require_micromatch(), 1); class FilterPaths extends HelperInputs { } -var filterPaths = async ({ paths, globs, sha, packages, merge_queue_enabled }) => { +var filterPaths = async ({ paths, globs, sha, packages, merge_queue_enabled, pull_number }) => { if (!paths && !globs && !packages) { error("Must pass `globs` or `paths` or `packages` for filtering"); return false; } - let pull_number; - if (context.eventName === "merge_group") { - pull_number = getPrNumberFromMergeQueueRef(); + let pullNumber; + if (pull_number) { + pullNumber = Number(pull_number); + } else if (context.eventName === "merge_group") { + pullNumber = getPrNumberFromMergeQueueRef(); } else if (sha && merge_queue_enabled === "true") { const branchesResult = sha ? await octokit.repos.listBranchesForHeadCommit({ commit_sha: sha, ...context.repo }) : undefined; const branchName = branchesResult?.data[0]?.name; - pull_number = getPrNumberFromMergeQueueRef(branchName); + pullNumber = getPrNumberFromMergeQueueRef(branchName); } else if (sha) { const listPrsResult = await octokit.repos.listPullRequestsAssociatedWithCommit({ commit_sha: sha, ...context.repo }); const prFromSha = listPrsResult?.data.find(Boolean); - if (!prFromSha) + if (!prFromSha) { throw new Error(`No PR found for commit ${sha}`); - pull_number = prFromSha.number; + } + pullNumber = prFromSha.number; } else { - pull_number = context.issue.number; + pullNumber = context.issue.number; } const { data } = await octokit.pulls.listFiles({ per_page: 100, - pull_number, + pull_number: pullNumber, ...context.repo }); if (packages && hasRelevantPackageChanged(data, packages)) { @@ -87,4 +90,4 @@ export { FilterPaths }; -//# debugId=F57369BFE892E36464756E2164756E21 +//# debugId=974DDF1916D9FA6564756E2164756E21 diff --git a/dist/helpers/filter-paths.js.map b/dist/helpers/filter-paths.js.map index da1006c6..141f05d6 100644 --- a/dist/helpers/filter-paths.js.map +++ b/dist/helpers/filter-paths.js.map @@ -2,9 +2,9 @@ "version": 3, "sources": ["../src/helpers/filter-paths.ts"], "sourcesContent": [ - "/*\nCopyright 2021 Expedia, Inc.\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n https://www.apache.org/licenses/LICENSE-2.0\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport * as core from '@actions/core';\nimport { HelperInputs } from '../types/generated';\nimport { context } from '@actions/github';\nimport micromatch from 'micromatch';\nimport { octokit } from '../octokit';\nimport { getPrNumberFromMergeQueueRef } from '../utils/merge-queue';\nimport { ChangedFilesList } from '../types/github';\n\nexport class FilterPaths extends HelperInputs {\n declare paths?: string;\n declare globs?: string;\n declare sha?: string;\n declare packages?: string;\n declare merge_queue_enabled?: string;\n}\n\nexport const filterPaths = async ({ paths, globs, sha, packages, merge_queue_enabled }: FilterPaths) => {\n if (!paths && !globs && !packages) {\n core.error('Must pass `globs` or `paths` or `packages` for filtering');\n return false;\n }\n\n let pull_number: number;\n if (context.eventName === 'merge_group') {\n pull_number = getPrNumberFromMergeQueueRef();\n } else if (sha && merge_queue_enabled === 'true') {\n const branchesResult = sha\n ? await octokit.repos.listBranchesForHeadCommit({\n commit_sha: sha,\n ...context.repo\n })\n : undefined;\n const branchName = branchesResult?.data[0]?.name;\n pull_number = getPrNumberFromMergeQueueRef(branchName);\n } else if (sha) {\n const listPrsResult = await octokit.repos.listPullRequestsAssociatedWithCommit({\n commit_sha: sha,\n ...context.repo\n });\n const prFromSha = listPrsResult?.data.find(Boolean);\n if (!prFromSha) throw new Error(`No PR found for commit ${sha}`);\n pull_number = prFromSha.number;\n } else {\n pull_number = context.issue.number;\n }\n\n const { data } = await octokit.pulls.listFiles({\n per_page: 100,\n pull_number,\n ...context.repo\n });\n\n if (packages && hasRelevantPackageChanged(data, packages)) {\n return true;\n }\n\n const fileNames = data.map(file => file.filename);\n if (globs) {\n if (paths) core.info('`paths` and `globs` inputs found, defaulting to use `globs` for filtering');\n return micromatch(fileNames, globs.split('\\n')).length > 0;\n } else if (paths) {\n const filePaths = paths.split('\\n');\n return fileNames.some(changedFile => filePaths.some(filePath => changedFile.startsWith(filePath)));\n }\n};\n\nconst hasRelevantPackageChanged = (files: ChangedFilesList, packages: string) => {\n const packageJson = files.find(file => file.filename === 'package.json');\n if (!packageJson) {\n return false;\n }\n\n return packages.split('\\n').some(pkg => new RegExp(`(-|\\\\+)\\\\s*\\\\\"${pkg}\\\\\"`).test(packageJson.patch ?? ''));\n};\n" + "/*\nCopyright 2021 Expedia, Inc.\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n https://www.apache.org/licenses/LICENSE-2.0\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport * as core from '@actions/core';\nimport { HelperInputs } from '../types/generated';\nimport { context } from '@actions/github';\nimport micromatch from 'micromatch';\nimport { octokit } from '../octokit';\nimport { getPrNumberFromMergeQueueRef } from '../utils/merge-queue';\nimport { ChangedFilesList } from '../types/github';\n\nexport class FilterPaths extends HelperInputs {\n declare paths?: string;\n declare globs?: string;\n declare sha?: string;\n declare packages?: string;\n declare merge_queue_enabled?: string;\n declare pull_number?: string;\n}\n\nexport const filterPaths = async ({ paths, globs, sha, packages, merge_queue_enabled, pull_number }: FilterPaths) => {\n if (!paths && !globs && !packages) {\n core.error('Must pass `globs` or `paths` or `packages` for filtering');\n return false;\n }\n\n let pullNumber: number;\n\n if (pull_number) {\n pullNumber = Number(pull_number);\n } else if (context.eventName === 'merge_group') {\n pullNumber = getPrNumberFromMergeQueueRef();\n } else if (sha && merge_queue_enabled === 'true') {\n const branchesResult = sha\n ? await octokit.repos.listBranchesForHeadCommit({\n commit_sha: sha,\n ...context.repo\n })\n : undefined;\n const branchName = branchesResult?.data[0]?.name;\n\n pullNumber = getPrNumberFromMergeQueueRef(branchName);\n } else if (sha) {\n const listPrsResult = await octokit.repos.listPullRequestsAssociatedWithCommit({\n commit_sha: sha,\n ...context.repo\n });\n\n const prFromSha = listPrsResult?.data.find(Boolean);\n if (!prFromSha) {\n throw new Error(`No PR found for commit ${sha}`);\n }\n\n pullNumber = prFromSha.number;\n } else {\n pullNumber = context.issue.number;\n }\n\n const { data } = await octokit.pulls.listFiles({\n per_page: 100,\n pull_number: pullNumber,\n ...context.repo\n });\n\n if (packages && hasRelevantPackageChanged(data, packages)) {\n return true;\n }\n\n const fileNames = data.map(file => file.filename);\n if (globs) {\n if (paths) core.info('`paths` and `globs` inputs found, defaulting to use `globs` for filtering');\n return micromatch(fileNames, globs.split('\\n')).length > 0;\n } else if (paths) {\n const filePaths = paths.split('\\n');\n return fileNames.some(changedFile => filePaths.some(filePath => changedFile.startsWith(filePath)));\n }\n};\n\nconst hasRelevantPackageChanged = (files: ChangedFilesList, packages: string) => {\n const packageJson = files.find(file => file.filename === 'package.json');\n if (!packageJson) {\n return false;\n }\n\n return packages.split('\\n').some(pkg => new RegExp(`(-|\\\\+)\\\\s*\\\\\"${pkg}\\\\\"`).test(packageJson.patch ?? ''));\n};\n" ], - "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;AAgBA;AAKO,MAAM,oBAAoB,aAAa;AAM9C;AAEO,IAAM,cAAc,SAAS,OAAO,OAAO,KAAK,UAAU,0BAAuC;AAAA,EACtG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,UAAU;AAAA,IAC5B,MAAM,0DAA0D;AAAA,IACrE,OAAO;AAAA,EACT;AAAA,EAEA,IAAI;AAAA,EACJ,IAAI,QAAQ,cAAc,eAAe;AAAA,IACvC,cAAc,6BAA6B;AAAA,EAC7C,EAAO,SAAI,OAAO,wBAAwB,QAAQ;AAAA,IAChD,MAAM,iBAAiB,MACnB,MAAM,QAAQ,MAAM,0BAA0B;AAAA,MAC5C,YAAY;AAAA,SACT,QAAQ;AAAA,IACb,CAAC,IACD;AAAA,IACJ,MAAM,aAAa,gBAAgB,KAAK,IAAI;AAAA,IAC5C,cAAc,6BAA6B,UAAU;AAAA,EACvD,EAAO,SAAI,KAAK;AAAA,IACd,MAAM,gBAAgB,MAAM,QAAQ,MAAM,qCAAqC;AAAA,MAC7E,YAAY;AAAA,SACT,QAAQ;AAAA,IACb,CAAC;AAAA,IACD,MAAM,YAAY,eAAe,KAAK,KAAK,OAAO;AAAA,IAClD,IAAI,CAAC;AAAA,MAAW,MAAM,IAAI,MAAM,0BAA0B,KAAK;AAAA,IAC/D,cAAc,UAAU;AAAA,EAC1B,EAAO;AAAA,IACL,cAAc,QAAQ,MAAM;AAAA;AAAA,EAG9B,QAAQ,SAAS,MAAM,QAAQ,MAAM,UAAU;AAAA,IAC7C,UAAU;AAAA,IACV;AAAA,OACG,QAAQ;AAAA,EACb,CAAC;AAAA,EAED,IAAI,YAAY,0BAA0B,MAAM,QAAQ,GAAG;AAAA,IACzD,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,YAAY,KAAK,IAAI,UAAQ,KAAK,QAAQ;AAAA,EAChD,IAAI,OAAO;AAAA,IACT,IAAI;AAAA,MAAY,KAAK,2EAA2E;AAAA,IAChG,OAAO,0BAAW,WAAW,MAAM,MAAM;AAAA,CAAI,CAAC,EAAE,SAAS;AAAA,EAC3D,EAAO,SAAI,OAAO;AAAA,IAChB,MAAM,YAAY,MAAM,MAAM;AAAA,CAAI;AAAA,IAClC,OAAO,UAAU,KAAK,iBAAe,UAAU,KAAK,cAAY,YAAY,WAAW,QAAQ,CAAC,CAAC;AAAA,EACnG;AAAA;AAGF,IAAM,4BAA4B,CAAC,OAAyB,aAAqB;AAAA,EAC/E,MAAM,cAAc,MAAM,KAAK,UAAQ,KAAK,aAAa,cAAc;AAAA,EACvE,IAAI,CAAC,aAAa;AAAA,IAChB,OAAO;AAAA,EACT;AAAA,EAEA,OAAO,SAAS,MAAM;AAAA,CAAI,EAAE,KAAK,SAAO,IAAI,OAAO,iBAAiB,QAAQ,EAAE,KAAK,YAAY,SAAS,EAAE,CAAC;AAAA;", - "debugId": "F57369BFE892E36464756E2164756E21", + "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;AAgBA;AAKO,MAAM,oBAAoB,aAAa;AAO9C;AAEO,IAAM,cAAc,SAAS,OAAO,OAAO,KAAK,UAAU,qBAAqB,kBAA+B;AAAA,EACnH,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,UAAU;AAAA,IAC5B,MAAM,0DAA0D;AAAA,IACrE,OAAO;AAAA,EACT;AAAA,EAEA,IAAI;AAAA,EAEJ,IAAI,aAAa;AAAA,IACf,aAAa,OAAO,WAAW;AAAA,EACjC,EAAO,SAAI,QAAQ,cAAc,eAAe;AAAA,IAC9C,aAAa,6BAA6B;AAAA,EAC5C,EAAO,SAAI,OAAO,wBAAwB,QAAQ;AAAA,IAChD,MAAM,iBAAiB,MACnB,MAAM,QAAQ,MAAM,0BAA0B;AAAA,MAC5C,YAAY;AAAA,SACT,QAAQ;AAAA,IACb,CAAC,IACD;AAAA,IACJ,MAAM,aAAa,gBAAgB,KAAK,IAAI;AAAA,IAE5C,aAAa,6BAA6B,UAAU;AAAA,EACtD,EAAO,SAAI,KAAK;AAAA,IACd,MAAM,gBAAgB,MAAM,QAAQ,MAAM,qCAAqC;AAAA,MAC7E,YAAY;AAAA,SACT,QAAQ;AAAA,IACb,CAAC;AAAA,IAED,MAAM,YAAY,eAAe,KAAK,KAAK,OAAO;AAAA,IAClD,IAAI,CAAC,WAAW;AAAA,MACd,MAAM,IAAI,MAAM,0BAA0B,KAAK;AAAA,IACjD;AAAA,IAEA,aAAa,UAAU;AAAA,EACzB,EAAO;AAAA,IACL,aAAa,QAAQ,MAAM;AAAA;AAAA,EAG7B,QAAQ,SAAS,MAAM,QAAQ,MAAM,UAAU;AAAA,IAC7C,UAAU;AAAA,IACV,aAAa;AAAA,OACV,QAAQ;AAAA,EACb,CAAC;AAAA,EAED,IAAI,YAAY,0BAA0B,MAAM,QAAQ,GAAG;AAAA,IACzD,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,YAAY,KAAK,IAAI,UAAQ,KAAK,QAAQ;AAAA,EAChD,IAAI,OAAO;AAAA,IACT,IAAI;AAAA,MAAY,KAAK,2EAA2E;AAAA,IAChG,OAAO,0BAAW,WAAW,MAAM,MAAM;AAAA,CAAI,CAAC,EAAE,SAAS;AAAA,EAC3D,EAAO,SAAI,OAAO;AAAA,IAChB,MAAM,YAAY,MAAM,MAAM;AAAA,CAAI;AAAA,IAClC,OAAO,UAAU,KAAK,iBAAe,UAAU,KAAK,cAAY,YAAY,WAAW,QAAQ,CAAC,CAAC;AAAA,EACnG;AAAA;AAGF,IAAM,4BAA4B,CAAC,OAAyB,aAAqB;AAAA,EAC/E,MAAM,cAAc,MAAM,KAAK,UAAQ,KAAK,aAAa,cAAc;AAAA,EACvE,IAAI,CAAC,aAAa;AAAA,IAChB,OAAO;AAAA,EACT;AAAA,EAEA,OAAO,SAAS,MAAM;AAAA,CAAI,EAAE,KAAK,SAAO,IAAI,OAAO,iBAAiB,QAAQ,EAAE,KAAK,YAAY,SAAS,EAAE,CAAC;AAAA;", + "debugId": "974DDF1916D9FA6564756E2164756E21", "names": [] } \ No newline at end of file diff --git a/src/helpers/filter-paths.ts b/src/helpers/filter-paths.ts index ce59eb23..c99ee18a 100644 --- a/src/helpers/filter-paths.ts +++ b/src/helpers/filter-paths.ts @@ -25,17 +25,21 @@ export class FilterPaths extends HelperInputs { declare sha?: string; declare packages?: string; declare merge_queue_enabled?: string; + declare pull_number?: string; } -export const filterPaths = async ({ paths, globs, sha, packages, merge_queue_enabled }: FilterPaths) => { +export const filterPaths = async ({ paths, globs, sha, packages, merge_queue_enabled, pull_number }: FilterPaths) => { if (!paths && !globs && !packages) { core.error('Must pass `globs` or `paths` or `packages` for filtering'); return false; } - let pull_number: number; - if (context.eventName === 'merge_group') { - pull_number = getPrNumberFromMergeQueueRef(); + let pullNumber: number; + + if (pull_number) { + pullNumber = Number(pull_number); + } else if (context.eventName === 'merge_group') { + pullNumber = getPrNumberFromMergeQueueRef(); } else if (sha && merge_queue_enabled === 'true') { const branchesResult = sha ? await octokit.repos.listBranchesForHeadCommit({ @@ -44,22 +48,27 @@ export const filterPaths = async ({ paths, globs, sha, packages, merge_queue_ena }) : undefined; const branchName = branchesResult?.data[0]?.name; - pull_number = getPrNumberFromMergeQueueRef(branchName); + + pullNumber = getPrNumberFromMergeQueueRef(branchName); } else if (sha) { const listPrsResult = await octokit.repos.listPullRequestsAssociatedWithCommit({ commit_sha: sha, ...context.repo }); + const prFromSha = listPrsResult?.data.find(Boolean); - if (!prFromSha) throw new Error(`No PR found for commit ${sha}`); - pull_number = prFromSha.number; + if (!prFromSha) { + throw new Error(`No PR found for commit ${sha}`); + } + + pullNumber = prFromSha.number; } else { - pull_number = context.issue.number; + pullNumber = context.issue.number; } const { data } = await octokit.pulls.listFiles({ per_page: 100, - pull_number, + pull_number: pullNumber, ...context.repo }); diff --git a/test/helpers/filter-paths.test.ts b/test/helpers/filter-paths.test.ts index 9ad1f909..c1fbcd93 100644 --- a/test/helpers/filter-paths.test.ts +++ b/test/helpers/filter-paths.test.ts @@ -242,6 +242,51 @@ describe('filterPaths', () => { expect(octokit.repos.listPullRequestsAssociatedWithCommit).not.toHaveBeenCalled(); }); + it('should use pull_number input over merge queue pull number', async () => { + context.eventName = 'merge_group'; + context.ref = 'refs/heads/gh-readonly-queue/default-branch/pr-12345-f0d9a4cb862b13cdaab6522f72d6dc17e4336b7f'; + + await filterPaths({ + paths, + pull_number: '456' + }); + + expect(octokit.pulls.listFiles).toHaveBeenCalledWith({ + per_page: 100, + pull_number: 456, + ...context.repo + }); + }); + + it('should use pull_number input over sha-derived pull number', async () => { + await filterPaths({ + paths, + sha: 'sha', + pull_number: '456' + }); + + expect(octokit.pulls.listFiles).toHaveBeenCalledWith({ + per_page: 100, + pull_number: 456, + ...context.repo + }); + expect(octokit.repos.listPullRequestsAssociatedWithCommit).not.toHaveBeenCalled(); + }); + + it('should pass NaN pull number when pull_number input is non-numeric', async () => { + await filterPaths({ + paths, + pull_number: 'not-a-number' + }); + + expect(octokit.pulls.listFiles).toHaveBeenCalledWith({ + per_page: 100, + pull_number: Number.NaN, + ...context.repo + }); + expect(octokit.repos.listPullRequestsAssociatedWithCommit).not.toHaveBeenCalled(); + }); + it('should return false when no filtering params are passed', async () => { const result = await filterPaths({});