fix(action) existing release detection

This commit is contained in:
Lucas Nogueira
2020-07-09 01:19:15 -03:00
parent b8517bb521
commit 9439a8b1bf
4 changed files with 110 additions and 29 deletions

View File

@@ -27,6 +27,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __asyncValues = (this && this.__asyncValues) || function (o) {
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
var m = o[Symbol.asyncIterator], i;
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
@@ -34,7 +41,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
const core = __importStar(require("@actions/core"));
const github_1 = require("@actions/github");
const fs_1 = __importDefault(require("fs"));
function allReleases(github) {
const params = Object.assign({ per_page: 100 }, github_1.context);
return github.paginate.iterator(github.repos.listReleases.endpoint.merge(params));
}
function createRelease(tagName, releaseName, body, commitish, draft = true, prerelease = true) {
var e_1, _a;
return __awaiter(this, void 0, void 0, function* () {
if (process.env.GITHUB_TOKEN === undefined) {
throw new Error('GITHUB_TOKEN is required');
@@ -53,17 +65,44 @@ function createRelease(tagName, releaseName, body, commitish, draft = true, prer
core.setFailed(error.message);
}
}
let release;
let release = null;
try {
release = yield github.repos.getReleaseByTag({
owner,
repo,
tag: tagName
});
// you can't get a an existing draft by tag
// so we must find one in the list of all releases
if (draft) {
try {
for (var _b = __asyncValues(allReleases(github)), _c; _c = yield _b.next(), !_c.done;) {
const response = _c.value;
let releaseWithTag = response.data.find(release => release.tag_name === tagName);
if (releaseWithTag) {
release = releaseWithTag;
console.log(`Found draft release with tag ${tagName} on the release list.`);
break;
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) yield _a.call(_b);
}
finally { if (e_1) throw e_1.error; }
}
}
else {
const foundRelease = yield github.repos.getReleaseByTag({
owner,
repo,
tag: tagName
});
release = foundRelease.data;
console.log(`Found release with tag ${tagName}.`);
}
}
catch (error) {
if (error.status === 404) {
release = yield github.repos.createRelease({
console.log(`Couldn't find release with tag ${tagName}. Creating one.`);
const createdRelease = yield github.repos.createRelease({
owner,
repo,
tag_name: tagName,
@@ -73,18 +112,20 @@ function createRelease(tagName, releaseName, body, commitish, draft = true, prer
prerelease,
target_commitish: commitish || github_1.context.sha
});
release = createdRelease.data;
}
else {
console.log(`⚠️ Unexpected error fetching GitHub release for tag ${tagName}: ${error}`);
throw error;
}
}
// Get the ID, html_url, and upload URL for the created Release from the response
const { data: { id, html_url: htmlUrl, upload_url: uploadUrl } } = release;
if (!release) {
throw new Error('Release not found or created.');
}
return {
id,
htmlUrl,
uploadUrl
id: release.id,
uploadUrl: release.upload_url,
htmlUrl: release.html_url
};
});
}

12
dist/main.js vendored
View File

@@ -66,7 +66,7 @@ function execCommand(command, { cwd }) {
env: { FORCE_COLOR: '0' },
}).then();
}
function buildProject(root, debug, { configPath, distPath }) {
function buildProject(root, debug, { configPath, distPath, iconPath }) {
return __awaiter(this, void 0, void 0, function* () {
return new Promise((resolve) => {
if (hasTauriDependency(root)) {
@@ -96,11 +96,15 @@ function buildProject(root, debug, { configPath, distPath }) {
cargoManifest.package.name = appName;
cargoManifest.package.version = version;
fs_1.writeFileSync(manifestPath, toml_1.default.stringify(cargoManifest));
return {
const app = {
runner,
name: appName,
version
};
if (iconPath) {
return execCommand(`${runner} icon --i ${path_1.join(root, iconPath)}`, { cwd: root }).then(() => app);
}
return app;
});
}
})
@@ -144,6 +148,7 @@ function run() {
const projectPath = path_1.resolve(process.cwd(), core.getInput('projectPath') || process.argv[2]);
const configPath = path_1.join(projectPath, core.getInput('configPath') || 'tauri.conf.json');
const distPath = core.getInput('distPath');
const iconPath = core.getInput('iconPath');
let tagName = core.getInput('tagName').replace('refs/tags/', '');
let releaseName = core.getInput('releaseName').replace('refs/tags/', '');
let body = core.getInput('releaseBody');
@@ -153,7 +158,8 @@ function run() {
if (Boolean(tagName) !== Boolean(releaseName)) {
throw new Error('`tag` is required along with `releaseName` when creating a release.');
}
const artifacts = yield buildProject(projectPath, false, { configPath: fs_1.existsSync(configPath) ? configPath : null, distPath });
const artifacts = yield buildProject(projectPath, false, { configPath: fs_1.existsSync(configPath) ? configPath : null, distPath, iconPath });
console.log(`Artifacts: ${artifacts}.`);
let uploadUrl;
if (tagName) {
const packageJson = getPackageJson(projectPath);

View File

@@ -8,6 +8,22 @@ interface Release {
htmlUrl: string
}
interface GitHubRelease {
id: number;
upload_url: string;
html_url: string;
tag_name: string;
body: string;
target_commitish: string;
}
function allReleases(github: GitHub): AsyncIterableIterator<{ data: GitHubRelease[] }> {
const params = { per_page: 100, ...context };
return github.paginate.iterator(
github.repos.listReleases.endpoint.merge(params)
);
}
export default async function createRelease(tagName: string, releaseName: string, body?: string, commitish?: string, draft = true, prerelease = true): Promise<Release> {
if (process.env.GITHUB_TOKEN === undefined) {
throw new Error('GITHUB_TOKEN is required')
@@ -29,16 +45,32 @@ export default async function createRelease(tagName: string, releaseName: string
}
}
let release
let release: GitHubRelease | null = null
try {
release = await github.repos.getReleaseByTag({
owner,
repo,
tag: tagName
})
// you can't get a an existing draft by tag
// so we must find one in the list of all releases
if (draft) {
for await (const response of allReleases(github)) {
let releaseWithTag = response.data.find(release => release.tag_name === tagName);
if (releaseWithTag) {
release = releaseWithTag
console.log(`Found draft release with tag ${tagName} on the release list.`)
break
}
}
} else {
const foundRelease = await github.repos.getReleaseByTag({
owner,
repo,
tag: tagName
})
release = foundRelease.data
console.log(`Found release with tag ${tagName}.`)
}
} catch (error) {
if (error.status === 404) {
release = await github.repos.createRelease({
console.log(`Couldn't find release with tag ${tagName}. Creating one.`)
const createdRelease = await github.repos.createRelease({
owner,
repo,
tag_name: tagName,
@@ -48,6 +80,8 @@ export default async function createRelease(tagName: string, releaseName: string
prerelease,
target_commitish: commitish || context.sha
})
release = createdRelease.data
} else {
console.log(
`⚠️ Unexpected error fetching GitHub release for tag ${tagName}: ${error}`
@@ -56,14 +90,13 @@ export default async function createRelease(tagName: string, releaseName: string
}
}
// Get the ID, html_url, and upload URL for the created Release from the response
const {
data: { id, html_url: htmlUrl, upload_url: uploadUrl }
} = release
if (!release) {
throw new Error('Release not found or created.')
}
return {
id,
htmlUrl,
uploadUrl
id: release.id,
uploadUrl: release.upload_url,
htmlUrl: release.html_url
}
}

View File

@@ -151,6 +151,7 @@ async function run(): Promise<void> {
}
const artifacts = await buildProject(projectPath, false, { configPath: existsSync(configPath) ? configPath : null, distPath, iconPath })
console.log(`Artifacts: ${artifacts}.`)
let uploadUrl: string
if (tagName) {