feat: add support for restricting recoverable deleted files via patterns (#1390)
Co-authored-by: GitHub Action <action@github.com>
This commit is contained in:
parent
b60277dde9
commit
33288d37e7
16
action.yml
16
action.yml
@ -152,6 +152,22 @@ inputs:
|
|||||||
description: "Recover deleted files to a new destination directory, defaults to the original location."
|
description: "Recover deleted files to a new destination directory, defaults to the original location."
|
||||||
required: false
|
required: false
|
||||||
default: ""
|
default: ""
|
||||||
|
recover_files:
|
||||||
|
description: "File and directory patterns used to recover deleted files."
|
||||||
|
required: false
|
||||||
|
default: ""
|
||||||
|
recover_files_separator:
|
||||||
|
description: "Separator used to split the `recover_files` input"
|
||||||
|
default: "\n"
|
||||||
|
required: false
|
||||||
|
recover_files_ignore:
|
||||||
|
description: "File and directory patterns to ignore when recovering deleted files."
|
||||||
|
required: false
|
||||||
|
default: ""
|
||||||
|
recover_files_ignore_separator:
|
||||||
|
description: "Separator used to split the `recover_files_ignore` input"
|
||||||
|
default: "\n"
|
||||||
|
required: false
|
||||||
token:
|
token:
|
||||||
description: "Github token used to fetch changed files from Github's API."
|
description: "Github token used to fetch changed files from Github's API."
|
||||||
required: false
|
required: false
|
||||||
|
214
dist/index.js
generated
vendored
214
dist/index.js
generated
vendored
@ -326,20 +326,12 @@ const utils_1 = __nccwpck_require__(918);
|
|||||||
const getOutputKey = (key, outputPrefix) => {
|
const getOutputKey = (key, outputPrefix) => {
|
||||||
return outputPrefix ? `${outputPrefix}_${key}` : key;
|
return outputPrefix ? `${outputPrefix}_${key}` : key;
|
||||||
};
|
};
|
||||||
const setChangedFilesOutput = ({ allDiffFiles, inputs, workingDirectory, diffResult, filePatterns = [], outputPrefix = '' }) => __awaiter(void 0, void 0, void 0, function* () {
|
const setChangedFilesOutput = ({ allDiffFiles, inputs, filePatterns = [], outputPrefix = '' }) => __awaiter(void 0, void 0, void 0, function* () {
|
||||||
const allFilteredDiffFiles = yield (0, utils_1.getFilteredChangedFiles)({
|
const allFilteredDiffFiles = yield (0, utils_1.getFilteredChangedFiles)({
|
||||||
allDiffFiles,
|
allDiffFiles,
|
||||||
filePatterns
|
filePatterns
|
||||||
});
|
});
|
||||||
core.debug(`All filtered diff files: ${JSON.stringify(allFilteredDiffFiles)}`);
|
core.debug(`All filtered diff files: ${JSON.stringify(allFilteredDiffFiles)}`);
|
||||||
if (diffResult) {
|
|
||||||
yield (0, utils_1.recoverDeletedFiles)({
|
|
||||||
inputs,
|
|
||||||
workingDirectory,
|
|
||||||
deletedFiles: allFilteredDiffFiles[changedFiles_1.ChangeTypeEnum.Deleted],
|
|
||||||
sha: diffResult.previousSha
|
|
||||||
});
|
|
||||||
}
|
|
||||||
const addedFiles = yield (0, changedFiles_1.getChangeTypeFiles)({
|
const addedFiles = yield (0, changedFiles_1.getChangeTypeFiles)({
|
||||||
inputs,
|
inputs,
|
||||||
changedFiles: allFilteredDiffFiles,
|
changedFiles: allFilteredDiffFiles,
|
||||||
@ -1228,6 +1220,18 @@ const getInputs = () => {
|
|||||||
required: false
|
required: false
|
||||||
});
|
});
|
||||||
const recoverDeletedFilesToDestination = core.getInput('recover_deleted_files_to_destination', { required: false });
|
const recoverDeletedFilesToDestination = core.getInput('recover_deleted_files_to_destination', { required: false });
|
||||||
|
const recoverFiles = core.getInput('recover_files', { required: false });
|
||||||
|
const recoverFilesSeparator = core.getInput('recover_files_separator', {
|
||||||
|
required: false,
|
||||||
|
trimWhitespace: false
|
||||||
|
});
|
||||||
|
const recoverFilesIgnore = core.getInput('recover_files_ignore', {
|
||||||
|
required: false
|
||||||
|
});
|
||||||
|
const recoverFilesIgnoreSeparator = core.getInput('recover_files_ignore_separator', {
|
||||||
|
required: false,
|
||||||
|
trimWhitespace: false
|
||||||
|
});
|
||||||
const token = core.getInput('token', { required: false });
|
const token = core.getInput('token', { required: false });
|
||||||
const apiUrl = core.getInput('api_url', { required: false });
|
const apiUrl = core.getInput('api_url', { required: false });
|
||||||
const skipInitialFetch = core.getBooleanInput('skip_initial_fetch', {
|
const skipInitialFetch = core.getBooleanInput('skip_initial_fetch', {
|
||||||
@ -1260,6 +1264,10 @@ const getInputs = () => {
|
|||||||
sinceLastRemoteCommit,
|
sinceLastRemoteCommit,
|
||||||
recoverDeletedFiles,
|
recoverDeletedFiles,
|
||||||
recoverDeletedFilesToDestination,
|
recoverDeletedFilesToDestination,
|
||||||
|
recoverFiles,
|
||||||
|
recoverFilesSeparator,
|
||||||
|
recoverFilesIgnore,
|
||||||
|
recoverFilesIgnoreSeparator,
|
||||||
includeAllOldNewRenamedFiles,
|
includeAllOldNewRenamedFiles,
|
||||||
oldNewSeparator,
|
oldNewSeparator,
|
||||||
oldNewFilesSeparator,
|
oldNewFilesSeparator,
|
||||||
@ -1339,6 +1347,40 @@ const commitSha_1 = __nccwpck_require__(8613);
|
|||||||
const env_1 = __nccwpck_require__(9763);
|
const env_1 = __nccwpck_require__(9763);
|
||||||
const inputs_1 = __nccwpck_require__(6180);
|
const inputs_1 = __nccwpck_require__(6180);
|
||||||
const utils_1 = __nccwpck_require__(918);
|
const utils_1 = __nccwpck_require__(918);
|
||||||
|
const changedFilesOutput = ({ filePatterns, allDiffFiles, inputs, yamlFilePatterns }) => __awaiter(void 0, void 0, void 0, function* () {
|
||||||
|
if (filePatterns.length > 0) {
|
||||||
|
core.startGroup('changed-files-patterns');
|
||||||
|
yield (0, changedFilesOutput_1.setChangedFilesOutput)({
|
||||||
|
allDiffFiles,
|
||||||
|
filePatterns,
|
||||||
|
inputs
|
||||||
|
});
|
||||||
|
core.info('All Done!');
|
||||||
|
core.endGroup();
|
||||||
|
}
|
||||||
|
if (Object.keys(yamlFilePatterns).length > 0) {
|
||||||
|
for (const key of Object.keys(yamlFilePatterns)) {
|
||||||
|
core.startGroup(`changed-files-yaml-${key}`);
|
||||||
|
yield (0, changedFilesOutput_1.setChangedFilesOutput)({
|
||||||
|
allDiffFiles,
|
||||||
|
filePatterns: yamlFilePatterns[key],
|
||||||
|
outputPrefix: key,
|
||||||
|
inputs
|
||||||
|
});
|
||||||
|
core.info('All Done!');
|
||||||
|
core.endGroup();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (filePatterns.length === 0 && Object.keys(yamlFilePatterns).length === 0) {
|
||||||
|
core.startGroup('changed-files-all');
|
||||||
|
yield (0, changedFilesOutput_1.setChangedFilesOutput)({
|
||||||
|
allDiffFiles,
|
||||||
|
inputs
|
||||||
|
});
|
||||||
|
core.info('All Done!');
|
||||||
|
core.endGroup();
|
||||||
|
}
|
||||||
|
});
|
||||||
const getChangedFilesFromLocalGit = ({ inputs, env, workingDirectory, filePatterns, yamlFilePatterns }) => __awaiter(void 0, void 0, void 0, function* () {
|
const getChangedFilesFromLocalGit = ({ inputs, env, workingDirectory, filePatterns, yamlFilePatterns }) => __awaiter(void 0, void 0, void 0, function* () {
|
||||||
var _a, _b, _c;
|
var _a, _b, _c;
|
||||||
yield (0, utils_1.verifyMinimumGitVersion)();
|
yield (0, utils_1.verifyMinimumGitVersion)();
|
||||||
@ -1393,44 +1435,26 @@ const getChangedFilesFromLocalGit = ({ inputs, env, workingDirectory, filePatter
|
|||||||
core.debug(`All diff files: ${JSON.stringify(allDiffFiles)}`);
|
core.debug(`All diff files: ${JSON.stringify(allDiffFiles)}`);
|
||||||
core.info('All Done!');
|
core.info('All Done!');
|
||||||
core.endGroup();
|
core.endGroup();
|
||||||
if (filePatterns.length > 0) {
|
if (inputs.recoverDeletedFiles) {
|
||||||
core.startGroup('changed-files-patterns');
|
let recoverPatterns = (0, utils_1.getRecoverFilePatterns)({ inputs });
|
||||||
yield (0, changedFilesOutput_1.setChangedFilesOutput)({
|
if (recoverPatterns.length > 0 && filePatterns.length > 0) {
|
||||||
allDiffFiles,
|
core.info('No recover patterns found; defaulting to file patterns');
|
||||||
filePatterns,
|
recoverPatterns = filePatterns;
|
||||||
inputs,
|
|
||||||
workingDirectory,
|
|
||||||
diffResult
|
|
||||||
});
|
|
||||||
core.info('All Done!');
|
|
||||||
core.endGroup();
|
|
||||||
}
|
|
||||||
if (Object.keys(yamlFilePatterns).length > 0) {
|
|
||||||
for (const key of Object.keys(yamlFilePatterns)) {
|
|
||||||
core.startGroup(`changed-files-yaml-${key}`);
|
|
||||||
yield (0, changedFilesOutput_1.setChangedFilesOutput)({
|
|
||||||
allDiffFiles,
|
|
||||||
filePatterns: yamlFilePatterns[key],
|
|
||||||
outputPrefix: key,
|
|
||||||
inputs,
|
|
||||||
workingDirectory,
|
|
||||||
diffResult
|
|
||||||
});
|
|
||||||
core.info('All Done!');
|
|
||||||
core.endGroup();
|
|
||||||
}
|
}
|
||||||
}
|
yield (0, utils_1.recoverDeletedFiles)({
|
||||||
if (filePatterns.length === 0 && Object.keys(yamlFilePatterns).length === 0) {
|
|
||||||
core.startGroup('changed-files-all');
|
|
||||||
yield (0, changedFilesOutput_1.setChangedFilesOutput)({
|
|
||||||
allDiffFiles,
|
|
||||||
inputs,
|
inputs,
|
||||||
workingDirectory,
|
workingDirectory,
|
||||||
diffResult
|
deletedFiles: allDiffFiles[changedFiles_1.ChangeTypeEnum.Deleted],
|
||||||
|
recoverPatterns,
|
||||||
|
sha: diffResult.previousSha
|
||||||
});
|
});
|
||||||
core.info('All Done!');
|
|
||||||
core.endGroup();
|
|
||||||
}
|
}
|
||||||
|
yield changedFilesOutput({
|
||||||
|
filePatterns,
|
||||||
|
allDiffFiles,
|
||||||
|
inputs,
|
||||||
|
yamlFilePatterns
|
||||||
|
});
|
||||||
if (inputs.includeAllOldNewRenamedFiles) {
|
if (inputs.includeAllOldNewRenamedFiles) {
|
||||||
core.startGroup('changed-files-all-old-new-renamed-files');
|
core.startGroup('changed-files-all-old-new-renamed-files');
|
||||||
const allOldNewRenamedFiles = yield (0, changedFiles_1.getRenamedFiles)({
|
const allOldNewRenamedFiles = yield (0, changedFiles_1.getRenamedFiles)({
|
||||||
@ -1455,47 +1479,18 @@ const getChangedFilesFromLocalGit = ({ inputs, env, workingDirectory, filePatter
|
|||||||
core.endGroup();
|
core.endGroup();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
const getChangedFilesFromRESTAPI = ({ inputs, workingDirectory, filePatterns, yamlFilePatterns }) => __awaiter(void 0, void 0, void 0, function* () {
|
const getChangedFilesFromRESTAPI = ({ inputs, filePatterns, yamlFilePatterns }) => __awaiter(void 0, void 0, void 0, function* () {
|
||||||
const allDiffFiles = yield (0, changedFiles_1.getChangedFilesFromGithubAPI)({
|
const allDiffFiles = yield (0, changedFiles_1.getChangedFilesFromGithubAPI)({
|
||||||
inputs
|
inputs
|
||||||
});
|
});
|
||||||
core.debug(`All diff files: ${JSON.stringify(allDiffFiles)}`);
|
core.debug(`All diff files: ${JSON.stringify(allDiffFiles)}`);
|
||||||
core.info('All Done!');
|
core.info('All Done!');
|
||||||
if (filePatterns.length > 0) {
|
yield changedFilesOutput({
|
||||||
core.startGroup('changed-files-patterns');
|
filePatterns,
|
||||||
yield (0, changedFilesOutput_1.setChangedFilesOutput)({
|
allDiffFiles,
|
||||||
allDiffFiles,
|
inputs,
|
||||||
filePatterns,
|
yamlFilePatterns
|
||||||
inputs,
|
});
|
||||||
workingDirectory
|
|
||||||
});
|
|
||||||
core.info('All Done!');
|
|
||||||
core.endGroup();
|
|
||||||
}
|
|
||||||
if (Object.keys(yamlFilePatterns).length > 0) {
|
|
||||||
for (const key of Object.keys(yamlFilePatterns)) {
|
|
||||||
core.startGroup(`changed-files-yaml-${key}`);
|
|
||||||
yield (0, changedFilesOutput_1.setChangedFilesOutput)({
|
|
||||||
allDiffFiles,
|
|
||||||
filePatterns: yamlFilePatterns[key],
|
|
||||||
outputPrefix: key,
|
|
||||||
inputs,
|
|
||||||
workingDirectory
|
|
||||||
});
|
|
||||||
core.info('All Done!');
|
|
||||||
core.endGroup();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (filePatterns.length === 0 && Object.keys(yamlFilePatterns).length === 0) {
|
|
||||||
core.startGroup('changed-files-all');
|
|
||||||
yield (0, changedFilesOutput_1.setChangedFilesOutput)({
|
|
||||||
allDiffFiles,
|
|
||||||
inputs,
|
|
||||||
workingDirectory
|
|
||||||
});
|
|
||||||
core.info('All Done!');
|
|
||||||
core.endGroup();
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
function run() {
|
function run() {
|
||||||
var _a;
|
var _a;
|
||||||
@ -1505,8 +1500,7 @@ function run() {
|
|||||||
core.debug(`Env: ${JSON.stringify(env, null, 2)}`);
|
core.debug(`Env: ${JSON.stringify(env, null, 2)}`);
|
||||||
const inputs = (0, inputs_1.getInputs)();
|
const inputs = (0, inputs_1.getInputs)();
|
||||||
core.debug(`Inputs: ${JSON.stringify(inputs, null, 2)}`);
|
core.debug(`Inputs: ${JSON.stringify(inputs, null, 2)}`);
|
||||||
const githubContext = github.context;
|
core.debug(`Github Context: ${JSON.stringify(github.context, null, 2)}`);
|
||||||
core.debug(`Github Context: ${JSON.stringify(githubContext, null, 2)}`);
|
|
||||||
const workingDirectory = path_1.default.resolve(env.GITHUB_WORKSPACE || process.cwd(), inputs.path);
|
const workingDirectory = path_1.default.resolve(env.GITHUB_WORKSPACE || process.cwd(), inputs.path);
|
||||||
core.debug(`Working directory: ${workingDirectory}`);
|
core.debug(`Working directory: ${workingDirectory}`);
|
||||||
const hasGitDirectory = yield (0, utils_1.hasLocalGitDirectory)({ workingDirectory });
|
const hasGitDirectory = yield (0, utils_1.hasLocalGitDirectory)({ workingDirectory });
|
||||||
@ -1542,7 +1536,6 @@ function run() {
|
|||||||
}
|
}
|
||||||
yield getChangedFilesFromRESTAPI({
|
yield getChangedFilesFromRESTAPI({
|
||||||
inputs,
|
inputs,
|
||||||
workingDirectory,
|
|
||||||
filePatterns,
|
filePatterns,
|
||||||
yamlFilePatterns
|
yamlFilePatterns
|
||||||
});
|
});
|
||||||
@ -1635,7 +1628,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|||||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||||
};
|
};
|
||||||
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
||||||
exports.hasLocalGitDirectory = exports.recoverDeletedFiles = exports.setOutput = exports.getYamlFilePatterns = exports.getFilePatterns = exports.jsonOutput = exports.getDirnameMaxDepth = exports.canDiffCommits = exports.getPreviousGitTag = exports.verifyCommitSha = exports.getParentSha = exports.getRemoteBranchHeadSha = exports.isInsideWorkTree = exports.getHeadSha = exports.gitLog = exports.getFilteredChangedFiles = exports.getAllChangedFiles = exports.gitRenamedFiles = exports.gitSubmoduleDiffSHA = exports.getSubmodulePath = exports.gitFetchSubmodules = exports.gitFetch = exports.submoduleExists = exports.isRepoShallow = exports.updateGitGlobalConfig = exports.verifyMinimumGitVersion = void 0;
|
exports.hasLocalGitDirectory = exports.recoverDeletedFiles = exports.setOutput = exports.getRecoverFilePatterns = exports.getYamlFilePatterns = exports.getFilePatterns = exports.jsonOutput = exports.getDirnameMaxDepth = exports.canDiffCommits = exports.getPreviousGitTag = exports.verifyCommitSha = exports.getParentSha = exports.getRemoteBranchHeadSha = exports.isInsideWorkTree = exports.getHeadSha = exports.gitLog = exports.getFilteredChangedFiles = exports.getAllChangedFiles = exports.gitRenamedFiles = exports.gitSubmoduleDiffSHA = exports.getSubmodulePath = exports.gitFetchSubmodules = exports.gitFetch = exports.submoduleExists = exports.isRepoShallow = exports.updateGitGlobalConfig = exports.verifyMinimumGitVersion = void 0;
|
||||||
/*global AsyncIterableIterator*/
|
/*global AsyncIterableIterator*/
|
||||||
const core = __importStar(__nccwpck_require__(2186));
|
const core = __importStar(__nccwpck_require__(2186));
|
||||||
const exec = __importStar(__nccwpck_require__(1514));
|
const exec = __importStar(__nccwpck_require__(1514));
|
||||||
@ -2303,6 +2296,23 @@ const getYamlFilePatterns = ({ inputs, workingDirectory }) => __awaiter(void 0,
|
|||||||
return filePatterns;
|
return filePatterns;
|
||||||
});
|
});
|
||||||
exports.getYamlFilePatterns = getYamlFilePatterns;
|
exports.getYamlFilePatterns = getYamlFilePatterns;
|
||||||
|
const getRecoverFilePatterns = ({ inputs }) => {
|
||||||
|
let filePatterns = inputs.recoverFiles.split(inputs.recoverFilesSeparator);
|
||||||
|
if (inputs.recoverFilesIgnore) {
|
||||||
|
const ignoreFilePatterns = inputs.recoverFilesIgnore.split(inputs.recoverFilesSeparator);
|
||||||
|
filePatterns = filePatterns.concat(ignoreFilePatterns.map(p => {
|
||||||
|
if (p.startsWith('!')) {
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return `!${p}`;
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
core.debug(`recover file patterns: ${filePatterns}`);
|
||||||
|
return filePatterns.filter(Boolean);
|
||||||
|
};
|
||||||
|
exports.getRecoverFilePatterns = getRecoverFilePatterns;
|
||||||
const setOutput = ({ key, value, inputs }) => __awaiter(void 0, void 0, void 0, function* () {
|
const setOutput = ({ key, value, inputs }) => __awaiter(void 0, void 0, void 0, function* () {
|
||||||
const cleanedValue = value.toString().trim();
|
const cleanedValue = value.toString().trim();
|
||||||
core.setOutput(key, cleanedValue);
|
core.setOutput(key, cleanedValue);
|
||||||
@ -2328,23 +2338,31 @@ const getDeletedFileContents = ({ cwd, filePath, sha }) => __awaiter(void 0, voi
|
|||||||
}
|
}
|
||||||
return stdout;
|
return stdout;
|
||||||
});
|
});
|
||||||
const recoverDeletedFiles = ({ inputs, workingDirectory, deletedFiles, sha }) => __awaiter(void 0, void 0, void 0, function* () {
|
const recoverDeletedFiles = ({ inputs, workingDirectory, deletedFiles, recoverPatterns, sha }) => __awaiter(void 0, void 0, void 0, function* () {
|
||||||
if (inputs.recoverDeletedFiles) {
|
let recoverableDeletedFiles = deletedFiles;
|
||||||
for (const deletedFile of deletedFiles) {
|
core.debug(`recoverable deleted files: ${recoverableDeletedFiles}`);
|
||||||
let target = path.join(workingDirectory, deletedFile);
|
if (recoverPatterns.length > 0) {
|
||||||
if (inputs.recoverDeletedFilesToDestination) {
|
recoverableDeletedFiles = (0, micromatch_1.default)(deletedFiles, recoverPatterns, {
|
||||||
target = path.join(workingDirectory, inputs.recoverDeletedFilesToDestination, deletedFile);
|
dot: true,
|
||||||
}
|
windows: IS_WINDOWS,
|
||||||
const deletedFileContents = yield getDeletedFileContents({
|
noext: true
|
||||||
cwd: workingDirectory,
|
});
|
||||||
filePath: deletedFile,
|
core.debug(`filtered recoverable deleted files: ${recoverableDeletedFiles}`);
|
||||||
sha
|
}
|
||||||
});
|
for (const deletedFile of recoverableDeletedFiles) {
|
||||||
if (!(yield exists(path.dirname(target)))) {
|
let target = path.join(workingDirectory, deletedFile);
|
||||||
yield fs_1.promises.mkdir(path.dirname(target), { recursive: true });
|
if (inputs.recoverDeletedFilesToDestination) {
|
||||||
}
|
target = path.join(workingDirectory, inputs.recoverDeletedFilesToDestination, deletedFile);
|
||||||
yield fs_1.promises.writeFile(target, deletedFileContents);
|
|
||||||
}
|
}
|
||||||
|
const deletedFileContents = yield getDeletedFileContents({
|
||||||
|
cwd: workingDirectory,
|
||||||
|
filePath: deletedFile,
|
||||||
|
sha
|
||||||
|
});
|
||||||
|
if (!(yield exists(path.dirname(target)))) {
|
||||||
|
yield fs_1.promises.mkdir(path.dirname(target), { recursive: true });
|
||||||
|
}
|
||||||
|
yield fs_1.promises.writeFile(target, deletedFileContents);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
exports.recoverDeletedFiles = recoverDeletedFiles;
|
exports.recoverDeletedFiles = recoverDeletedFiles;
|
||||||
|
2
dist/index.js.map
generated
vendored
2
dist/index.js.map
generated
vendored
File diff suppressed because one or more lines are too long
@ -5,9 +5,8 @@ import {
|
|||||||
getAllChangeTypeFiles,
|
getAllChangeTypeFiles,
|
||||||
getChangeTypeFiles
|
getChangeTypeFiles
|
||||||
} from './changedFiles'
|
} from './changedFiles'
|
||||||
import {DiffResult} from './commitSha'
|
|
||||||
import {Inputs} from './inputs'
|
import {Inputs} from './inputs'
|
||||||
import {getFilteredChangedFiles, recoverDeletedFiles, setOutput} from './utils'
|
import {getFilteredChangedFiles, setOutput} from './utils'
|
||||||
|
|
||||||
const getOutputKey = (key: string, outputPrefix: string): string => {
|
const getOutputKey = (key: string, outputPrefix: string): string => {
|
||||||
return outputPrefix ? `${outputPrefix}_${key}` : key
|
return outputPrefix ? `${outputPrefix}_${key}` : key
|
||||||
@ -16,15 +15,11 @@ const getOutputKey = (key: string, outputPrefix: string): string => {
|
|||||||
export const setChangedFilesOutput = async ({
|
export const setChangedFilesOutput = async ({
|
||||||
allDiffFiles,
|
allDiffFiles,
|
||||||
inputs,
|
inputs,
|
||||||
workingDirectory,
|
|
||||||
diffResult,
|
|
||||||
filePatterns = [],
|
filePatterns = [],
|
||||||
outputPrefix = ''
|
outputPrefix = ''
|
||||||
}: {
|
}: {
|
||||||
allDiffFiles: ChangedFiles
|
allDiffFiles: ChangedFiles
|
||||||
inputs: Inputs
|
inputs: Inputs
|
||||||
workingDirectory: string
|
|
||||||
diffResult?: DiffResult
|
|
||||||
filePatterns?: string[]
|
filePatterns?: string[]
|
||||||
outputPrefix?: string
|
outputPrefix?: string
|
||||||
}): Promise<void> => {
|
}): Promise<void> => {
|
||||||
@ -34,15 +29,6 @@ export const setChangedFilesOutput = async ({
|
|||||||
})
|
})
|
||||||
core.debug(`All filtered diff files: ${JSON.stringify(allFilteredDiffFiles)}`)
|
core.debug(`All filtered diff files: ${JSON.stringify(allFilteredDiffFiles)}`)
|
||||||
|
|
||||||
if (diffResult) {
|
|
||||||
await recoverDeletedFiles({
|
|
||||||
inputs,
|
|
||||||
workingDirectory,
|
|
||||||
deletedFiles: allFilteredDiffFiles[ChangeTypeEnum.Deleted],
|
|
||||||
sha: diffResult.previousSha
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
const addedFiles = await getChangeTypeFiles({
|
const addedFiles = await getChangeTypeFiles({
|
||||||
inputs,
|
inputs,
|
||||||
changedFiles: allFilteredDiffFiles,
|
changedFiles: allFilteredDiffFiles,
|
||||||
|
@ -38,6 +38,10 @@ export type Inputs = {
|
|||||||
outputRenamedFilesAsDeletedAndAdded: boolean
|
outputRenamedFilesAsDeletedAndAdded: boolean
|
||||||
recoverDeletedFiles: boolean
|
recoverDeletedFiles: boolean
|
||||||
recoverDeletedFilesToDestination: string
|
recoverDeletedFilesToDestination: string
|
||||||
|
recoverFiles: string
|
||||||
|
recoverFilesSeparator: string
|
||||||
|
recoverFilesIgnore: string
|
||||||
|
recoverFilesIgnoreSeparator: string
|
||||||
token: string
|
token: string
|
||||||
apiUrl: string
|
apiUrl: string
|
||||||
skipInitialFetch: boolean
|
skipInitialFetch: boolean
|
||||||
@ -153,6 +157,21 @@ export const getInputs = (): Inputs => {
|
|||||||
'recover_deleted_files_to_destination',
|
'recover_deleted_files_to_destination',
|
||||||
{required: false}
|
{required: false}
|
||||||
)
|
)
|
||||||
|
const recoverFiles = core.getInput('recover_files', {required: false})
|
||||||
|
const recoverFilesSeparator = core.getInput('recover_files_separator', {
|
||||||
|
required: false,
|
||||||
|
trimWhitespace: false
|
||||||
|
})
|
||||||
|
const recoverFilesIgnore = core.getInput('recover_files_ignore', {
|
||||||
|
required: false
|
||||||
|
})
|
||||||
|
const recoverFilesIgnoreSeparator = core.getInput(
|
||||||
|
'recover_files_ignore_separator',
|
||||||
|
{
|
||||||
|
required: false,
|
||||||
|
trimWhitespace: false
|
||||||
|
}
|
||||||
|
)
|
||||||
const token = core.getInput('token', {required: false})
|
const token = core.getInput('token', {required: false})
|
||||||
const apiUrl = core.getInput('api_url', {required: false})
|
const apiUrl = core.getInput('api_url', {required: false})
|
||||||
const skipInitialFetch = core.getBooleanInput('skip_initial_fetch', {
|
const skipInitialFetch = core.getBooleanInput('skip_initial_fetch', {
|
||||||
@ -186,6 +205,10 @@ export const getInputs = (): Inputs => {
|
|||||||
sinceLastRemoteCommit,
|
sinceLastRemoteCommit,
|
||||||
recoverDeletedFiles,
|
recoverDeletedFiles,
|
||||||
recoverDeletedFilesToDestination,
|
recoverDeletedFilesToDestination,
|
||||||
|
recoverFiles,
|
||||||
|
recoverFilesSeparator,
|
||||||
|
recoverFilesIgnore,
|
||||||
|
recoverFilesIgnoreSeparator,
|
||||||
includeAllOldNewRenamedFiles,
|
includeAllOldNewRenamedFiles,
|
||||||
oldNewSeparator,
|
oldNewSeparator,
|
||||||
oldNewFilesSeparator,
|
oldNewFilesSeparator,
|
||||||
|
149
src/main.ts
149
src/main.ts
@ -2,6 +2,8 @@ import * as core from '@actions/core'
|
|||||||
import * as github from '@actions/github'
|
import * as github from '@actions/github'
|
||||||
import path from 'path'
|
import path from 'path'
|
||||||
import {
|
import {
|
||||||
|
ChangedFiles,
|
||||||
|
ChangeTypeEnum,
|
||||||
getAllDiffFiles,
|
getAllDiffFiles,
|
||||||
getChangedFilesFromGithubAPI,
|
getChangedFilesFromGithubAPI,
|
||||||
getRenamedFiles
|
getRenamedFiles
|
||||||
@ -16,16 +18,65 @@ import {Env, getEnv} from './env'
|
|||||||
import {getInputs, Inputs} from './inputs'
|
import {getInputs, Inputs} from './inputs'
|
||||||
import {
|
import {
|
||||||
getFilePatterns,
|
getFilePatterns,
|
||||||
|
getRecoverFilePatterns,
|
||||||
getSubmodulePath,
|
getSubmodulePath,
|
||||||
getYamlFilePatterns,
|
getYamlFilePatterns,
|
||||||
hasLocalGitDirectory,
|
hasLocalGitDirectory,
|
||||||
isRepoShallow,
|
isRepoShallow,
|
||||||
|
recoverDeletedFiles,
|
||||||
setOutput,
|
setOutput,
|
||||||
submoduleExists,
|
submoduleExists,
|
||||||
updateGitGlobalConfig,
|
updateGitGlobalConfig,
|
||||||
verifyMinimumGitVersion
|
verifyMinimumGitVersion
|
||||||
} from './utils'
|
} from './utils'
|
||||||
|
|
||||||
|
const changedFilesOutput = async ({
|
||||||
|
filePatterns,
|
||||||
|
allDiffFiles,
|
||||||
|
inputs,
|
||||||
|
yamlFilePatterns
|
||||||
|
}: {
|
||||||
|
filePatterns: string[]
|
||||||
|
allDiffFiles: ChangedFiles
|
||||||
|
inputs: Inputs
|
||||||
|
yamlFilePatterns: Record<string, string[]>
|
||||||
|
}): Promise<void> => {
|
||||||
|
if (filePatterns.length > 0) {
|
||||||
|
core.startGroup('changed-files-patterns')
|
||||||
|
await setChangedFilesOutput({
|
||||||
|
allDiffFiles,
|
||||||
|
filePatterns,
|
||||||
|
inputs
|
||||||
|
})
|
||||||
|
core.info('All Done!')
|
||||||
|
core.endGroup()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Object.keys(yamlFilePatterns).length > 0) {
|
||||||
|
for (const key of Object.keys(yamlFilePatterns)) {
|
||||||
|
core.startGroup(`changed-files-yaml-${key}`)
|
||||||
|
await setChangedFilesOutput({
|
||||||
|
allDiffFiles,
|
||||||
|
filePatterns: yamlFilePatterns[key],
|
||||||
|
outputPrefix: key,
|
||||||
|
inputs
|
||||||
|
})
|
||||||
|
core.info('All Done!')
|
||||||
|
core.endGroup()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filePatterns.length === 0 && Object.keys(yamlFilePatterns).length === 0) {
|
||||||
|
core.startGroup('changed-files-all')
|
||||||
|
await setChangedFilesOutput({
|
||||||
|
allDiffFiles,
|
||||||
|
inputs
|
||||||
|
})
|
||||||
|
core.info('All Done!')
|
||||||
|
core.endGroup()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const getChangedFilesFromLocalGit = async ({
|
const getChangedFilesFromLocalGit = async ({
|
||||||
inputs,
|
inputs,
|
||||||
env,
|
env,
|
||||||
@ -125,47 +176,30 @@ const getChangedFilesFromLocalGit = async ({
|
|||||||
core.info('All Done!')
|
core.info('All Done!')
|
||||||
core.endGroup()
|
core.endGroup()
|
||||||
|
|
||||||
if (filePatterns.length > 0) {
|
if (inputs.recoverDeletedFiles) {
|
||||||
core.startGroup('changed-files-patterns')
|
let recoverPatterns = getRecoverFilePatterns({inputs})
|
||||||
await setChangedFilesOutput({
|
|
||||||
allDiffFiles,
|
|
||||||
filePatterns,
|
|
||||||
inputs,
|
|
||||||
workingDirectory,
|
|
||||||
diffResult
|
|
||||||
})
|
|
||||||
core.info('All Done!')
|
|
||||||
core.endGroup()
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Object.keys(yamlFilePatterns).length > 0) {
|
if (recoverPatterns.length > 0 && filePatterns.length > 0) {
|
||||||
for (const key of Object.keys(yamlFilePatterns)) {
|
core.info('No recover patterns found; defaulting to file patterns')
|
||||||
core.startGroup(`changed-files-yaml-${key}`)
|
recoverPatterns = filePatterns
|
||||||
await setChangedFilesOutput({
|
|
||||||
allDiffFiles,
|
|
||||||
filePatterns: yamlFilePatterns[key],
|
|
||||||
outputPrefix: key,
|
|
||||||
inputs,
|
|
||||||
workingDirectory,
|
|
||||||
diffResult
|
|
||||||
})
|
|
||||||
core.info('All Done!')
|
|
||||||
core.endGroup()
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (filePatterns.length === 0 && Object.keys(yamlFilePatterns).length === 0) {
|
await recoverDeletedFiles({
|
||||||
core.startGroup('changed-files-all')
|
|
||||||
await setChangedFilesOutput({
|
|
||||||
allDiffFiles,
|
|
||||||
inputs,
|
inputs,
|
||||||
workingDirectory,
|
workingDirectory,
|
||||||
diffResult
|
deletedFiles: allDiffFiles[ChangeTypeEnum.Deleted],
|
||||||
|
recoverPatterns,
|
||||||
|
sha: diffResult.previousSha
|
||||||
})
|
})
|
||||||
core.info('All Done!')
|
|
||||||
core.endGroup()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
await changedFilesOutput({
|
||||||
|
filePatterns,
|
||||||
|
allDiffFiles,
|
||||||
|
inputs,
|
||||||
|
yamlFilePatterns
|
||||||
|
})
|
||||||
|
|
||||||
if (inputs.includeAllOldNewRenamedFiles) {
|
if (inputs.includeAllOldNewRenamedFiles) {
|
||||||
core.startGroup('changed-files-all-old-new-renamed-files')
|
core.startGroup('changed-files-all-old-new-renamed-files')
|
||||||
const allOldNewRenamedFiles = await getRenamedFiles({
|
const allOldNewRenamedFiles = await getRenamedFiles({
|
||||||
@ -193,12 +227,10 @@ const getChangedFilesFromLocalGit = async ({
|
|||||||
|
|
||||||
const getChangedFilesFromRESTAPI = async ({
|
const getChangedFilesFromRESTAPI = async ({
|
||||||
inputs,
|
inputs,
|
||||||
workingDirectory,
|
|
||||||
filePatterns,
|
filePatterns,
|
||||||
yamlFilePatterns
|
yamlFilePatterns
|
||||||
}: {
|
}: {
|
||||||
inputs: Inputs
|
inputs: Inputs
|
||||||
workingDirectory: string
|
|
||||||
filePatterns: string[]
|
filePatterns: string[]
|
||||||
yamlFilePatterns: Record<string, string[]>
|
yamlFilePatterns: Record<string, string[]>
|
||||||
}): Promise<void> => {
|
}): Promise<void> => {
|
||||||
@ -208,43 +240,12 @@ const getChangedFilesFromRESTAPI = async ({
|
|||||||
core.debug(`All diff files: ${JSON.stringify(allDiffFiles)}`)
|
core.debug(`All diff files: ${JSON.stringify(allDiffFiles)}`)
|
||||||
core.info('All Done!')
|
core.info('All Done!')
|
||||||
|
|
||||||
if (filePatterns.length > 0) {
|
await changedFilesOutput({
|
||||||
core.startGroup('changed-files-patterns')
|
filePatterns,
|
||||||
await setChangedFilesOutput({
|
allDiffFiles,
|
||||||
allDiffFiles,
|
inputs,
|
||||||
filePatterns,
|
yamlFilePatterns
|
||||||
inputs,
|
})
|
||||||
workingDirectory
|
|
||||||
})
|
|
||||||
core.info('All Done!')
|
|
||||||
core.endGroup()
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Object.keys(yamlFilePatterns).length > 0) {
|
|
||||||
for (const key of Object.keys(yamlFilePatterns)) {
|
|
||||||
core.startGroup(`changed-files-yaml-${key}`)
|
|
||||||
await setChangedFilesOutput({
|
|
||||||
allDiffFiles,
|
|
||||||
filePatterns: yamlFilePatterns[key],
|
|
||||||
outputPrefix: key,
|
|
||||||
inputs,
|
|
||||||
workingDirectory
|
|
||||||
})
|
|
||||||
core.info('All Done!')
|
|
||||||
core.endGroup()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (filePatterns.length === 0 && Object.keys(yamlFilePatterns).length === 0) {
|
|
||||||
core.startGroup('changed-files-all')
|
|
||||||
await setChangedFilesOutput({
|
|
||||||
allDiffFiles,
|
|
||||||
inputs,
|
|
||||||
workingDirectory
|
|
||||||
})
|
|
||||||
core.info('All Done!')
|
|
||||||
core.endGroup()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function run(): Promise<void> {
|
export async function run(): Promise<void> {
|
||||||
@ -256,8 +257,7 @@ export async function run(): Promise<void> {
|
|||||||
const inputs = getInputs()
|
const inputs = getInputs()
|
||||||
core.debug(`Inputs: ${JSON.stringify(inputs, null, 2)}`)
|
core.debug(`Inputs: ${JSON.stringify(inputs, null, 2)}`)
|
||||||
|
|
||||||
const githubContext = github.context
|
core.debug(`Github Context: ${JSON.stringify(github.context, null, 2)}`)
|
||||||
core.debug(`Github Context: ${JSON.stringify(githubContext, null, 2)}`)
|
|
||||||
|
|
||||||
const workingDirectory = path.resolve(
|
const workingDirectory = path.resolve(
|
||||||
env.GITHUB_WORKSPACE || process.cwd(),
|
env.GITHUB_WORKSPACE || process.cwd(),
|
||||||
@ -306,7 +306,6 @@ export async function run(): Promise<void> {
|
|||||||
}
|
}
|
||||||
await getChangedFilesFromRESTAPI({
|
await getChangedFilesFromRESTAPI({
|
||||||
inputs,
|
inputs,
|
||||||
workingDirectory,
|
|
||||||
filePatterns,
|
filePatterns,
|
||||||
yamlFilePatterns
|
yamlFilePatterns
|
||||||
})
|
})
|
||||||
|
80
src/utils.ts
80
src/utils.ts
@ -1028,6 +1028,36 @@ export const getYamlFilePatterns = async ({
|
|||||||
return filePatterns
|
return filePatterns
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const getRecoverFilePatterns = ({
|
||||||
|
inputs
|
||||||
|
}: {
|
||||||
|
inputs: Inputs
|
||||||
|
}): string[] => {
|
||||||
|
let filePatterns: string[] = inputs.recoverFiles.split(
|
||||||
|
inputs.recoverFilesSeparator
|
||||||
|
)
|
||||||
|
|
||||||
|
if (inputs.recoverFilesIgnore) {
|
||||||
|
const ignoreFilePatterns = inputs.recoverFilesIgnore.split(
|
||||||
|
inputs.recoverFilesSeparator
|
||||||
|
)
|
||||||
|
|
||||||
|
filePatterns = filePatterns.concat(
|
||||||
|
ignoreFilePatterns.map(p => {
|
||||||
|
if (p.startsWith('!')) {
|
||||||
|
return p
|
||||||
|
} else {
|
||||||
|
return `!${p}`
|
||||||
|
}
|
||||||
|
})
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
core.debug(`recover file patterns: ${filePatterns}`)
|
||||||
|
|
||||||
|
return filePatterns.filter(Boolean)
|
||||||
|
}
|
||||||
|
|
||||||
export const setOutput = async ({
|
export const setOutput = async ({
|
||||||
key,
|
key,
|
||||||
value,
|
value,
|
||||||
@ -1084,36 +1114,48 @@ export const recoverDeletedFiles = async ({
|
|||||||
inputs,
|
inputs,
|
||||||
workingDirectory,
|
workingDirectory,
|
||||||
deletedFiles,
|
deletedFiles,
|
||||||
|
recoverPatterns,
|
||||||
sha
|
sha
|
||||||
}: {
|
}: {
|
||||||
inputs: Inputs
|
inputs: Inputs
|
||||||
workingDirectory: string
|
workingDirectory: string
|
||||||
deletedFiles: string[]
|
deletedFiles: string[]
|
||||||
|
recoverPatterns: string[]
|
||||||
sha: string
|
sha: string
|
||||||
}): Promise<void> => {
|
}): Promise<void> => {
|
||||||
if (inputs.recoverDeletedFiles) {
|
let recoverableDeletedFiles = deletedFiles
|
||||||
for (const deletedFile of deletedFiles) {
|
core.debug(`recoverable deleted files: ${recoverableDeletedFiles}`)
|
||||||
let target = path.join(workingDirectory, deletedFile)
|
|
||||||
|
|
||||||
if (inputs.recoverDeletedFilesToDestination) {
|
if (recoverPatterns.length > 0) {
|
||||||
target = path.join(
|
recoverableDeletedFiles = mm(deletedFiles, recoverPatterns, {
|
||||||
workingDirectory,
|
dot: true,
|
||||||
inputs.recoverDeletedFilesToDestination,
|
windows: IS_WINDOWS,
|
||||||
deletedFile
|
noext: true
|
||||||
)
|
})
|
||||||
}
|
core.debug(`filtered recoverable deleted files: ${recoverableDeletedFiles}`)
|
||||||
|
}
|
||||||
|
|
||||||
const deletedFileContents = await getDeletedFileContents({
|
for (const deletedFile of recoverableDeletedFiles) {
|
||||||
cwd: workingDirectory,
|
let target = path.join(workingDirectory, deletedFile)
|
||||||
filePath: deletedFile,
|
|
||||||
sha
|
|
||||||
})
|
|
||||||
|
|
||||||
if (!(await exists(path.dirname(target)))) {
|
if (inputs.recoverDeletedFilesToDestination) {
|
||||||
await fs.mkdir(path.dirname(target), {recursive: true})
|
target = path.join(
|
||||||
}
|
workingDirectory,
|
||||||
await fs.writeFile(target, deletedFileContents)
|
inputs.recoverDeletedFilesToDestination,
|
||||||
|
deletedFile
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const deletedFileContents = await getDeletedFileContents({
|
||||||
|
cwd: workingDirectory,
|
||||||
|
filePath: deletedFile,
|
||||||
|
sha
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!(await exists(path.dirname(target)))) {
|
||||||
|
await fs.mkdir(path.dirname(target), {recursive: true})
|
||||||
|
}
|
||||||
|
await fs.writeFile(target, deletedFileContents)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user