UNPKG

nyx_server

Version:

Node内容发布

117 lines (95 loc) 2.97 kB
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;