Skip to content
This repository has been archived by the owner on Jun 19, 2019. It is now read-only.

Commit

Permalink
Added support for include and exclude filters and function filters. A…
Browse files Browse the repository at this point in the history
…lso export copyFileSync method now
  • Loading branch information
patrick-steele-idem committed Jul 25, 2013
1 parent 31cf44b commit 5acb4ed
Showing 1 changed file with 90 additions and 28 deletions.
118 changes: 90 additions & 28 deletions lib/wrench.js
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,8 @@ exports.readdirRecursive = function(baseDir, fn) {





/* wrench.rmdirSyncRecursive("directory_path", forceDelete, failSilent);
*
* Recursively dives through directories and obliterates everything about it. This is a
Expand Down Expand Up @@ -156,6 +158,62 @@ exports.rmdirSyncRecursive = function(path, failSilent) {
return fs.rmdirSync(path);
};



function isFileIncluded(opts, dir, filename) {

function isMatch(filter) {
if (typeof filter === 'function') {
return filter(filename, dir) === true;
}
else {
// Maintain backwards compatibility and use just the filename
return filename.match(filter);
}
}

if (opts.include || opts.exclude) {
if (opts.exclude) {
if (isMatch(opts.exclude)) {
return false;
}
}

if (opts.include) {
if (isMatch(opts.include)) {
return true;
}
else {
return false;
}
}

return true;
}
else if (opts.filter) {
var filter = opts.filter;

if (!opts.whitelist) {
// if !opts.whitelist is false every file or directory
// which does match opts.filter will be ignored
return isMatch(filter) ? false : true;
} else {
// if opts.whitelist is true every file or directory
// which doesn't match opts.filter will be ignored
return !isMatch(filter) ? false : true;
}
}

return true;
}

exports.copyFileSync = function(srcFile, destFile, preserveFiles) {
if (preserveFiles && fs.existsSync(destFile)) return;

var contents = fs.readFileSync(srcFile);
fs.writeFileSync(destFile, contents);
};

/* wrench.copyDirSyncRecursive("directory_to_copy", "new_directory_location", opts);
*
* Recursively dives through a directory and moves all its files to a new location. This is a
Expand All @@ -165,14 +223,16 @@ exports.rmdirSyncRecursive = function(path, failSilent) {
* Note: Directories should be passed to this function without a trailing slash.
*/
exports.copyDirSyncRecursive = function(sourceDir, newDirLocation, opts) {
opts = opts || {};

try {
if(fs.statSync(newDirLocation).isDirectory()) {
if(typeof opts !== 'undefined' && opts.forceDelete) {
exports.rmdirSyncRecursive(newDirLocation);
} else {
return new Error('You are trying to delete a directory that already exists. Specify forceDelete in the opts argument to override this. Bailing~');
}
}
if(fs.statSync(newDirLocation).isDirectory()) {
if(typeof opts !== 'undefined' && opts.forceDelete) {
exports.rmdirSyncRecursive(newDirLocation);
} else {
return new Error('You are trying to delete a directory that already exists. Specify forceDelete in the opts argument to override this. Bailing~');
}
}
} catch(e) { }

/* Create the directory where all our junk is moving to; read the mode of the source directory and mirror it */
Expand All @@ -185,23 +245,25 @@ exports.copyDirSyncRecursive = function(sourceDir, newDirLocation, opts) {
}

var files = fs.readdirSync(sourceDir);
var hasFilter = opts.filter || opts.include || opts.exclude;
var preserveFiles = opts.preserveFiles === true;

for(var i = 0; i < files.length; i++) {
// ignores all files or directories which match the RegExp in opts.filter
if(typeof opts !== 'undefined') {
if(!opts.whitelist && opts.filter && files[i].match(opts.filter)) continue;
// if opts.whitelist is true every file or directory which doesn't match opts.filter will be ignored
if(opts.whitelist && opts.filter && !files[i].match(opts.filter)) continue;
if(typeof opts !== 'undefined') {
if (hasFilter) {
if (!isFileIncluded(opts, sourceDir, files[i])) {
continue;
}
}

if (opts.excludeHiddenUnix && /^\./.test(files[i])) continue;
}

var currFile = fs.lstatSync(_path.join(sourceDir, files[i]));

var fCopyFile = function(srcFile, destFile) {
if(typeof opts !== 'undefined' && opts.preserveFiles && fs.existsSync(destFile)) return;

var contents = fs.readFileSync(srcFile);
fs.writeFileSync(destFile, contents);
exports.copyFileSync(srcFile, destFile, preserveFiles);
};

if(currFile.isDirectory()) {
Expand Down Expand Up @@ -291,10 +353,10 @@ 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)
return clbk(err);
return clbk(err);

if(typeof failSilent === 'function')
clbk = failSilent;
if(typeof failSilent === 'function')
clbk = failSilent;

(function rmFile(err){
if (err) return clbk(err);
Expand Down Expand Up @@ -325,16 +387,16 @@ exports.rmdirRecursive = function rmdirRecursive(dir, failSilent, clbk){
exports.copyDirRecursive = function copyDirRecursive(srcDir, newDir, opts, clbk) {
fs.stat(newDir, function(err, newDirStat){
if(!err) {
if(typeof opts !== 'undefined' && typeof opts !== 'function' && opts.forceDelete)
return exports.rmdirRecursive(newDir, function(err){
copyDirRecursive.apply(this, arguments);
});
else
return clbk(new Error('You are trying to delete a directory that already exists. Specify forceDelete in an options object to override this.'));
}

if(typeof opts === 'function')
clbk = opts;
if(typeof opts !== 'undefined' && typeof opts !== 'function' && opts.forceDelete)
return exports.rmdirRecursive(newDir, function(err){
copyDirRecursive.apply(this, arguments);
});
else
return clbk(new Error('You are trying to delete a directory that already exists. Specify forceDelete in an options object to override this.'));
}

if(typeof opts === 'function')
clbk = opts;

fs.stat(srcDir, function(err, srcDirStat){
if (err) return clbk(err);
Expand Down

0 comments on commit 5acb4ed

Please sign in to comment.