diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3a8b44fc..d2f7e8a5 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -682,6 +682,27 @@ jobs: echo "${{ toJSON(steps.changed-files.outputs) }}" shell: bash + + - name: Run changed-files excluding submodule + id: changed-files-exclude-submodule + uses: ./ + with: + base_sha: "85bd869" + sha: "adde7bb" + fetch_depth: 60000 + exclude_submodules: true + + - name: Verify no added files + if: steps.changed-files-exclude-submodule.outputs.added_files != '' + run: | + echo "Expected: ('') got ${{ steps.changed-files-exclude-submodule.outputs.added_files }}" + exit 1 + + - name: Show output + run: | + echo "${{ toJSON(steps.changed-files-exclude-submodule.outputs) }}" + shell: + bash test-yaml: name: Test changed-files with yaml runs-on: ubuntu-latest diff --git a/action.yml b/action.yml index b3fb919f..50b7d351 100644 --- a/action.yml +++ b/action.yml @@ -223,6 +223,10 @@ inputs: description: "Output changed files in a format that can be used for matrix jobs. Alias for setting inputs `json` to `true` and `escape_json` to `false`." required: false default: "false" + exclude_submodules: + description: "Exclude changes to submodules." + required: false + default: "false" outputs: added_files: diff --git a/dist/index.js b/dist/index.js index 7194c614..f628f953 100644 Binary files a/dist/index.js and b/dist/index.js differ diff --git a/dist/index.js.map b/dist/index.js.map index 1e6813f0..d61671a8 100644 Binary files a/dist/index.js.map and b/dist/index.js.map differ diff --git a/package.json b/package.json index 0360fa20..b7a93ac3 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "lint:fix": "eslint --fix src/*.ts src/**/*.ts", "package": "ncc build lib/main.js --source-map --license licenses.txt", "test": "jest --coverage", + "update-snapshot": "jest -u", "all": "yarn build && yarn format && yarn lint && yarn package && yarn test" }, "repository": { diff --git a/src/__tests__/__snapshots__/inputs.test.ts.snap b/src/__tests__/__snapshots__/inputs.test.ts.snap index 5740e6fd..7221be1d 100644 --- a/src/__tests__/__snapshots__/inputs.test.ts.snap +++ b/src/__tests__/__snapshots__/inputs.test.ts.snap @@ -2,55 +2,58 @@ exports[`getInputs should correctly parse boolean inputs 1`] = ` { - "apiUrl": undefined, - "baseSha": undefined, + "apiUrl": "", + "baseSha": "", "diffRelative": "false", "dirNames": "false", "dirNamesDeletedFilesIncludeOnlyDeletedDirs": "false", "dirNamesExcludeCurrentDir": "false", - "dirNamesIncludeFiles": undefined, - "dirNamesIncludeFilesSeparator": undefined, + "dirNamesIncludeFiles": "", + "dirNamesIncludeFilesSeparator": "", "escapeJson": false, + "excludeSubmodules": "false", "failOnInitialDiffError": "false", "failOnSubmoduleDiffError": "false", "fetchAdditionalSubmoduleHistory": "false", - "files": undefined, - "filesFromSourceFile": undefined, - "filesFromSourceFileSeparator": undefined, - "filesIgnore": undefined, - "filesIgnoreFromSourceFile": undefined, - "filesIgnoreFromSourceFileSeparator": undefined, - "filesIgnoreSeparator": undefined, - "filesIgnoreYaml": undefined, - "filesIgnoreYamlFromSourceFile": undefined, - "filesIgnoreYamlFromSourceFileSeparator": undefined, - "filesSeparator": undefined, - "filesYaml": undefined, - "filesYamlFromSourceFile": undefined, - "filesYamlFromSourceFileSeparator": undefined, + "files": "", + "filesFromSourceFile": "", + "filesFromSourceFileSeparator": "", + "filesIgnore": "", + "filesIgnoreFromSourceFile": "", + "filesIgnoreFromSourceFileSeparator": "", + "filesIgnoreSeparator": "", + "filesIgnoreYaml": "", + "filesIgnoreYamlFromSourceFile": "", + "filesIgnoreYamlFromSourceFileSeparator": "", + "filesSeparator": "", + "filesYaml": "", + "filesYamlFromSourceFile": "", + "filesYamlFromSourceFileSeparator": "", "includeAllOldNewRenamedFiles": "false", "json": true, "negationPatternsFirst": "false", - "oldNewFilesSeparator": undefined, - "oldNewSeparator": undefined, - "outputDir": undefined, + "oldNewFilesSeparator": " ", + "oldNewSeparator": ",", + "outputDir": "", "outputRenamedFilesAsDeletedAndAdded": "false", - "path": undefined, + "path": ".", "quotepath": "false", "recoverDeletedFiles": "false", - "recoverDeletedFilesToDestination": undefined, - "recoverFiles": undefined, - "recoverFilesIgnore": undefined, - "recoverFilesIgnoreSeparator": undefined, - "recoverFilesSeparator": undefined, + "recoverDeletedFilesToDestination": "", + "recoverFiles": "", + "recoverFilesIgnore": "", + "recoverFilesIgnoreSeparator": " +", + "recoverFilesSeparator": " +", "safeOutput": "false", - "separator": undefined, - "sha": undefined, - "since": undefined, + "separator": "", + "sha": "", + "since": "", "sinceLastRemoteCommit": "false", "skipInitialFetch": "true", - "token": undefined, - "until": undefined, + "token": "", + "until": "", "useRestApi": "false", "writeOutputFiles": "false", } @@ -68,6 +71,7 @@ exports[`getInputs should correctly parse numeric inputs 1`] = ` "dirNamesIncludeFilesSeparator": "", "dirNamesMaxDepth": 2, "escapeJson": false, + "excludeSubmodules": false, "failOnInitialDiffError": false, "failOnSubmoduleDiffError": false, "fetchAdditionalSubmoduleHistory": false, @@ -125,6 +129,7 @@ exports[`getInputs should correctly parse string inputs 1`] = ` "dirNamesIncludeFiles": "", "dirNamesIncludeFilesSeparator": "", "escapeJson": false, + "excludeSubmodules": false, "failOnInitialDiffError": false, "failOnSubmoduleDiffError": false, "fetchAdditionalSubmoduleHistory": false, @@ -182,6 +187,7 @@ exports[`getInputs should handle invalid numeric inputs correctly 1`] = ` "dirNamesIncludeFilesSeparator": "", "dirNamesMaxDepth": 2, "escapeJson": false, + "excludeSubmodules": false, "failOnInitialDiffError": false, "failOnSubmoduleDiffError": false, "fetchAdditionalSubmoduleHistory": false, @@ -240,6 +246,7 @@ exports[`getInputs should handle negative numeric inputs correctly 1`] = ` "dirNamesIncludeFilesSeparator": "", "dirNamesMaxDepth": -2, "escapeJson": false, + "excludeSubmodules": false, "failOnInitialDiffError": false, "failOnSubmoduleDiffError": false, "fetchAdditionalSubmoduleHistory": false, @@ -288,55 +295,58 @@ exports[`getInputs should handle negative numeric inputs correctly 1`] = ` exports[`getInputs should return default values when no inputs are provided 1`] = ` { - "apiUrl": undefined, - "baseSha": undefined, + "apiUrl": "", + "baseSha": "", "diffRelative": true, "dirNames": false, "dirNamesDeletedFilesIncludeOnlyDeletedDirs": false, "dirNamesExcludeCurrentDir": false, - "dirNamesIncludeFiles": undefined, - "dirNamesIncludeFilesSeparator": undefined, + "dirNamesIncludeFiles": "", + "dirNamesIncludeFilesSeparator": "", "escapeJson": false, + "excludeSubmodules": false, "failOnInitialDiffError": false, "failOnSubmoduleDiffError": false, "fetchAdditionalSubmoduleHistory": false, - "files": undefined, - "filesFromSourceFile": undefined, - "filesFromSourceFileSeparator": undefined, - "filesIgnore": undefined, - "filesIgnoreFromSourceFile": undefined, - "filesIgnoreFromSourceFileSeparator": undefined, - "filesIgnoreSeparator": undefined, - "filesIgnoreYaml": undefined, - "filesIgnoreYamlFromSourceFile": undefined, - "filesIgnoreYamlFromSourceFileSeparator": undefined, - "filesSeparator": undefined, - "filesYaml": undefined, - "filesYamlFromSourceFile": undefined, - "filesYamlFromSourceFileSeparator": undefined, + "files": "", + "filesFromSourceFile": "", + "filesFromSourceFileSeparator": "", + "filesIgnore": "", + "filesIgnoreFromSourceFile": "", + "filesIgnoreFromSourceFileSeparator": "", + "filesIgnoreSeparator": "", + "filesIgnoreYaml": "", + "filesIgnoreYamlFromSourceFile": "", + "filesIgnoreYamlFromSourceFileSeparator": "", + "filesSeparator": "", + "filesYaml": "", + "filesYamlFromSourceFile": "", + "filesYamlFromSourceFileSeparator": "", "includeAllOldNewRenamedFiles": false, "json": false, "negationPatternsFirst": false, - "oldNewFilesSeparator": undefined, - "oldNewSeparator": undefined, - "outputDir": undefined, + "oldNewFilesSeparator": " ", + "oldNewSeparator": ",", + "outputDir": "", "outputRenamedFilesAsDeletedAndAdded": false, - "path": undefined, + "path": ".", "quotepath": true, "recoverDeletedFiles": false, - "recoverDeletedFilesToDestination": undefined, - "recoverFiles": undefined, - "recoverFilesIgnore": undefined, - "recoverFilesIgnoreSeparator": undefined, - "recoverFilesSeparator": undefined, + "recoverDeletedFilesToDestination": "", + "recoverFiles": "", + "recoverFilesIgnore": "", + "recoverFilesIgnoreSeparator": " +", + "recoverFilesSeparator": " +", "safeOutput": false, - "separator": undefined, - "sha": undefined, - "since": undefined, + "separator": "", + "sha": "", + "since": "", "sinceLastRemoteCommit": false, "skipInitialFetch": false, - "token": undefined, - "until": undefined, + "token": "", + "until": "", "useRestApi": false, "writeOutputFiles": false, } diff --git a/src/__tests__/inputs.test.ts b/src/__tests__/inputs.test.ts index 07a7f5ca..cb5859a6 100644 --- a/src/__tests__/inputs.test.ts +++ b/src/__tests__/inputs.test.ts @@ -10,7 +10,7 @@ describe('getInputs', () => { }) test('should return default values when no inputs are provided', () => { - ;(core.getBooleanInput as jest.Mock).mockImplementation(name => { + ;(core.getInput as jest.Mock).mockImplementation(name => { const camelCaseName = name.replace(/_([a-z])/g, (g: string[]) => { return g[1].toUpperCase() }) as keyof Inputs @@ -30,7 +30,7 @@ describe('getInputs', () => { }) test('should correctly parse boolean inputs', () => { - ;(core.getBooleanInput as jest.Mock).mockImplementation(name => { + ;(core.getInput as jest.Mock).mockImplementation(name => { const camelCaseName = name.replace(/_([a-z])/g, (g: string[]) => { return g[1].toUpperCase() }) as keyof Inputs diff --git a/src/__tests__/utils.test.ts b/src/__tests__/utils.test.ts index 84f7297d..476bde7d 100644 --- a/src/__tests__/utils.test.ts +++ b/src/__tests__/utils.test.ts @@ -635,7 +635,8 @@ describe('utils test', () => { failOnInitialDiffError: false, failOnSubmoduleDiffError: false, negationPatternsFirst: false, - useRestApi: false + useRestApi: false, + excludeSubmodules: false } const coreWarningSpy = jest.spyOn(core, 'warning') diff --git a/src/changedFiles.ts b/src/changedFiles.ts index 12f07deb..0635d957 100644 --- a/src/changedFiles.ts +++ b/src/changedFiles.ts @@ -121,13 +121,13 @@ export const processChangedFiles = async ({ export const getRenamedFiles = async ({ inputs, workingDirectory, - hasSubmodule, + diffSubmodule, diffResult, submodulePaths }: { inputs: Inputs workingDirectory: string - hasSubmodule: boolean + diffSubmodule: boolean diffResult: DiffResult submodulePaths: string[] }): Promise<{paths: string; count: string}> => { @@ -139,7 +139,7 @@ export const getRenamedFiles = async ({ oldNewSeparator: inputs.oldNewSeparator }) - if (hasSubmodule) { + if (diffSubmodule) { for (const submodulePath of submodulePaths) { const submoduleShaResult = await gitSubmoduleDiffSHA({ cwd: workingDirectory, @@ -217,7 +217,7 @@ export type ChangedFiles = { export const getAllDiffFiles = async ({ workingDirectory, - hasSubmodule, + diffSubmodule, diffResult, submodulePaths, outputRenamedFilesAsDeletedAndAdded, @@ -226,7 +226,7 @@ export const getAllDiffFiles = async ({ failOnSubmoduleDiffError }: { workingDirectory: string - hasSubmodule: boolean + diffSubmodule: boolean diffResult: DiffResult submodulePaths: string[] outputRenamedFilesAsDeletedAndAdded: boolean @@ -243,7 +243,7 @@ export const getAllDiffFiles = async ({ failOnInitialDiffError }) - if (hasSubmodule) { + if (diffSubmodule) { for (const submodulePath of submodulePaths) { const submoduleShaResult = await gitSubmoduleDiffSHA({ cwd: workingDirectory, diff --git a/src/commitSha.ts b/src/commitSha.ts index e3e23c2c..fd9dd98b 100644 --- a/src/commitSha.ts +++ b/src/commitSha.ts @@ -91,7 +91,7 @@ interface SHAForNonPullRequestEvent { env: Env workingDirectory: string isShallow: boolean - hasSubmodule: boolean + diffSubmodule: boolean gitFetchExtraArgs: string[] isTag: boolean remoteName: string @@ -102,7 +102,7 @@ export const getSHAForNonPullRequestEvent = async ({ env, workingDirectory, isShallow, - hasSubmodule, + diffSubmodule, gitFetchExtraArgs, isTag, remoteName @@ -152,7 +152,7 @@ export const getSHAForNonPullRequestEvent = async ({ }) } - if (hasSubmodule) { + if (diffSubmodule) { await gitFetchSubmodules({ cwd: workingDirectory, args: [ @@ -164,7 +164,7 @@ export const getSHAForNonPullRequestEvent = async ({ }) } } else { - if (hasSubmodule && inputs.fetchAdditionalSubmoduleHistory) { + if (diffSubmodule && inputs.fetchAdditionalSubmoduleHistory) { await gitFetchSubmodules({ cwd: workingDirectory, args: [ @@ -323,7 +323,7 @@ interface SHAForPullRequestEvent { inputs: Inputs workingDirectory: string isShallow: boolean - hasSubmodule: boolean + diffSubmodule: boolean gitFetchExtraArgs: string[] remoteName: string } @@ -332,7 +332,7 @@ export const getSHAForPullRequestEvent = async ({ inputs, workingDirectory, isShallow, - hasSubmodule, + diffSubmodule, gitFetchExtraArgs, remoteName }: SHAForPullRequestEvent): Promise => { @@ -390,7 +390,7 @@ export const getSHAForPullRequestEvent = async ({ ] }) - if (hasSubmodule) { + if (diffSubmodule) { await gitFetchSubmodules({ cwd: workingDirectory, args: [ @@ -403,7 +403,7 @@ export const getSHAForPullRequestEvent = async ({ } } } else { - if (hasSubmodule && inputs.fetchAdditionalSubmoduleHistory) { + if (diffSubmodule && inputs.fetchAdditionalSubmoduleHistory) { await gitFetchSubmodules({ cwd: workingDirectory, args: [ diff --git a/src/constant.ts b/src/constant.ts index 51ab7fe1..8063ba6f 100644 --- a/src/constant.ts +++ b/src/constant.ts @@ -20,5 +20,6 @@ export const DEFAULT_VALUES_OF_UNSUPPORTED_API_INPUTS: Partial = { oldNewFilesSeparator: ' ', skipInitialFetch: false, fetchAdditionalSubmoduleHistory: false, - dirNamesDeletedFilesIncludeOnlyDeletedDirs: false + dirNamesDeletedFilesIncludeOnlyDeletedDirs: false, + excludeSubmodules: false } diff --git a/src/inputs.ts b/src/inputs.ts index 1c5edef4..ee96a4e9 100644 --- a/src/inputs.ts +++ b/src/inputs.ts @@ -54,6 +54,7 @@ export type Inputs = { failOnSubmoduleDiffError: boolean negationPatternsFirst: boolean useRestApi: boolean + excludeSubmodules: boolean } export const getInputs = (): Inputs => { @@ -240,6 +241,10 @@ export const getInputs = (): Inputs => { required: false }) + const excludeSubmodules = core.getBooleanInput('exclude_submodules', { + required: false + }) + const inputs: Inputs = { files, filesSeparator, @@ -279,6 +284,7 @@ export const getInputs = (): Inputs => { skipInitialFetch, fetchAdditionalSubmoduleHistory, dirNamesDeletedFilesIncludeOnlyDeletedDirs, + excludeSubmodules, // End Not Supported via REST API dirNames, dirNamesExcludeCurrentDir, diff --git a/src/main.ts b/src/main.ts index 4159b4f1..d2f4148e 100644 --- a/src/main.ts +++ b/src/main.ts @@ -64,10 +64,16 @@ const getChangedFilesFromLocalGitHistory = async ({ } const isShallow = await isRepoShallow({cwd: workingDirectory}) - const hasSubmodule = await submoduleExists({cwd: workingDirectory}) + let diffSubmodule = false let gitFetchExtraArgs = ['--no-tags', '--prune'] - if (hasSubmodule) { + if (inputs.excludeSubmodules) { + core.info('Excluding submodules from the diff') + } else { + diffSubmodule = await submoduleExists({cwd: workingDirectory}) + } + + if (diffSubmodule) { gitFetchExtraArgs.push('--recurse-submodules') } @@ -77,7 +83,7 @@ const getChangedFilesFromLocalGitHistory = async ({ inputs.outputRenamedFilesAsDeletedAndAdded let submodulePaths: string[] = [] - if (hasSubmodule) { + if (diffSubmodule) { submodulePaths = await getSubmodulePath({cwd: workingDirectory}) } @@ -94,7 +100,7 @@ const getChangedFilesFromLocalGitHistory = async ({ env, workingDirectory, isShallow, - hasSubmodule, + diffSubmodule, gitFetchExtraArgs, isTag, remoteName @@ -109,7 +115,7 @@ const getChangedFilesFromLocalGitHistory = async ({ inputs, workingDirectory, isShallow, - hasSubmodule, + diffSubmodule, gitFetchExtraArgs, remoteName }) @@ -127,7 +133,7 @@ const getChangedFilesFromLocalGitHistory = async ({ const allDiffFiles = await getAllDiffFiles({ workingDirectory, - hasSubmodule, + diffSubmodule, diffResult, submodulePaths, outputRenamedFilesAsDeletedAndAdded, @@ -153,7 +159,7 @@ const getChangedFilesFromLocalGitHistory = async ({ deletedFiles: allDiffFiles[ChangeTypeEnum.Deleted], recoverPatterns, diffResult, - hasSubmodule, + diffSubmodule, submodulePaths }) } @@ -171,7 +177,7 @@ const getChangedFilesFromLocalGitHistory = async ({ const allOldNewRenamedFiles = await getRenamedFiles({ inputs, workingDirectory, - hasSubmodule, + diffSubmodule, diffResult, submodulePaths }) diff --git a/src/utils.ts b/src/utils.ts index a73efaf1..0349954a 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1413,7 +1413,7 @@ export const recoverDeletedFiles = async ({ deletedFiles, recoverPatterns, diffResult, - hasSubmodule, + diffSubmodule, submodulePaths }: { inputs: Inputs @@ -1421,7 +1421,7 @@ export const recoverDeletedFiles = async ({ deletedFiles: string[] recoverPatterns: string[] diffResult: DiffResult - hasSubmodule: boolean + diffSubmodule: boolean submodulePaths: string[] }): Promise => { let recoverableDeletedFiles = deletedFiles @@ -1451,7 +1451,7 @@ export const recoverDeletedFiles = async ({ const submodulePath = submodulePaths.find(p => deletedFile.startsWith(p)) - if (hasSubmodule && submodulePath) { + if (diffSubmodule && submodulePath) { const submoduleShaResult = await gitSubmoduleDiffSHA({ cwd: workingDirectory, parentSha1: diffResult.previousSha,