Skip to content

Commit

Permalink
Expose rootDirectory input from @actions/artifact
Browse files Browse the repository at this point in the history
  • Loading branch information
carlcsaposs-canonical committed Jan 13, 2023
1 parent 65d8626 commit c7b5199
Show file tree
Hide file tree
Showing 8 changed files with 51 additions and 6 deletions.
11 changes: 11 additions & 0 deletions __tests__/search.test.ts
Expand Up @@ -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__',
Expand Down
4 changes: 4 additions & 0 deletions action.yml
Expand Up @@ -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 changes: 13 additions & 3 deletions dist/index.js
Expand Up @@ -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) {
Expand Down Expand Up @@ -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) {
Expand All @@ -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) {
Expand Down Expand Up @@ -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());
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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) {
Expand Down
3 changes: 2 additions & 1 deletion src/constants.ts
Expand Up @@ -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 {
Expand Down
4 changes: 3 additions & 1 deletion src/input-helper.ts
Expand Up @@ -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]
Expand All @@ -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)
Expand Down
9 changes: 9 additions & 0 deletions src/search.ts
Expand Up @@ -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[] = []
Expand Down Expand Up @@ -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()

Expand Down
5 changes: 4 additions & 1 deletion src/upload-artifact.ts
Expand Up @@ -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) {
Expand Down
5 changes: 5 additions & 0 deletions src/upload-inputs.ts
Expand Up @@ -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
}

0 comments on commit c7b5199

Please sign in to comment.