nyx_server
Version:
Node内容发布
117 lines (95 loc) • 2.97 kB
JavaScript
var fstream = require('fstream');
var fstreamIgnore = require('fstream-ignore');
var fs = require('graceful-fs');
var util = require('util')
var Promise = require('bluebird');
function copy(reader, writer) {
var ignore;
// Filter symlinks because they are not 100% portable, specially
// when linking between different drives
// Following can't be enabled either because symlinks that reference
// another symlinks will get filtered
// See: https://github.com/bower/bower/issues/699
reader.filter = filterSymlinks;
reader.follow = false;
if (reader.type === 'Directory' && reader.ignore) { //TODO fstreamIgnore 在jest测试框架中存在问题,不能回调
ignore = reader.ignore;
reader = fstreamIgnore(reader);
reader.addIgnoreRules(ignore);
} else {
reader = fstream.Reader(reader);
}
return new Promise(function(resolve , reject){
reader.on('error', reject);
reader.pipe(fstream.Writer(writer));
reader.on('error', reject);
reader.on('close', resolve);
})
}
function copyMode(src, dst) {
return new Promise(function(resolve , reject){
fs.stat(src , function(err , stats){
fs.chmod(dst , stats.mode , function(err){
if(err){
throw new Error(err);
}
resolve();
})
});
})
}
function filterSymlinks(entry) {
return entry.type !== 'SymbolicLink';
}
function parseOptions(opts) {
opts = opts || {};
if (opts.mode != null) {
opts.copyMode = false;
} else if (opts.copyMode == null) {
opts.copyMode = true;
}
return opts;
}
// ---------------------
// Available options:
// - mode: force final mode of dst (defaults to null)
// - copyMode: copy mode of src to dst, only if mode is not specified (defaults to true)
function copyFile(src, dst, opts) {
var promise;
opts = parseOptions(opts);
promise = copy({
path: src,
type: 'File'
}, {
path: dst,
mode: opts.mode,
type: 'File'
});
if (opts.copyMode) {
promise = promise.then(copyMode.bind(copyMode, src, dst));
}
return promise;
}
// Available options:
// - ignore: array of patterns to be ignored (defaults to null)
// - mode: force final mode of dst (defaults to null)
// - copyMode: copy mode of src to dst, only if mode is not specified (defaults to true)
function copyDir(src, dst, opts) {
var promise;
opts = parseOptions(opts);
promise = copy({
path: src,
type: 'Directory',
ignore: opts.ignore
}, {
path: dst,
mode: opts.mode,
type: 'Directory'
});
if (opts.copyMode) {
promise = promise.then(copyMode.bind(copyMode, src, dst));
}
return promise;
}
module.exports.copyDir = copyDir;
module.exports.copyFile = copyFile;