download to temporary file first. then move to it's place

This commit is contained in:
igorklopov 2016-08-15 13:49:51 +03:00
parent 314ef35360
commit a2519284d0
4 changed files with 20 additions and 10 deletions

View File

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

View File

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

View File

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

View File

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