mirror of
https://github.com/softprops/action-gh-release.git
synced 2025-10-09 08:56:12 +00:00
feat: respect working_directory for files globs; add input and tests
This commit is contained in:
parent
97d42c1b50
commit
d74248fff0
4 changed files with 50 additions and 8 deletions
|
@ -128,6 +128,7 @@ describe('util', () => {
|
||||||
github_ref: '',
|
github_ref: '',
|
||||||
github_repository: '',
|
github_repository: '',
|
||||||
github_token: '',
|
github_token: '',
|
||||||
|
input_working_directory: undefined,
|
||||||
input_append_body: false,
|
input_append_body: false,
|
||||||
input_body: undefined,
|
input_body: undefined,
|
||||||
input_body_path: undefined,
|
input_body_path: undefined,
|
||||||
|
@ -156,6 +157,7 @@ describe('util', () => {
|
||||||
github_ref: '',
|
github_ref: '',
|
||||||
github_repository: '',
|
github_repository: '',
|
||||||
github_token: '',
|
github_token: '',
|
||||||
|
input_working_directory: undefined,
|
||||||
input_append_body: false,
|
input_append_body: false,
|
||||||
input_body: undefined,
|
input_body: undefined,
|
||||||
input_body_path: undefined,
|
input_body_path: undefined,
|
||||||
|
@ -183,6 +185,7 @@ describe('util', () => {
|
||||||
github_ref: '',
|
github_ref: '',
|
||||||
github_repository: '',
|
github_repository: '',
|
||||||
github_token: '',
|
github_token: '',
|
||||||
|
input_working_directory: undefined,
|
||||||
input_append_body: false,
|
input_append_body: false,
|
||||||
input_body: undefined,
|
input_body: undefined,
|
||||||
input_body_path: undefined,
|
input_body_path: undefined,
|
||||||
|
@ -211,6 +214,7 @@ describe('util', () => {
|
||||||
github_ref: '',
|
github_ref: '',
|
||||||
github_repository: '',
|
github_repository: '',
|
||||||
github_token: '',
|
github_token: '',
|
||||||
|
input_working_directory: undefined,
|
||||||
input_append_body: false,
|
input_append_body: false,
|
||||||
input_body: undefined,
|
input_body: undefined,
|
||||||
input_body_path: undefined,
|
input_body_path: undefined,
|
||||||
|
@ -243,6 +247,7 @@ describe('util', () => {
|
||||||
github_ref: '',
|
github_ref: '',
|
||||||
github_repository: '',
|
github_repository: '',
|
||||||
github_token: 'env-token',
|
github_token: 'env-token',
|
||||||
|
input_working_directory: undefined,
|
||||||
input_append_body: false,
|
input_append_body: false,
|
||||||
input_body: undefined,
|
input_body: undefined,
|
||||||
input_body_path: undefined,
|
input_body_path: undefined,
|
||||||
|
@ -272,6 +277,7 @@ describe('util', () => {
|
||||||
github_ref: '',
|
github_ref: '',
|
||||||
github_repository: '',
|
github_repository: '',
|
||||||
github_token: 'input-token',
|
github_token: 'input-token',
|
||||||
|
input_working_directory: undefined,
|
||||||
input_append_body: false,
|
input_append_body: false,
|
||||||
input_body: undefined,
|
input_body: undefined,
|
||||||
input_body_path: undefined,
|
input_body_path: undefined,
|
||||||
|
@ -300,6 +306,7 @@ describe('util', () => {
|
||||||
github_ref: '',
|
github_ref: '',
|
||||||
github_repository: '',
|
github_repository: '',
|
||||||
github_token: '',
|
github_token: '',
|
||||||
|
input_working_directory: undefined,
|
||||||
input_append_body: false,
|
input_append_body: false,
|
||||||
input_body: undefined,
|
input_body: undefined,
|
||||||
input_body_path: undefined,
|
input_body_path: undefined,
|
||||||
|
@ -327,6 +334,7 @@ describe('util', () => {
|
||||||
github_ref: '',
|
github_ref: '',
|
||||||
github_repository: '',
|
github_repository: '',
|
||||||
github_token: '',
|
github_token: '',
|
||||||
|
input_working_directory: undefined,
|
||||||
input_append_body: false,
|
input_append_body: false,
|
||||||
input_body: undefined,
|
input_body: undefined,
|
||||||
input_body_path: undefined,
|
input_body_path: undefined,
|
||||||
|
@ -354,6 +362,7 @@ describe('util', () => {
|
||||||
github_ref: '',
|
github_ref: '',
|
||||||
github_repository: '',
|
github_repository: '',
|
||||||
github_token: '',
|
github_token: '',
|
||||||
|
input_working_directory: undefined,
|
||||||
input_append_body: true,
|
input_append_body: true,
|
||||||
input_body: undefined,
|
input_body: undefined,
|
||||||
input_body_path: undefined,
|
input_body_path: undefined,
|
||||||
|
@ -388,6 +397,10 @@ describe('util', () => {
|
||||||
'tests/data/foo/bar.txt',
|
'tests/data/foo/bar.txt',
|
||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('resolves files relative to working_directory', async () => {
|
||||||
|
assert.deepStrictEqual(paths(['data/**/*'], 'tests'), ['tests/data/foo/bar.txt']);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('unmatchedPatterns', () => {
|
describe('unmatchedPatterns', () => {
|
||||||
|
@ -397,6 +410,12 @@ describe('util', () => {
|
||||||
['tests/data/does/not/exist/*'],
|
['tests/data/does/not/exist/*'],
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('resolves unmatched relative to working_directory', async () => {
|
||||||
|
assert.deepStrictEqual(unmatchedPatterns(['data/does/not/exist/*'], 'tests'), [
|
||||||
|
'data/does/not/exist/*',
|
||||||
|
]);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('replaceSpacesWithDots', () => {
|
describe('replaceSpacesWithDots', () => {
|
||||||
|
|
|
@ -27,6 +27,9 @@ inputs:
|
||||||
files:
|
files:
|
||||||
description: "Newline-delimited list of path globs for asset files to upload"
|
description: "Newline-delimited list of path globs for asset files to upload"
|
||||||
required: false
|
required: false
|
||||||
|
working_directory:
|
||||||
|
description: "Base directory to resolve 'files' globs against (defaults to job working-directory)"
|
||||||
|
required: false
|
||||||
overwrite_files:
|
overwrite_files:
|
||||||
description: "Overwrite existing files with the same name. Defaults to true"
|
description: "Overwrite existing files with the same name. Defaults to true"
|
||||||
required: false
|
required: false
|
||||||
|
|
|
@ -12,7 +12,7 @@ async function run() {
|
||||||
throw new Error(`⚠️ GitHub Releases requires a tag`);
|
throw new Error(`⚠️ GitHub Releases requires a tag`);
|
||||||
}
|
}
|
||||||
if (config.input_files) {
|
if (config.input_files) {
|
||||||
const patterns = unmatchedPatterns(config.input_files);
|
const patterns = unmatchedPatterns(config.input_files, config.input_working_directory);
|
||||||
patterns.forEach((pattern) => {
|
patterns.forEach((pattern) => {
|
||||||
if (config.input_fail_on_unmatched_files) {
|
if (config.input_fail_on_unmatched_files) {
|
||||||
throw new Error(`⚠️ Pattern '${pattern}' does not match any files.`);
|
throw new Error(`⚠️ Pattern '${pattern}' does not match any files.`);
|
||||||
|
@ -50,7 +50,7 @@ async function run() {
|
||||||
//);
|
//);
|
||||||
const rel = await release(config, new GitHubReleaser(gh));
|
const rel = await release(config, new GitHubReleaser(gh));
|
||||||
if (config.input_files && config.input_files.length > 0) {
|
if (config.input_files && config.input_files.length > 0) {
|
||||||
const files = paths(config.input_files);
|
const files = paths(config.input_files, config.input_working_directory);
|
||||||
if (files.length == 0) {
|
if (files.length == 0) {
|
||||||
if (config.input_fail_on_unmatched_files) {
|
if (config.input_fail_on_unmatched_files) {
|
||||||
throw new Error(`⚠️ ${config.input_files} does not include a valid file.`);
|
throw new Error(`⚠️ ${config.input_files} does not include a valid file.`);
|
||||||
|
|
32
src/util.ts
32
src/util.ts
|
@ -1,5 +1,6 @@
|
||||||
import * as glob from 'glob';
|
import * as glob from 'glob';
|
||||||
import { statSync, readFileSync } from 'fs';
|
import { statSync, readFileSync } from 'fs';
|
||||||
|
import * as pathLib from 'path';
|
||||||
|
|
||||||
export interface Config {
|
export interface Config {
|
||||||
github_token: string;
|
github_token: string;
|
||||||
|
@ -12,6 +13,7 @@ export interface Config {
|
||||||
input_body?: string;
|
input_body?: string;
|
||||||
input_body_path?: string;
|
input_body_path?: string;
|
||||||
input_files?: string[];
|
input_files?: string[];
|
||||||
|
input_working_directory?: string;
|
||||||
input_overwrite_files?: boolean;
|
input_overwrite_files?: boolean;
|
||||||
input_draft?: boolean;
|
input_draft?: boolean;
|
||||||
input_preserve_order?: boolean;
|
input_preserve_order?: boolean;
|
||||||
|
@ -62,6 +64,7 @@ export const parseConfig = (env: Env): Config => {
|
||||||
input_body: env.INPUT_BODY,
|
input_body: env.INPUT_BODY,
|
||||||
input_body_path: env.INPUT_BODY_PATH,
|
input_body_path: env.INPUT_BODY_PATH,
|
||||||
input_files: parseInputFiles(env.INPUT_FILES || ''),
|
input_files: parseInputFiles(env.INPUT_FILES || ''),
|
||||||
|
input_working_directory: env.INPUT_WORKING_DIRECTORY || undefined,
|
||||||
input_overwrite_files: env.INPUT_OVERWRITE_FILES
|
input_overwrite_files: env.INPUT_OVERWRITE_FILES
|
||||||
? env.INPUT_OVERWRITE_FILES == 'true'
|
? env.INPUT_OVERWRITE_FILES == 'true'
|
||||||
: undefined,
|
: undefined,
|
||||||
|
@ -84,17 +87,34 @@ const parseMakeLatest = (value: string | undefined): 'true' | 'false' | 'legacy'
|
||||||
return undefined;
|
return undefined;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const paths = (patterns: string[]): string[] => {
|
export const paths = (patterns: string[], cwd?: string): string[] => {
|
||||||
return patterns.reduce((acc: string[], pattern: string): string[] => {
|
return patterns.reduce((acc: string[], pattern: string): string[] => {
|
||||||
return acc.concat(glob.sync(pattern).filter((path) => statSync(path).isFile()));
|
const matches = glob.sync(pattern, { cwd, dot: true, absolute: false });
|
||||||
|
const resolved = matches
|
||||||
|
.map((p) => (cwd ? pathLib.join(cwd, p) : p))
|
||||||
|
.filter((p) => {
|
||||||
|
try {
|
||||||
|
return statSync(p).isFile();
|
||||||
|
} catch {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return acc.concat(resolved);
|
||||||
}, []);
|
}, []);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const unmatchedPatterns = (patterns: string[]): string[] => {
|
export const unmatchedPatterns = (patterns: string[], cwd?: string): string[] => {
|
||||||
return patterns.reduce((acc: string[], pattern: string): string[] => {
|
return patterns.reduce((acc: string[], pattern: string): string[] => {
|
||||||
return acc.concat(
|
const matches = glob.sync(pattern, { cwd, dot: true, absolute: false });
|
||||||
glob.sync(pattern).filter((path) => statSync(path).isFile()).length == 0 ? [pattern] : [],
|
const files = matches.filter((p) => {
|
||||||
);
|
try {
|
||||||
|
const full = cwd ? pathLib.join(cwd, p) : p;
|
||||||
|
return statSync(full).isFile();
|
||||||
|
} catch {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return acc.concat(files.length == 0 ? [pattern] : []);
|
||||||
}, []);
|
}, []);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue