new features in copyDirRecursive #55
1 changed files with 63 additions and 47 deletions
110
lib/wrench.js
110
lib/wrench.js
|
|
@ -12,7 +12,8 @@
|
|||
*/
|
||||
|
||||
var fs = require("fs"),
|
||||
_path = require("path");
|
||||
_path = require("path"),
|
||||
mkdirp = require("mkdirp");
|
||||
|
||||
|
||||
/* wrench.readdirSyncRecursive("directory_path");
|
||||
|
|
@ -166,7 +167,7 @@ exports.rmdirSyncRecursive = function(path, failSilent) {
|
|||
*/
|
||||
exports.copyDirSyncRecursive = function(sourceDir, newDirLocation, opts) {
|
||||
try {
|
||||
if(fs.statSync(newDirLocation).isDirectory()) {
|
||||
if(fs.statSync(newDirLocation).isDirectory()) {
|
||||
if(typeof opts !== 'undefined' && opts.forceDelete) {
|
||||
exports.rmdirSyncRecursive(newDirLocation);
|
||||
} else {
|
||||
|
|
@ -292,7 +293,7 @@ exports.chownSyncRecursive = function(sourceDir, uid, gid) {
|
|||
*/
|
||||
exports.rmdirRecursive = function rmdirRecursive(dir, failSilent, clbk){
|
||||
fs.readdir(dir, function(err, files){
|
||||
if(err && typeof failSilent === 'boolean' && !failSilent)
|
||||
if(err && typeof failSilent === 'boolean' && !failSilent)
|
||||
return clbk(err);
|
||||
|
||||
if(typeof failSilent === 'function')
|
||||
|
|
@ -328,53 +329,63 @@ exports.copyDirRecursive = function copyDirRecursive(srcDir, newDir, opts, clbk)
|
|||
|
||||
if (typeof opts === 'function')
|
||||
clbk = opts;
|
||||
srcDir = _path.normalize(srcDir);
|
||||
newDir = _path.normalize(newDir);
|
||||
|
||||
var handleFile = function(file, newFile, clbk) {
|
||||
fs.readFile(file, function (err, data) {
|
||||
fs.writeFile(newFile, data, clbk);
|
||||
});
|
||||
};
|
||||
|
||||
var handleSymlink = function(file, newFile, clbk) {
|
||||
fs.readlink(file, function (err, link) {
|
||||
if (!opts.inflateSymlinks) {
|
||||
fs.symlink(link, newFile, clbk);
|
||||
} else {
|
||||
fs.lstat(srcDir + '/' + link, function (err, stats) {
|
||||
if (stats.isDirectory()) {
|
||||
copyDirRecursive(srcDir + '/' + link, newFile, opts, clbk);
|
||||
} else {
|
||||
handleFile(srcDir + '/' + link, newFile, clbk);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
var copyDirRecInner = function() {
|
||||
fs.stat(srcDir, function (err1, srcDirStat) {
|
||||
if (err1) return clbk(err1);
|
||||
fs.readdir(srcDir, function (err, files) {
|
||||
fs.readdir(srcDir, function (err, files) {
|
||||
if (err) return clbk(err);
|
||||
(function copyFiles(err) {
|
||||
if (err) return clbk(err);
|
||||
(function copyFiles(err) {
|
||||
if (err) return clbk(err);
|
||||
|
||||
var filename = files.shift();
|
||||
if (filename === null || typeof filename == 'undefined') {
|
||||
return clbk();
|
||||
var filename = files.shift();
|
||||
|
||||
while (filename && opts.excludeHiddenUnix && /^\./.test(filename)) {
|
||||
filename = files.shift();
|
||||
}
|
||||
|
||||
if (filename === null || typeof filename == 'undefined') {
|
||||
return clbk();
|
||||
}
|
||||
|
||||
var file = srcDir + '/' + filename,
|
||||
newFile = newDir + '/' + filename;
|
||||
|
||||
fs.stat(file, function (err, fileStat) {
|
||||
if (fileStat.isDirectory()) {
|
||||
copyDirRecursive(file, newFile, opts, copyFiles);
|
||||
}
|
||||
else if (fileStat.isSymbolicLink()) {
|
||||
handleSymlink(file, newFile, copyFiles);
|
||||
}
|
||||
else {
|
||||
handleFile(file, newFile, copyFiles);
|
||||
}
|
||||
|
||||
if (opts.excludeHiddenUnix && /^\./.test(filename))
|
||||
return clbk();
|
||||
|
||||
var file = srcDir + '/' + filename,
|
||||
newFile = newDir + '/' + filename;
|
||||
|
||||
fs.stat(file, function (err, fileStat) {
|
||||
if (fileStat.isDirectory())
|
||||
copyDirRecursive(file, newFile, opts, copyFiles);
|
||||
else if (fileStat.isSymbolicLink()) {
|
||||
fs.readlink(file, function (err, link) {
|
||||
if (!opts.inflateSymlinks) {
|
||||
fs.symlink(link, newFile, copyFiles);
|
||||
} else {
|
||||
fs.lstat(srcDir + '/' + link, function (err, stats) {
|
||||
if (stats.isDirectory()) {
|
||||
copyDirRecursive(srcDir + '/' + link, newFile, opts, copyFiles);
|
||||
} else {
|
||||
fs.readFile(srcDir + '/' + link, function (err, data) {
|
||||
fs.writeFile(newFile, data, copyFiles);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
else
|
||||
fs.readFile(file, function (err, data) {
|
||||
fs.writeFile(newFile, data, copyFiles);
|
||||
});
|
||||
});
|
||||
})();
|
||||
});
|
||||
});
|
||||
})();
|
||||
});
|
||||
};
|
||||
|
||||
|
|
@ -388,9 +399,14 @@ exports.copyDirRecursive = function copyDirRecursive(srcDir, newDir, opts, clbk)
|
|||
copyDirRecInner();
|
||||
}
|
||||
} else {
|
||||
fs.mkdir(newDir, srcDirStat.mode, function(err){
|
||||
if (err) return clbk(err);
|
||||
copyDirRecInner();
|
||||
fs.stat(srcDir, function (err, srcDirStat) {
|
||||
if (err) {
|
||||
clbk(new Error('The source directory (probably) doesn\'t exist. error: ' + err));
|
||||
}
|
||||
mkdirp(newDir, srcDirStat.mode, function(err){
|
||||
if (err) return clbk(err);
|
||||
copyDirRecInner();
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
|
|||
Reference in a new issue