tryDirectly to fetch asset without touching api endpoints
This commit is contained in:
parent
4b01852eb7
commit
ea78f87b33
29
lib/cloud.js
29
lib/cloud.js
@ -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);
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user