123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- var fs = require('fs');
- var path = require('path');
- /*
- options: {
- utimes: false, // Boolean | Object, keep utimes if true
- mode: false, // Boolean | Number, keep file mode if true
- cover: true, // Boolean, cover if file exists
- filter: true, // Boolean | Function, file filter
- }
- */
- function copydirSync(from, to, options) {
- if (typeof options === 'function') {
- options = {
- filter: options
- };
- }
- if(typeof options === 'undefined') options = {};
- if(typeof options.cover === 'undefined') {
- options.cover = true;
- }
- options.filter = typeof options.filter === 'function' ? options.filter : function(state, filepath, filename) {
- return options.filter;
- };
- var stats = fs.lstatSync(from);
- var statsname = stats.isDirectory() ? 'directory' :
- stats.isFile() ? 'file' :
- stats.isSymbolicLink() ? 'symbolicLink' :
- '';
- var valid = options.filter(statsname, from, path.dirname(from), path.basename(from));
- if (statsname === 'directory' || statsname === 'symbolicLink') {
- // Directory or SymbolicLink
- if(valid) {
- try {
- fs.statSync(to);
- } catch(err) {
- if(err.code === 'ENOENT') {
- fs.mkdirSync(to);
- options.debug && console.log('>> ' + to);
- } else {
- throw err;
- }
- }
- rewriteSync(to, options, stats);
- if (statsname != 'symbolicLink')
- listDirectorySync(from, to, options);
- }
- } else if(stats.isFile()) {
- // File
- if(valid) {
- if(options.cover) {
- writeFileSync(from, to, options, stats);
- } else {
- try {
- fs.statSync(to);
- } catch(err) {
- if(err.code === 'ENOENT') {
- writeFileSync(from, to, options, stats);
- } else {
- throw err;
- }
- }
- }
- }
- } else {
- throw new Error('stats invalid: '+ from);
- }
- };
- function listDirectorySync(from, to, options) {
- var files = fs.readdirSync(from);
- copyFromArraySync(files, from, to, options);
- }
- function copyFromArraySync(files, from, to, options) {
- if(files.length === 0) return true;
- var f = files.shift();
- copydirSync(path.join(from, f), path.join(to, f), options);
- copyFromArraySync(files, from, to, options);
- }
- function writeFileSync(from, to, options, stats) {
- fs.writeFileSync(to, fs.readFileSync(from, 'binary'), 'binary');
- options.debug && console.log('>> ' + to);
- rewriteSync(to, options, stats);
- }
- function rewriteSync(f, options, stats, callback) {
- if(options.cover) {
- var mode = options.mode === true ? stats.mode : options.mode;
- var utimes = options.utimes === true ? {
- atime: stats.atime,
- mtime: stats.mtime
- } : options.utimes;
- mode && fs.chmodSync(f, mode);
- utimes && fs.utimesSync(f, utimes.atime, utimes.mtime);
- }
- return true;
- }
- module.exports = copydirSync;
|