tryDirectly to fetch asset without touching api endpoints

This commit is contained in:
igorklopov 2016-09-10 16:55:05 +04:00
parent 4b01852eb7
commit ea78f87b33
2 changed files with 32 additions and 13 deletions

View File

@ -1,5 +1,5 @@
import { createRelease, downloadUrl,
getRelease, getReleaseDraft, uploadAsset } from './github.js';
import { createRelease, downloadUrl, getRelease,
getReleaseDraft, tryDirectly, uploadAsset } from './github.js';
import { mkdirp, remove } from 'fs-promise';
import assert from 'assert';
import { moveFile } from './copy-file.js';
@ -31,20 +31,23 @@ export async function upload (local, remote) {
export async function download (remote, local) {
const { tag } = remote;
let release = await getRelease(tag);
if (!release) release = await getReleaseDraft(tag);
if (!release) return false;
const assets = release.assets.filter(({ name }) => {
assert(name);
return name === remote.name;
});
if (!assets.length) return false;
assert(assets.length === 1);
const asset = assets[0];
const tempFile = local + '.downloading';
await mkdirp(path.dirname(tempFile));
const short = path.basename(local);
await downloadUrl(asset.browser_download_url, tempFile, short);
const ok = await tryDirectly(tag, remote.name, tempFile, short);
if (!ok) {
let release = await getRelease(tag);
if (!release) release = await getReleaseDraft(tag);
if (!release) return false;
const assets = release.assets.filter(({ name }) => {
assert(name);
return name === remote.name;
});
if (!assets.length) return false;
assert(assets.length === 1);
const asset = assets[0];
await downloadUrl(asset.url, tempFile, short);
}
await remove(local);
await moveFile(tempFile, local);
await remove(tempFile);

View File

@ -104,6 +104,11 @@ export function downloadUrl (url, file, short) {
log.disableProgress();
return reject(wasReported(error.message));
}
if (response.statusCode !== 200) {
log.disableProgress();
const message = `${response.statusCode} ${response.body}`;
return reject(wasReported(message, url));
}
log.showProgress(100);
log.disableProgress();
resolve(response);
@ -115,3 +120,14 @@ export function downloadUrl (url, file, short) {
req.pipe(ws);
});
}
export async function tryDirectly (tag, name, file, short) {
try {
const url = `https://github.com/${OWNER}/${REPO}/releases/download/${tag}/${name}`;
await downloadUrl(url, file, short);
return true;
} catch (error) {
log.info(`Asset '${tag}/${name}' not found by direct link`);
return false;
}
}