download to temporary file first. then move to it's place
This commit is contained in:
parent
314ef35360
commit
a2519284d0
12
lib/cloud.js
12
lib/cloud.js
@ -1,5 +1,9 @@
|
||||
import { createRelease, downloadAsset, getRelease, uploadAsset } from './github.js';
|
||||
import { createRelease, downloadAsset,
|
||||
getRelease, uploadAsset } from './github.js';
|
||||
import { mkdirp, remove } from 'fs-promise';
|
||||
import assert from 'assert';
|
||||
import { moveFile } from './copy-file.js';
|
||||
import path from 'path';
|
||||
import { version } from '../package.json';
|
||||
|
||||
function uniqueName (remote, names) {
|
||||
@ -36,6 +40,10 @@ export async function download (remote, local) {
|
||||
if (!assets.length) return false;
|
||||
assert(assets.length === 1);
|
||||
const asset = assets[0];
|
||||
await downloadAsset(asset, local);
|
||||
const tempFile = local + '.downloading';
|
||||
await mkdirp(path.dirname(tempFile));
|
||||
await downloadAsset(asset, tempFile);
|
||||
await moveFile(tempFile, local);
|
||||
await remove(tempFile);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -3,3 +3,7 @@ import fs from 'fs-promise';
|
||||
export function copyFile (src, dest) {
|
||||
return fs.copy(src, dest);
|
||||
}
|
||||
|
||||
export function moveFile (src, dest) {
|
||||
return fs.move(src, dest);
|
||||
}
|
||||
|
||||
@ -51,16 +51,16 @@ export function createRelease (tag) {
|
||||
});
|
||||
}
|
||||
|
||||
export function uploadAsset (local, release, name) {
|
||||
export function uploadAsset (file, release, name) {
|
||||
assert(!(/[\\/]/.test(name)));
|
||||
return new Promise((resolve, reject) => {
|
||||
fs.stat(local, (error, stat) => {
|
||||
fs.stat(file, (error, stat) => {
|
||||
if (error) return reject(error);
|
||||
const headers = {
|
||||
'Content-Length': stat.size,
|
||||
'Content-Type': 'application/octet-stream'
|
||||
};
|
||||
const rs = fs.createReadStream(local);
|
||||
const rs = fs.createReadStream(file);
|
||||
const subst = `?name=${name}`;
|
||||
const url = release.upload_url.replace(/\{\?name,label\}/, subst);
|
||||
const req = request2.post(url, { headers }, (error2, response, body) => {
|
||||
@ -72,10 +72,10 @@ export function uploadAsset (local, release, name) {
|
||||
});
|
||||
}
|
||||
|
||||
export function downloadAsset (asset, local) {
|
||||
export function downloadAsset (asset, file) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const headers = { Accept: 'application/octet-stream' };
|
||||
const ws = fs.createWriteStream(local);
|
||||
const ws = fs.createWriteStream(file);
|
||||
const url = asset.url;
|
||||
const req = request2.get(url, { headers }, (error, response) => {
|
||||
if (error) return reject(error);
|
||||
|
||||
@ -1,11 +1,10 @@
|
||||
import * as system from './system.js';
|
||||
import { exists, mkdirp } from 'fs-promise';
|
||||
import { hostArch, hostPlatform } from './system.js'; // eslint-disable-line no-duplicate-imports
|
||||
import { localPlace, remotePlace } from './places.js';
|
||||
import assert from 'assert';
|
||||
import { download } from './cloud.js';
|
||||
import { exists } from 'fs-promise';
|
||||
import patchesJson from '../patches/patches.json';
|
||||
import path from 'path';
|
||||
import semver from 'semver';
|
||||
import { version } from '../package.json';
|
||||
|
||||
@ -39,7 +38,6 @@ export async function need ({
|
||||
}
|
||||
if (!dontDownload) {
|
||||
const remote = remotePlace({ arch, nodeVersion, platform, version });
|
||||
await mkdirp(path.dirname(local));
|
||||
if (await download(remote, local)) return local;
|
||||
}
|
||||
if (!dontBuild) {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user