quickly fetch tagged non-draft release

This commit is contained in:
Igor Klopov 2016-09-03 18:38:31 +03:00
parent edbe9cbc7e
commit d710644c16
3 changed files with 24 additions and 7 deletions

View File

@ -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);

View File

@ -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]);
});

View File

@ -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;