c9-core/test/filefinder.js

165 wiersze
4.4 KiB
JavaScript

/*
filefinder - find files matching a specific file name pattern that are not found on a specified blacklist
=example=
ff.find("/tmp", "files", ".*_test.js", "/tmp/blacklist", function(err, res) {
console.log(util.inspect(res));
});
--dirlist--
one_test.js
two_test.js
three.js
four_test.js
--blacklist--
one_test.js
files/two_test.js
four
--result--
{ countOk: 2,
countPatternMis: 1,
countBl: 1,
list: [ 'files/four_test.js', 'files/one_test.js' ] }
*/
var fs = require("fs");
var util = require("util");
var path = require("path");
var DEBUGMODE = false;
function filefinder(basedir, subdir, fnpattern, blacklistfile, cb) {
if (DEBUGMODE) console.log("\n\n\n\nfilefinder()");
if (cb) cb();
}
filefinder.prototype.find = function(basedir, subdir, fnpattern, blacklistfile, cb) {
if (DEBUGMODE) console.log("\n\n\n\nfind(%s, %s, %s)", path.join(basedir, subdir), fnpattern, blacklistfile);
this.basedir = basedir;
this.subdir = subdir;
this.pattern = fnpattern;
this.blacklistfile = blacklistfile;
this.flist = [];
this.countBlacklisted = 0;
this.countPatternMis = 0;
var _self = this;
_self.getBlacklist(this.blacklistfile, function(err, blacklist) {
_self.treewalk(basedir, subdir, fnpattern, blacklist, _self.flist, function(err, res) {
// compose results object
var result = {
countOk: _self.flist.length,
countPatternMis: _self.countPatternMis,
countBl: _self.countBlacklisted,
list: _self.flist,
blacklist: blacklist
};
cb(null, result);
});
});
};
filefinder.prototype.getBlacklist = function(filename, cb) {
if (DEBUGMODE) console.log("getBlacklist()");
var _self = this;
_self.getFileInArray(filename, function(err, blacklist) {
if (err) return cb(new Error("error reading blacklist file"));
_self.arrayRemoveCrap(blacklist, function(err, blacklist) {
if (DEBUGMODE) console.log("--blacklist--\nlength: %s\n%s\n-------------", blacklist.length, util.inspect(blacklist));
cb(null, blacklist);
});
});
};
// read a text file and make each line a member of an array
filefinder.prototype.getFileInArray = function(filename, cb) {
if (DEBUGMODE) console.log("getFileInArray()");
var array = [];
fs.exists(filename, function (exists) {
if (!exists) return cb(null, array);
fs.readFile(filename, function(err, data) {
if(err) return cb(err);
array = data.toString().split("\n");
cb(null, array);
});
});
};
filefinder.prototype.arrayRemoveCrap = function(array, cb) {
if (DEBUGMODE) console.log("arrayRemoveCrap()");
function removeComments(element, index, array) {
// clean-up whitespace, comments etc.
array[index] = array[index].replace(/\s*#.*|^\s*|\s*$/g, '');
}
array.forEach(removeComments);
array = array.filter(function(e) {
return e !== "";
});
cb(null, array);
};
filefinder.prototype.treewalk = function(basedir, subdir, fnpattern, blacklist, foundfilesarray, cb) {
var _self = this;
var fulldir = path.join(basedir, subdir);
if (DEBUGMODE) console.log(">treewalk (dir: %s, fnpattern: %s)", fulldir, fnpattern);
var results = [];
fs.readdir(fulldir, function(err, list) {
if (err) return cb(err);
var i = 0;
function next() {
var file = list[i++];
if (!file) return cb(null, foundfilesarray.length);
var filepath = path.join(fulldir, file);
// get file info
fs.stat(filepath, function(err, stat) {
if (stat && stat.isDirectory()) {
// directory, so recurse
_self.treewalk(basedir, path.join(subdir, file), fnpattern, blacklist, foundfilesarray, function(err, res) {
results = results.concat(res);
next();
});
}
else {
// file found, matches pattern?
if (file.match(fnpattern) === null) {
_self.countPatternMis++;
return next();
}
// check if blacklisted
var partName = path.join(subdir, file);
if (!blacklist || blacklist.indexOf(partName) == -1) {
if (DEBUGMODE) console.log("file found: %s", partName);
foundfilesarray.push(partName);
}
else {
_self.countBlacklisted++;
if (DEBUGMODE) console.log("File blacklisted: ", partName);
}
next();
}
});
}
next();
});
};
// export the class
module.exports = new filefinder();