diff --git a/__tests__/search.test.ts b/__tests__/search.test.ts index cbf54ac1..e5719622 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 94a583af..6a02d8b8 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 b971c09b..fee9812c 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 9d64a615..0078986a 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 83448236..c2d59c47 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 bd801648..af2d4491 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 44c74bf6..65ec55bc 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 37325df3..5e5a7727 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 }