diff --git a/action.yml b/action.yml index 7f1d3be..acf8c7a 100644 --- a/action.yml +++ b/action.yml @@ -2,6 +2,15 @@ name: Get Release description: Get a release by tag, latest or current release author: Giao Ho inputs: + owner: + # Default: Current owner + description: The name of the owner of the repo. Used to identify the owner of the repository. + required: false + repo: + # Default: Current repository + description: The name of the repository. Used to identify the repository on which to release. + required: false + tag_name: description: Specify tag instead of using checkout tag. required: false diff --git a/action/index.js b/action/index.js index cf17fed..7e39842 100644 --- a/action/index.js +++ b/action/index.js @@ -5898,6 +5898,8 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.Outputs = exports.Inputs = void 0; var Inputs; (function (Inputs) { + Inputs["Owner"] = "owner"; + Inputs["Repo"] = "repo"; Inputs["TagName"] = "tag_name"; Inputs["Latest"] = "latest"; Inputs["Pattern"] = "pattern"; @@ -5993,14 +5995,17 @@ exports.handlerError = handlerError; try { const inputs = io_helper_1.getInputs(); const github = github_1.getOctokit(process.env.GITHUB_TOKEN); - const { owner, repo } = github_1.context.repo; if (!inputs.latest) { if (!io_helper_1.isNotBlank(inputs.tag)) handlerError('Current release not found', inputs.throwing); else { try { const releaseResponse = yield github.repos - .getReleaseByTag({ owner, repo, tag: inputs.tag }); + .getReleaseByTag({ + owner: inputs.owner, + repo: inputs.repo, + tag: inputs.tag + }); if (isSuccessStatusCode(releaseResponse.status)) io_helper_1.setOutputs(releaseResponse.data, inputs.debug); else @@ -6015,7 +6020,10 @@ exports.handlerError = handlerError; } } else { - const listResponse = yield github.repos.listReleases({ owner, repo }); + const listResponse = yield github.repos.listReleases({ + owner: inputs.owner, + repo: inputs.repo + }); if (isSuccessStatusCode(listResponse.status)) { const releaseList = listResponse.data .filter(release => !release.draft && @@ -6024,8 +6032,12 @@ exports.handlerError = handlerError; const latestRelease = findLatestRelease(releaseList); if (io_helper_1.isNotBlank(latestRelease)) io_helper_1.setOutputs(latestRelease, inputs.debug); - else - handlerError('The latest release was not found', inputs.throwing); + else { + if (!!inputs.pattern) + handlerError(`No release had a tag name matching /${inputs.pattern.source}/`, inputs.throwing); + else + handlerError('The latest release was not found', inputs.throwing); + } } else throw new Error(`Unexpected http ${listResponse.status} during get release list`); @@ -6087,6 +6099,12 @@ function getInputs() { draft: false, prerelease: false }; + result.owner = core.getInput(constants_1.Inputs.Owner, { required: false }); + if (isNotBlank(result.owner)) + result.owner = github_1.context.repo.owner; + result.repo = core.getInput(constants_1.Inputs.Repo, { required: false }); + if (isNotBlank(result.repo)) + result.repo = github_1.context.repo.repo; const tag = core.getInput(constants_1.Inputs.TagName, { required: false }); if (isNotBlank(tag)) result.tag = tag.trim(); diff --git a/src/constants.ts b/src/constants.ts index 77869a4..2ed3819 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,4 +1,6 @@ export enum Inputs { + Owner = 'owner', + Repo = 'repo', TagName = 'tag_name', Latest = 'latest', Pattern = 'pattern', diff --git a/src/get-release.ts b/src/get-release.ts index ba77727..e000a76 100644 --- a/src/get-release.ts +++ b/src/get-release.ts @@ -1,5 +1,5 @@ import * as core from '@actions/core'; -import {context, getOctokit} from '@actions/github'; +import {getOctokit} from '@actions/github'; import {getInputs, isNotBlank, ReleaseInputs, setOutputs} from './io-helper'; export function isSuccessStatusCode(statusCode?: number): boolean { @@ -32,8 +32,6 @@ export function handlerError(message: string, throwing: boolean) { try { const inputs: ReleaseInputs = getInputs(); const github = getOctokit(process.env.GITHUB_TOKEN as string); - // Get owner and repo from context of payload that triggered the action - const {owner, repo} = context.repo; if (!inputs.latest) { if (!isNotBlank(inputs.tag)) @@ -42,7 +40,11 @@ export function handlerError(message: string, throwing: boolean) { try { // Get a release from the tag name const releaseResponse = await github.repos - .getReleaseByTag({owner, repo, tag: inputs.tag}); + .getReleaseByTag({ + owner: inputs.owner, + repo: inputs.repo, + tag: inputs.tag + }); if (isSuccessStatusCode(releaseResponse.status)) setOutputs(releaseResponse.data, inputs.debug); @@ -56,7 +58,10 @@ export function handlerError(message: string, throwing: boolean) { } } } else { - const listResponse = await github.repos.listReleases({owner, repo}); + const listResponse = await github.repos.listReleases({ + owner: inputs.owner, + repo: inputs.repo + }); if (isSuccessStatusCode(listResponse.status)) { const releaseList = listResponse.data @@ -67,7 +72,14 @@ export function handlerError(message: string, throwing: boolean) { const latestRelease: any = findLatestRelease(releaseList); if (isNotBlank(latestRelease)) setOutputs(latestRelease, inputs.debug); - else handlerError('The latest release was not found', inputs.throwing); + else { + if (!!inputs.pattern) + handlerError(`No release had a tag name matching /${inputs.pattern.source}/`, + inputs.throwing); + else + handlerError('The latest release was not found', + inputs.throwing); + } } else throw new Error(`Unexpected http ${listResponse.status} during get release list`); } diff --git a/src/io-helper.ts b/src/io-helper.ts index 04ee31d..8b276ad 100644 --- a/src/io-helper.ts +++ b/src/io-helper.ts @@ -4,6 +4,8 @@ import {context} from '@actions/github'; import {Inputs, Outputs} from './constants'; export interface ReleaseInputs { + owner: string; + repo: string; tag: string; latest: boolean; @@ -35,6 +37,14 @@ export function getInputs(): ReleaseInputs { prerelease: false }; + result.owner = core.getInput(Inputs.Owner, {required: false}); + if (isNotBlank(result.owner)) + result.owner = context.repo.owner; + + result.repo = core.getInput(Inputs.Repo, {required: false}); + if (isNotBlank(result.repo)) + result.repo = context.repo.repo; + const tag = core.getInput(Inputs.TagName, {required: false}); if (isNotBlank(tag)) result.tag = tag.trim();