quickly fetch tagged non-draft release
This commit is contained in:
parent
edbe9cbc7e
commit
d710644c16
@ -1,5 +1,5 @@
|
||||
import { createRelease, downloadAsset,
|
||||
getRelease, uploadAsset } from './github.js';
|
||||
getRelease, getReleaseDraft, uploadAsset } from './github.js';
|
||||
import { mkdirp, remove } from 'fs-promise';
|
||||
import assert from 'assert';
|
||||
import { moveFile } from './copy-file.js';
|
||||
@ -19,6 +19,7 @@ function uniqueName (name, names) {
|
||||
export async function upload (local, remote) {
|
||||
const { tag } = remote;
|
||||
let release = await getRelease(tag);
|
||||
if (!release) release = await getReleaseDraft(tag);
|
||||
if (!release) release = await createRelease(tag);
|
||||
const names = release.assets.map(({ name }) => {
|
||||
assert(name);
|
||||
@ -30,7 +31,8 @@ export async function upload (local, remote) {
|
||||
|
||||
export async function download (remote, local) {
|
||||
const { tag } = remote;
|
||||
const release = await getRelease(tag);
|
||||
let release = await getRelease(tag);
|
||||
if (!release) release = await getReleaseDraft(tag);
|
||||
if (!release) return false;
|
||||
const assets = release.assets.filter(({ name }) => {
|
||||
assert(name);
|
||||
|
||||
@ -17,6 +17,23 @@ const request2 = request.defaults({
|
||||
});
|
||||
|
||||
export function getRelease (tag) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const url = `https://api.github.com/repos/${OWNER}/${REPO}/releases/tags/${tag}`;
|
||||
request2(url, (error, response, body) => {
|
||||
if (error) {
|
||||
log.error(error.message);
|
||||
return reject(wasReported(error));
|
||||
}
|
||||
const release = JSON.parse(body);
|
||||
const { message } = release;
|
||||
if (message === 'Not Found') return resolve(null);
|
||||
if (message) return reject(new Error(message));
|
||||
resolve(release);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
export function getReleaseDraft (tag) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const url = `https://api.github.com/repos/${OWNER}/${REPO}/releases`;
|
||||
request2(url, (error, response, body) => {
|
||||
@ -24,16 +41,14 @@ export function getRelease (tag) {
|
||||
log.error(error.message);
|
||||
return reject(wasReported(error));
|
||||
}
|
||||
// we cannot use `get release by tag` endpoint here
|
||||
// here we use `get release by tag` endpoint
|
||||
// because draft releases are really `untagged`.
|
||||
// seems that `get release by tag` is for non-drafts.
|
||||
// hence listing all releases and looking through them
|
||||
const releases = JSON.parse(body);
|
||||
if (releases.message) return reject(new Error(releases.message));
|
||||
const found = releases.filter(({ tag_name }) => tag_name === tag); // eslint-disable-line camelcase
|
||||
if (found.length > 1) {
|
||||
return reject(new Error(`More than one ${tag} release found. Fix it!`));
|
||||
}
|
||||
assert(found.length <= 1);
|
||||
if (!found.length) return resolve(null);
|
||||
resolve(found[0]);
|
||||
});
|
||||
|
||||
@ -54,7 +54,7 @@ export async function need ({
|
||||
if (await download(remote, downloaded)) return downloaded;
|
||||
downloadFailed = true;
|
||||
}
|
||||
if (downloadFailed) log.info('Not found in GitHub releases. Building...');
|
||||
if (downloadFailed) log.info('Not found in GitHub releases. Building from source...');
|
||||
if (forceBuild) log.info('Building base binary from source:', path.basename(built));
|
||||
await build(nodeVersion, arch, built);
|
||||
return built;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user