Skip to content

Commit d6693dd

Browse files
committed
use fcopy for file copying
1 parent 40f7f9d commit d6693dd

File tree

3 files changed

+23
-31
lines changed

3 files changed

+23
-31
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
"death": "^1.0.0",
1616
"debug": "^2.2.0",
1717
"detect-indent": "^5.0.0",
18+
"fcopy": "^0.0.7",
1819
"gunzip-maybe": "^1.4.0",
1920
"ini": "^1.3.4",
2021
"inquirer": "^3.0.1",

src/util/fs.js

Lines changed: 12 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import * as promise from './promise.js';
66
import {promisify} from './promise.js';
77
import map from './map.js';
88

9+
const fcopy = require('fcopy');
910
const path = require('path');
1011
const fs = require('fs');
1112
const os = require('os');
@@ -26,8 +27,9 @@ export const exists: (path: string) => Promise<boolean> = promisify(fs.exists, t
2627
export const lstat: (path: string) => Promise<fs.Stats> = promisify(fs.lstat);
2728
export const chmod: (path: string, mode: number | string) => Promise<void> = promisify(fs.chmod);
2829
export const link: (path: string) => Promise<fs.Stats> = promisify(fs.link);
30+
export const utimes: (path: string, atime: number, mtime: number) => Promise<void> = promisify(fs.utimes);
2931

30-
const CONCURRENT_QUEUE_ITEMS = 4;
32+
const CONCURRENT_QUEUE_ITEMS = 16;
3133

3234
const fsSymlink: (
3335
target: string,
@@ -510,37 +512,16 @@ export async function copyBulk(
510512
}
511513

512514
const cleanup = () => delete currentlyWriting[data.dest];
513-
return currentlyWriting[data.dest] = new Promise((resolve, reject) => {
514-
const readStream = fs.createReadStream(data.src);
515-
const writeStream = fs.createWriteStream(data.dest, {mode: data.mode});
516-
515+
return currentlyWriting[data.dest] = (async function() : Promise<void> {
517516
reporter.verbose(reporter.lang('verboseFileCopy', data.src, data.dest));
518-
519-
readStream.on('error', reject);
520-
writeStream.on('error', reject);
521-
522-
writeStream.on('open', function() {
523-
readStream.pipe(writeStream);
524-
});
525-
526-
writeStream.once('close', function() {
527-
fs.utimes(data.dest, data.atime, data.mtime, function(err) {
528-
if (err) {
529-
reject(err);
530-
} else {
531-
events.onProgress(data.dest);
532-
cleanup();
533-
resolve();
534-
}
535-
});
536-
});
537-
}).then((arg) => {
538-
cleanup();
539-
return arg;
540-
}).catch((arg) => {
541-
cleanup();
542-
throw arg;
543-
});
517+
try {
518+
await fcopy(data.src, data.dest, {mode: data.mode});
519+
await utimes(data.dest, data.atime, data.mtime);
520+
events.onProgress(data.dest);
521+
} finally {
522+
cleanup();
523+
}
524+
})();
544525
}, CONCURRENT_QUEUE_ITEMS);
545526

546527
// we need to copy symlinks last as they could reference files we were copying

yarn.lock

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1695,6 +1695,12 @@ fb-watchman@^2.0.0:
16951695
dependencies:
16961696
bser "^2.0.0"
16971697

1698+
fcopy@^0.0.7:
1699+
version "0.0.7"
1700+
resolved "https://registry.yarnpkg.com/fcopy/-/fcopy-0.0.7.tgz#bad8c8f1d256f1bae65e4165334bae58b1d190c2"
1701+
dependencies:
1702+
nan "^2.6.2"
1703+
16981704
figures@^1.3.5:
16991705
version "1.7.0"
17001706
resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e"
@@ -3281,6 +3287,10 @@ nan@^2.3.0:
32813287
version "2.5.1"
32823288
resolved "https://registry.yarnpkg.com/nan/-/nan-2.5.1.tgz#d5b01691253326a97a2bbee9e61c55d8d60351e2"
32833289

3290+
nan@^2.6.2:
3291+
version "2.6.2"
3292+
resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45"
3293+
32843294
natives@^1.1.0:
32853295
version "1.1.0"
32863296
resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.0.tgz#e9ff841418a6b2ec7a495e939984f78f163e6e31"

0 commit comments

Comments
 (0)