Release filter by pattern, show outputs, fail if not found

This commit is contained in:
Giao Ho
2021-04-03 13:47:29 +07:00
parent 5805694f11
commit 815f0ac77d
6 changed files with 82 additions and 35 deletions
-1
View File
@@ -10,7 +10,6 @@ trim_trailing_whitespace = true
[*.{js, ts}]
indent_size = 4
quote_type = single
ij_javascript_use_double_quotes = false
ij_typescript_use_double_quotes = false
ij_javascript_import_sort_members = true
+11 -5
View File
@@ -11,13 +11,19 @@ inputs:
required: false
default: 'false'
prerelease:
description: Find the latest release including pre-releases
# This input will be ignored if `latest = false`
description: Find the latest release including the pre-releases
required: false
default: 'false' # Default: ignore pre-releases when finding the latest release
draft:
description: Find the latest release including draft releases
pattern:
description: A pattern string to filter the releases by tag_name
required: false
debug:
description: Show ouputs
required: false
throwing:
description: Fail when no release was found
required: false
default: 'false' # Default: ignore draft releases when finding the latest release
runs:
using: node12
main: action/index.js
+33 -13
View File
@@ -5900,8 +5900,10 @@ var Inputs;
(function (Inputs) {
Inputs["TagName"] = "tag_name";
Inputs["Latest"] = "latest";
Inputs["Draft"] = "draft";
Inputs["Pattern"] = "pattern";
Inputs["PreRelease"] = "prerelease";
Inputs["Debug"] = "debug";
Inputs["Throwing"] = "throwing";
})(Inputs = exports.Inputs || (exports.Inputs = {}));
var Outputs;
(function (Outputs) {
@@ -5958,7 +5960,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
});
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.findLatestRelease = exports.isSuccessStatusCode = void 0;
exports.notFoundRelease = exports.findLatestRelease = exports.isSuccessStatusCode = void 0;
const core = __importStar(__nccwpck_require__(832));
const github_1 = __nccwpck_require__(572);
const io_helper_1 = __nccwpck_require__(923);
@@ -5980,6 +5982,13 @@ function findLatestRelease(releases) {
return result;
}
exports.findLatestRelease = findLatestRelease;
function notFoundRelease(message, throwing) {
if (throwing)
throw new Error(message);
else
core.warning(message);
}
exports.notFoundRelease = notFoundRelease;
(function run() {
return __awaiter(this, void 0, void 0, function* () {
try {
@@ -5990,26 +5999,25 @@ exports.findLatestRelease = findLatestRelease;
const releaseResponse = yield github.repos
.getReleaseByTag({ owner, repo, tag: inputs.tag });
if (isSuccessStatusCode(releaseResponse.status))
io_helper_1.setOutputs(releaseResponse.data);
else {
io_helper_1.setOutputs(releaseResponse.data, inputs.debug);
else
throw new Error(`Unexpected http ${releaseResponse.status} during get release`);
}
}
else {
const listResponse = yield github.repos.listReleases({ owner, repo });
if (isSuccessStatusCode(listResponse.status)) {
const releaseList = listResponse.data
.filter(release => (!release.prerelease || inputs.prerelease) &&
(!release.draft || inputs.draft));
.filter(release => !release.draft &&
(!release.prerelease || inputs.prerelease) &&
(!inputs.pattern || inputs.pattern.test(release.tag_name)));
const latestRelease = findLatestRelease(releaseList);
if (latestRelease != null)
io_helper_1.setOutputs(latestRelease);
io_helper_1.setOutputs(latestRelease, inputs.debug);
else
core.info('The latest release was not found');
notFoundRelease('The latest release was not found', inputs.throwing);
}
else {
else
throw new Error(`Unexpected http ${listResponse.status} during get release list`);
}
}
}
catch (err) {
@@ -6069,15 +6077,27 @@ function getInputs() {
result.tag = github_1.context.ref.replace('refs/tags/', '');
result.latest = getBooleanInput(constants_1.Inputs.Latest, { required: false });
if (result.latest) {
result.draft = getBooleanInput(constants_1.Inputs.Draft, { required: false });
const pattern = core.getInput(constants_1.Inputs.Pattern, { required: false });
if (typeof pattern === 'string') {
try {
result.pattern = new RegExp(pattern);
}
catch (e) {
delete result.pattern;
}
}
result.prerelease = getBooleanInput(constants_1.Inputs.PreRelease, { required: false });
}
}
result.debug = getBooleanInput(constants_1.Inputs.Debug, { required: false });
result.throwing = getBooleanInput(constants_1.Inputs.Throwing, { required: false });
return result;
}
exports.getInputs = getInputs;
function setOutputs(outputs) {
function setOutputs(outputs, log) {
const { id, node_id, url, html_url, upload_url, assets_url, name, tag_name, body, draft, prerelease, target_commitish, created_at, published_at } = outputs;
if (log)
core.debug(JSON.stringify(outputs));
core.setOutput(constants_1.Outputs.Id, id.toString());
core.setOutput(constants_1.Outputs.NodeId, node_id);
core.setOutput(constants_1.Outputs.Url, url);
+4 -2
View File
@@ -1,8 +1,10 @@
export enum Inputs {
TagName = 'tag_name',
Latest = 'latest',
Draft = 'draft',
PreRelease = 'prerelease'
Pattern = 'pattern',
PreRelease = 'prerelease',
Debug = 'debug',
Throwing = 'throwing'
}
export enum Outputs {
+14 -10
View File
@@ -10,6 +10,7 @@ export function isSuccessStatusCode(statusCode?: number): boolean {
export function findLatestRelease(releases: any[]): any {
let result: any, latest: number = 0;
// Find the latest release by `published_at`
releases.forEach(release => {
const publishedDate: number = release.published_at ? Date.parse(release.published_at) : 0;
if (result == null || latest < publishedDate) {
@@ -21,6 +22,12 @@ export function findLatestRelease(releases: any[]): any {
return result;
}
export function notFoundRelease(message: string, throwing: boolean) {
if (throwing)
throw new Error(message);
else core.warning(message);
}
(async function run() {
try {
const inputs: ReleaseInputs = getInputs();
@@ -34,27 +41,24 @@ export function findLatestRelease(releases: any[]): any {
.getReleaseByTag({owner, repo, tag: inputs.tag});
if (isSuccessStatusCode(releaseResponse.status))
setOutputs(releaseResponse.data);
else {
setOutputs(releaseResponse.data, inputs.debug);
else
throw new Error(`Unexpected http ${releaseResponse.status} during get release`);
}
} else {
const listResponse = await github.repos.listReleases({owner, repo});
if (isSuccessStatusCode(listResponse.status)) {
const releaseList = listResponse.data
.filter(release =>
.filter(release => !release.draft &&
(!release.prerelease || inputs.prerelease) &&
(!release.draft || inputs.draft));
(!inputs.pattern || inputs.pattern.test(release.tag_name)));
// Find the latest release by `published_at`
const latestRelease: any = findLatestRelease(releaseList);
if (latestRelease != null)
setOutputs(latestRelease);
else core.info('The latest release was not found');
} else {
setOutputs(latestRelease, inputs.debug);
else notFoundRelease('The latest release was not found', inputs.throwing);
} else
throw new Error(`Unexpected http ${listResponse.status} during get release list`);
}
}
} catch (err) {
core.setFailed(err.message);
+20 -4
View File
@@ -1,5 +1,5 @@
import {InputOptions} from '@actions/core';
import * as core from '@actions/core';
import {InputOptions} from '@actions/core';
import {context} from '@actions/github';
import {Inputs, Outputs} from './constants';
@@ -7,8 +7,11 @@ export interface ReleaseInputs {
tag: string;
latest: boolean;
draft: boolean;
pattern: RegExp;
prerelease: boolean;
debug: boolean;
throwing: boolean;
}
export function getBooleanInput(name: string, options?: InputOptions): boolean {
@@ -36,15 +39,25 @@ export function getInputs(): ReleaseInputs {
result.latest = getBooleanInput(Inputs.Latest, {required: false});
if (result.latest) {
result.draft = getBooleanInput(Inputs.Draft, {required: false});
const pattern = core.getInput(Inputs.Pattern, {required: false});
if (typeof pattern === 'string') {
try {
result.pattern = new RegExp(pattern);
} catch (e) {
delete result.pattern;
}
}
result.prerelease = getBooleanInput(Inputs.PreRelease, {required: false});
}
}
result.debug = getBooleanInput(Inputs.Debug, {required: false});
result.throwing = getBooleanInput(Inputs.Throwing, {required: false});
return result;
}
export function setOutputs(outputs: any) {
export function setOutputs(outputs: any, log?: boolean) {
// Get the outputs for the created release from the response
const {
id,
@@ -63,6 +76,9 @@ export function setOutputs(outputs: any) {
published_at
} = outputs;
if (log)
core.debug(JSON.stringify(outputs));
core.setOutput(Outputs.Id, id.toString());
core.setOutput(Outputs.NodeId, node_id);
core.setOutput(Outputs.Url, url);