From c7b5199c2bd5b2704623dd4e72fa1d1e9cf02bdb Mon Sep 17 00:00:00 2001 From: Carl Csaposs Date: Fri, 13 Jan 2023 13:15:21 +0000 Subject: [PATCH] Expose `rootDirectory` input from @actions/artifact Closes #344 --- __tests__/search.test.ts | 11 +++++++++++ action.yml | 4 ++++ dist/index.js | 16 +++++++++++++--- src/constants.ts | 3 ++- src/input-helper.ts | 4 +++- src/search.ts | 9 +++++++++ src/upload-artifact.ts | 5 ++++- src/upload-inputs.ts | 5 +++++ 8 files changed, 51 insertions(+), 6 deletions(-) diff --git a/__tests__/search.test.ts b/__tests__/search.test.ts index cbf54ac..e571962 100644 --- a/__tests__/search.test.ts +++ b/__tests__/search.test.ts @@ -149,6 +149,17 @@ describe('Search', () => { ) }) + it('Single file search - Absolute Path - Manual directory', async () => { + const rootDirectory = path.join(root, 'folder-a') + const searchResult = await findFilesToUpload( + extraFileInFolderCPath, + rootDirectory + ) + expect(searchResult.filesToUpload.length).toEqual(1) + expect(searchResult.filesToUpload[0]).toEqual(extraFileInFolderCPath) + expect(searchResult.rootDirectory).toEqual(rootDirectory) + }) + it('Single file search - Relative Path', async () => { const relativePath = path.join( '__tests__', diff --git a/action.yml b/action.yml index 94a583a..6a02d8b 100644 --- a/action.yml +++ b/action.yml @@ -23,6 +23,10 @@ inputs: Minimum 1 day. Maximum 90 days unless changed from the repository settings page. + root-directory: + description: > + A file path that denotes the root directory of the files being uploaded. + This path is used to strip the provided path(s) to control how they are uploaded and structured runs: using: 'node16' main: 'dist/index.js' diff --git a/dist/index.js b/dist/index.js index b971c09..fee9812 100644 --- a/dist/index.js +++ b/dist/index.js @@ -10688,6 +10688,7 @@ var Inputs; Inputs["Path"] = "path"; Inputs["IfNoFilesFound"] = "if-no-files-found"; Inputs["RetentionDays"] = "retention-days"; + Inputs["RootDirectory"] = "root-directory"; })(Inputs = exports.Inputs || (exports.Inputs = {})); var NoFileOptions; (function (NoFileOptions) { @@ -10746,6 +10747,7 @@ const constants_1 = __nccwpck_require__(9042); function getInputs() { const name = core.getInput(constants_1.Inputs.Name); const path = core.getInput(constants_1.Inputs.Path, { required: true }); + const rootDirectory = core.getInput(constants_1.Inputs.RootDirectory); const ifNoFilesFound = core.getInput(constants_1.Inputs.IfNoFilesFound); const noFileBehavior = constants_1.NoFileOptions[ifNoFilesFound]; if (!noFileBehavior) { @@ -10754,7 +10756,8 @@ function getInputs() { const inputs = { artifactName: name, searchPath: path, - ifNoFilesFound: noFileBehavior + ifNoFilesFound: noFileBehavior, + rootDirectory: rootDirectory }; const retentionDaysStr = core.getInput(constants_1.Inputs.RetentionDays); if (retentionDaysStr) { @@ -10874,7 +10877,7 @@ function getMultiPathLCA(searchPaths) { } return path.join(...commonPaths); } -function findFilesToUpload(searchPath, globOptions) { +function findFilesToUpload(searchPath, manualRootDirectory, globOptions) { return __awaiter(this, void 0, void 0, function* () { const searchResults = []; const globber = yield glob.create(searchPath, globOptions || getDefaultGlobOptions()); @@ -10906,6 +10909,13 @@ function findFilesToUpload(searchPath, globOptions) { (0, core_1.debug)(`Removing ${searchResult} from rawSearchResults because it is a directory`); } } + // Root directory manually set in inputs + if (manualRootDirectory) { + return { + filesToUpload: searchResults, + rootDirectory: manualRootDirectory + }; + } // Calculate the root directory for the artifact using the search paths that were utilized const searchPaths = globber.getSearchPaths(); if (searchPaths.length > 1) { @@ -10985,7 +10995,7 @@ function run() { return __awaiter(this, void 0, void 0, function* () { try { const inputs = (0, input_helper_1.getInputs)(); - const searchResult = yield (0, search_1.findFilesToUpload)(inputs.searchPath); + const searchResult = yield (0, search_1.findFilesToUpload)(inputs.searchPath, inputs.rootDirectory); if (searchResult.filesToUpload.length === 0) { // No files were found, different use cases warrant different types of behavior if nothing is found switch (inputs.ifNoFilesFound) { diff --git a/src/constants.ts b/src/constants.ts index 9d64a61..0078986 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -3,7 +3,8 @@ export enum Inputs { Name = 'name', Path = 'path', IfNoFilesFound = 'if-no-files-found', - RetentionDays = 'retention-days' + RetentionDays = 'retention-days', + RootDirectory = 'root-directory' } export enum NoFileOptions { diff --git a/src/input-helper.ts b/src/input-helper.ts index 8344823..c2d59c4 100644 --- a/src/input-helper.ts +++ b/src/input-helper.ts @@ -8,6 +8,7 @@ import {UploadInputs} from './upload-inputs' export function getInputs(): UploadInputs { const name = core.getInput(Inputs.Name) const path = core.getInput(Inputs.Path, {required: true}) + const rootDirectory = core.getInput(Inputs.RootDirectory) const ifNoFilesFound = core.getInput(Inputs.IfNoFilesFound) const noFileBehavior: NoFileOptions = NoFileOptions[ifNoFilesFound] @@ -25,7 +26,8 @@ export function getInputs(): UploadInputs { const inputs = { artifactName: name, searchPath: path, - ifNoFilesFound: noFileBehavior + ifNoFilesFound: noFileBehavior, + rootDirectory: rootDirectory } as UploadInputs const retentionDaysStr = core.getInput(Inputs.RetentionDays) diff --git a/src/search.ts b/src/search.ts index bd80164..af2d449 100644 --- a/src/search.ts +++ b/src/search.ts @@ -80,6 +80,7 @@ function getMultiPathLCA(searchPaths: string[]): string { export async function findFilesToUpload( searchPath: string, + manualRootDirectory?: string, globOptions?: glob.GlobOptions ): Promise { const searchResults: string[] = [] @@ -121,6 +122,14 @@ export async function findFilesToUpload( } } + // Root directory manually set in inputs + if (manualRootDirectory) { + return { + filesToUpload: searchResults, + rootDirectory: manualRootDirectory + } + } + // Calculate the root directory for the artifact using the search paths that were utilized const searchPaths: string[] = globber.getSearchPaths() diff --git a/src/upload-artifact.ts b/src/upload-artifact.ts index 44c74bf..65ec55b 100644 --- a/src/upload-artifact.ts +++ b/src/upload-artifact.ts @@ -7,7 +7,10 @@ import {NoFileOptions} from './constants' async function run(): Promise { try { const inputs = getInputs() - const searchResult = await findFilesToUpload(inputs.searchPath) + const searchResult = await findFilesToUpload( + inputs.searchPath, + inputs.rootDirectory + ) if (searchResult.filesToUpload.length === 0) { // No files were found, different use cases warrant different types of behavior if nothing is found switch (inputs.ifNoFilesFound) { diff --git a/src/upload-inputs.ts b/src/upload-inputs.ts index 37325df..5e5a772 100644 --- a/src/upload-inputs.ts +++ b/src/upload-inputs.ts @@ -20,4 +20,9 @@ export interface UploadInputs { * Duration after which artifact will expire in days */ retentionDays: number + + /** + * A file path that denotes the root directory of the files being uploaded + */ + rootDirectory: string }