import * as core from '@actions/core' import { ChangedFiles, ChangeTypeEnum, getAllChangeTypeFiles, getChangeTypeFiles } from './changedFiles' import {Inputs} from './inputs' import {setOutput} from './utils' const getOutputKey = (key: string, outputPrefix: string): string => { return outputPrefix ? `${outputPrefix}_${key}` : key } const getArrayFromPaths = ( paths: string | string[], inputs: Inputs ): string[] => { return Array.isArray(paths) ? paths : paths.split(inputs.separator) } export const setChangedFilesOutput = async ({ allDiffFiles, allFilteredDiffFiles, inputs, filePatterns = [], outputPrefix = '' }: { allDiffFiles: ChangedFiles allFilteredDiffFiles: ChangedFiles inputs: Inputs filePatterns?: string[] outputPrefix?: string }): Promise => { const addedFiles = await getChangeTypeFiles({ inputs, changedFiles: allFilteredDiffFiles, changeTypes: [ChangeTypeEnum.Added] }) core.debug(`Added files: ${JSON.stringify(addedFiles)}`) await setOutput({ key: getOutputKey('added_files', outputPrefix), value: addedFiles.paths, writeOutputFiles: inputs.writeOutputFiles, outputDir: inputs.outputDir, json: inputs.json, shouldEscape: inputs.escapeJson }) await setOutput({ key: getOutputKey('added_files_count', outputPrefix), value: addedFiles.count, writeOutputFiles: inputs.writeOutputFiles, outputDir: inputs.outputDir }) const copiedFiles = await getChangeTypeFiles({ inputs, changedFiles: allFilteredDiffFiles, changeTypes: [ChangeTypeEnum.Copied] }) core.debug(`Copied files: ${JSON.stringify(copiedFiles)}`) await setOutput({ key: getOutputKey('copied_files', outputPrefix), value: copiedFiles.paths, writeOutputFiles: inputs.writeOutputFiles, outputDir: inputs.outputDir, json: inputs.json, shouldEscape: inputs.escapeJson }) await setOutput({ key: getOutputKey('copied_files_count', outputPrefix), value: copiedFiles.count, writeOutputFiles: inputs.writeOutputFiles, outputDir: inputs.outputDir }) const modifiedFiles = await getChangeTypeFiles({ inputs, changedFiles: allFilteredDiffFiles, changeTypes: [ChangeTypeEnum.Modified] }) core.debug(`Modified files: ${JSON.stringify(modifiedFiles)}`) await setOutput({ key: getOutputKey('modified_files', outputPrefix), value: modifiedFiles.paths, writeOutputFiles: inputs.writeOutputFiles, outputDir: inputs.outputDir, json: inputs.json, shouldEscape: inputs.escapeJson }) await setOutput({ key: getOutputKey('modified_files_count', outputPrefix), value: modifiedFiles.count, writeOutputFiles: inputs.writeOutputFiles, outputDir: inputs.outputDir }) const renamedFiles = await getChangeTypeFiles({ inputs, changedFiles: allFilteredDiffFiles, changeTypes: [ChangeTypeEnum.Renamed] }) core.debug(`Renamed files: ${JSON.stringify(renamedFiles)}`) await setOutput({ key: getOutputKey('renamed_files', outputPrefix), value: renamedFiles.paths, writeOutputFiles: inputs.writeOutputFiles, outputDir: inputs.outputDir, json: inputs.json, shouldEscape: inputs.escapeJson }) await setOutput({ key: getOutputKey('renamed_files_count', outputPrefix), value: renamedFiles.count, writeOutputFiles: inputs.writeOutputFiles, outputDir: inputs.outputDir }) const typeChangedFiles = await getChangeTypeFiles({ inputs, changedFiles: allFilteredDiffFiles, changeTypes: [ChangeTypeEnum.TypeChanged] }) core.debug(`Type changed files: ${JSON.stringify(typeChangedFiles)}`) await setOutput({ key: getOutputKey('type_changed_files', outputPrefix), value: typeChangedFiles.paths, writeOutputFiles: inputs.writeOutputFiles, outputDir: inputs.outputDir, json: inputs.json, shouldEscape: inputs.escapeJson }) await setOutput({ key: getOutputKey('type_changed_files_count', outputPrefix), value: typeChangedFiles.count, writeOutputFiles: inputs.writeOutputFiles, outputDir: inputs.outputDir }) const unmergedFiles = await getChangeTypeFiles({ inputs, changedFiles: allFilteredDiffFiles, changeTypes: [ChangeTypeEnum.Unmerged] }) core.debug(`Unmerged files: ${JSON.stringify(unmergedFiles)}`) await setOutput({ key: getOutputKey('unmerged_files', outputPrefix), value: unmergedFiles.paths, writeOutputFiles: inputs.writeOutputFiles, outputDir: inputs.outputDir, json: inputs.json, shouldEscape: inputs.escapeJson }) await setOutput({ key: getOutputKey('unmerged_files_count', outputPrefix), value: unmergedFiles.count, writeOutputFiles: inputs.writeOutputFiles, outputDir: inputs.outputDir }) const unknownFiles = await getChangeTypeFiles({ inputs, changedFiles: allFilteredDiffFiles, changeTypes: [ChangeTypeEnum.Unknown] }) core.debug(`Unknown files: ${JSON.stringify(unknownFiles)}`) await setOutput({ key: getOutputKey('unknown_files', outputPrefix), value: unknownFiles.paths, writeOutputFiles: inputs.writeOutputFiles, outputDir: inputs.outputDir, json: inputs.json, shouldEscape: inputs.escapeJson }) await setOutput({ key: getOutputKey('unknown_files_count', outputPrefix), value: unknownFiles.count, writeOutputFiles: inputs.writeOutputFiles, outputDir: inputs.outputDir }) const allChangedAndModifiedFiles = await getAllChangeTypeFiles({ inputs, changedFiles: allFilteredDiffFiles }) core.debug( `All changed and modified files: ${JSON.stringify( allChangedAndModifiedFiles )}` ) await setOutput({ key: getOutputKey('all_changed_and_modified_files', outputPrefix), value: allChangedAndModifiedFiles.paths, writeOutputFiles: inputs.writeOutputFiles, outputDir: inputs.outputDir, json: inputs.json, shouldEscape: inputs.escapeJson }) await setOutput({ key: getOutputKey('all_changed_and_modified_files_count', outputPrefix), value: allChangedAndModifiedFiles.count, writeOutputFiles: inputs.writeOutputFiles, outputDir: inputs.outputDir }) const allChangedFiles = await getChangeTypeFiles({ inputs, changedFiles: allFilteredDiffFiles, changeTypes: [ ChangeTypeEnum.Added, ChangeTypeEnum.Copied, ChangeTypeEnum.Modified, ChangeTypeEnum.Renamed ] }) core.debug(`All changed files: ${JSON.stringify(allChangedFiles)}`) await setOutput({ key: getOutputKey('all_changed_files', outputPrefix), value: allChangedFiles.paths, writeOutputFiles: inputs.writeOutputFiles, outputDir: inputs.outputDir, json: inputs.json, shouldEscape: inputs.escapeJson }) await setOutput({ key: getOutputKey('all_changed_files_count', outputPrefix), value: allChangedFiles.count, writeOutputFiles: inputs.writeOutputFiles, outputDir: inputs.outputDir }) await setOutput({ key: getOutputKey('any_changed', outputPrefix), value: allChangedFiles.paths.length > 0 && filePatterns.length > 0, writeOutputFiles: inputs.writeOutputFiles, outputDir: inputs.outputDir, json: inputs.json }) const allOtherChangedFiles = await getChangeTypeFiles({ inputs, changedFiles: allDiffFiles, changeTypes: [ ChangeTypeEnum.Added, ChangeTypeEnum.Copied, ChangeTypeEnum.Modified, ChangeTypeEnum.Renamed ] }) core.debug(`All other changed files: ${JSON.stringify(allOtherChangedFiles)}`) const allOtherChangedFilesPaths: string[] = getArrayFromPaths( allOtherChangedFiles.paths, inputs ) const allChangedFilesPaths: string[] = getArrayFromPaths( allChangedFiles.paths, inputs ) const otherChangedFiles = allOtherChangedFilesPaths.filter( (filePath: string) => !allChangedFilesPaths.includes(filePath) ) const onlyChanged = otherChangedFiles.length === 0 && allChangedFiles.paths.length > 0 && filePatterns.length > 0 await setOutput({ key: getOutputKey('only_changed', outputPrefix), value: onlyChanged, writeOutputFiles: inputs.writeOutputFiles, outputDir: inputs.outputDir, json: inputs.json }) await setOutput({ key: getOutputKey('other_changed_files', outputPrefix), value: inputs.json ? otherChangedFiles : otherChangedFiles.join(inputs.separator), writeOutputFiles: inputs.writeOutputFiles, outputDir: inputs.outputDir, json: inputs.json, shouldEscape: inputs.escapeJson }) await setOutput({ key: getOutputKey('other_changed_files_count', outputPrefix), value: otherChangedFiles.length.toString(), writeOutputFiles: inputs.writeOutputFiles, outputDir: inputs.outputDir }) const allModifiedFiles = await getChangeTypeFiles({ inputs, changedFiles: allFilteredDiffFiles, changeTypes: [ ChangeTypeEnum.Added, ChangeTypeEnum.Copied, ChangeTypeEnum.Modified, ChangeTypeEnum.Renamed, ChangeTypeEnum.Deleted ] }) core.debug(`All modified files: ${JSON.stringify(allModifiedFiles)}`) await setOutput({ key: getOutputKey('all_modified_files', outputPrefix), value: allModifiedFiles.paths, writeOutputFiles: inputs.writeOutputFiles, outputDir: inputs.outputDir, json: inputs.json, shouldEscape: inputs.escapeJson }) await setOutput({ key: getOutputKey('all_modified_files_count', outputPrefix), value: allModifiedFiles.count, writeOutputFiles: inputs.writeOutputFiles, outputDir: inputs.outputDir }) await setOutput({ key: getOutputKey('any_modified', outputPrefix), value: allModifiedFiles.paths.length > 0 && filePatterns.length > 0, writeOutputFiles: inputs.writeOutputFiles, outputDir: inputs.outputDir, json: inputs.json }) const allOtherModifiedFiles = await getChangeTypeFiles({ inputs, changedFiles: allDiffFiles, changeTypes: [ ChangeTypeEnum.Added, ChangeTypeEnum.Copied, ChangeTypeEnum.Modified, ChangeTypeEnum.Renamed, ChangeTypeEnum.Deleted ] }) const allOtherModifiedFilesPaths: string[] = getArrayFromPaths( allOtherModifiedFiles.paths, inputs ) const allModifiedFilesPaths: string[] = getArrayFromPaths( allModifiedFiles.paths, inputs ) const otherModifiedFiles = allOtherModifiedFilesPaths.filter( (filePath: string) => !allModifiedFilesPaths.includes(filePath) ) const onlyModified = otherModifiedFiles.length === 0 && allModifiedFiles.paths.length > 0 && filePatterns.length > 0 await setOutput({ key: getOutputKey('only_modified', outputPrefix), value: onlyModified, writeOutputFiles: inputs.writeOutputFiles, outputDir: inputs.outputDir, json: inputs.json }) await setOutput({ key: getOutputKey('other_modified_files', outputPrefix), value: inputs.json ? otherModifiedFiles : otherModifiedFiles.join(inputs.separator), writeOutputFiles: inputs.writeOutputFiles, outputDir: inputs.outputDir, json: inputs.json, shouldEscape: inputs.escapeJson }) await setOutput({ key: getOutputKey('other_modified_files_count', outputPrefix), value: otherModifiedFiles.length.toString(), writeOutputFiles: inputs.writeOutputFiles, outputDir: inputs.outputDir }) const deletedFiles = await getChangeTypeFiles({ inputs, changedFiles: allFilteredDiffFiles, changeTypes: [ChangeTypeEnum.Deleted] }) core.debug(`Deleted files: ${JSON.stringify(deletedFiles)}`) await setOutput({ key: getOutputKey('deleted_files', outputPrefix), value: deletedFiles.paths, writeOutputFiles: inputs.writeOutputFiles, outputDir: inputs.outputDir, json: inputs.json, shouldEscape: inputs.escapeJson }) await setOutput({ key: getOutputKey('deleted_files_count', outputPrefix), value: deletedFiles.count, writeOutputFiles: inputs.writeOutputFiles, outputDir: inputs.outputDir }) await setOutput({ key: getOutputKey('any_deleted', outputPrefix), value: deletedFiles.paths.length > 0 && filePatterns.length > 0, writeOutputFiles: inputs.writeOutputFiles, outputDir: inputs.outputDir, json: inputs.json }) const allOtherDeletedFiles = await getChangeTypeFiles({ inputs, changedFiles: allDiffFiles, changeTypes: [ChangeTypeEnum.Deleted] }) const allOtherDeletedFilesPaths: string[] = getArrayFromPaths( allOtherDeletedFiles.paths, inputs ) const deletedFilesPaths: string[] = getArrayFromPaths( deletedFiles.paths, inputs ) const otherDeletedFiles = allOtherDeletedFilesPaths.filter( filePath => !deletedFilesPaths.includes(filePath) ) const onlyDeleted = otherDeletedFiles.length === 0 && deletedFiles.paths.length > 0 && filePatterns.length > 0 await setOutput({ key: getOutputKey('only_deleted', outputPrefix), value: onlyDeleted, writeOutputFiles: inputs.writeOutputFiles, outputDir: inputs.outputDir, json: inputs.json }) await setOutput({ key: getOutputKey('other_deleted_files', outputPrefix), value: inputs.json ? otherDeletedFiles : otherDeletedFiles.join(inputs.separator), writeOutputFiles: inputs.writeOutputFiles, outputDir: inputs.outputDir, json: inputs.json, shouldEscape: inputs.escapeJson }) await setOutput({ key: getOutputKey('other_deleted_files_count', outputPrefix), value: otherDeletedFiles.length.toString(), writeOutputFiles: inputs.writeOutputFiles, outputDir: inputs.outputDir }) }