Expose `rootDirectory` input from @actions/artifact

Closes #344
pull/380/head
Carl Csaposs 2023-01-13 13:15:21 +00:00
parent 65d862660a
commit c7b5199c2b
8 changed files with 51 additions and 6 deletions

View File

@ -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__',

View File

@ -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'

16
dist/index.js vendored
View File

@ -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) {

View File

@ -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 {

View File

@ -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)

View File

@ -80,6 +80,7 @@ function getMultiPathLCA(searchPaths: string[]): string {
export async function findFilesToUpload(
searchPath: string,
manualRootDirectory?: string,
globOptions?: glob.GlobOptions
): Promise<SearchResult> {
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()

View File

@ -7,7 +7,10 @@ import {NoFileOptions} from './constants'
async function run(): Promise<void> {
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) {

View File

@ -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
}