97 lines
1.9 KiB
JavaScript
97 lines
1.9 KiB
JavaScript
|
(function () {
|
||
|
"use strict";
|
||
|
|
||
|
var fs = require('fs')
|
||
|
, fsCopy = require('./fs.copy')
|
||
|
, fsMkdirp = require('mkdirp')
|
||
|
, fsWalk = require('walk').walk
|
||
|
, path = require('path')
|
||
|
;
|
||
|
|
||
|
function run(src, dst, cb) {
|
||
|
|
||
|
function syncDirs(cb, src, dst) {
|
||
|
var walker = fsWalk(src)
|
||
|
;
|
||
|
|
||
|
walker.on('directory', function (root, stat, next) {
|
||
|
var newDir = path.join(dst, root.substr(src.length + 1), stat.name)
|
||
|
;
|
||
|
|
||
|
fsMkdirp(newDir, stat.mode, next);
|
||
|
});
|
||
|
|
||
|
walker.on('end', function () {
|
||
|
cb();
|
||
|
});
|
||
|
}
|
||
|
|
||
|
function syncFiles(cb, src, dst) {
|
||
|
var walker = fsWalk(src)
|
||
|
;
|
||
|
|
||
|
walker.on('file', function (root, stat, next) {
|
||
|
var curFile = path.join(root, stat.name)
|
||
|
, newFile = path.join(dst, root.substr(src.length + 1), stat.name)
|
||
|
;
|
||
|
|
||
|
fsCopy(curFile, newFile, function (err) {
|
||
|
if (err) {
|
||
|
cb(err);
|
||
|
return;
|
||
|
}
|
||
|
next();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
walker.on('end', function () {
|
||
|
cb();
|
||
|
});
|
||
|
}
|
||
|
|
||
|
dst = path.resolve(process.cwd(), dst);
|
||
|
|
||
|
fsMkdirp(path.join(dst), function () {
|
||
|
fs.realpath(src, function (err, rsrc) {
|
||
|
fs.realpath(dst, function (err, rdst) {
|
||
|
syncDirs(function () {
|
||
|
syncFiles(cb, rsrc, rdst);
|
||
|
}, rsrc, rdst);
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
}
|
||
|
|
||
|
function runCli() {
|
||
|
var srcPath = process.argv[2]
|
||
|
, dstPath = process.argv[3]
|
||
|
, emitter
|
||
|
;
|
||
|
|
||
|
function showHelp() {
|
||
|
console.log('usage: rsync src-path dst-path');
|
||
|
}
|
||
|
|
||
|
if (!srcPath || !dstPath) {
|
||
|
showHelp();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
emitter = run(srcPath, dstPath, function (err) {
|
||
|
if (err) {
|
||
|
console.error(err);
|
||
|
}
|
||
|
console.log('All Done');
|
||
|
});
|
||
|
|
||
|
// TODO
|
||
|
//emitter.on('fileCopied');
|
||
|
}
|
||
|
|
||
|
if (require.main === module) {
|
||
|
runCli();
|
||
|
}
|
||
|
|
||
|
module.exports = run;
|
||
|
}());
|