Skip to content

Commit

Permalink
fix readdirtree ignore stuff
Browse files Browse the repository at this point in the history
  • Loading branch information
greggman committed Jul 18, 2015
1 parent a4e120f commit 5faf6ae
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 16 deletions.
30 changes: 17 additions & 13 deletions lib/readdirtree.js
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,14 @@ var readDirTreeSync = function(filePath, options) {
return fileNames;
};

var globToRegex = function(glob) {
return glob
.replace(/\//g, "\/")
.replace(/\./g, "\\.")
.replace(/\?/g, ".")
.replace(/\*/g, ".*?");
};

var makeIgnoreFunc = function(ignore) {
var negate = false;
var mustBeDir = false;
Expand All @@ -86,21 +94,16 @@ var makeIgnoreFunc = function(ignore) {
ignore = "\/" + ignore;
}
if (ignore.substr(-1) === "/") {
ignore = ignore.substr(0, ignore.length - 1);
mustBeDir = true;
}
ignore = ignore
.replace(/\//g, "\/")
.replace(/\*/g, "[^/]*")
.replace(/\./g, "\\.")
.replace(/\?/g, ".");
ignore = globToRegex(ignore);
if (!mustBeDir && ignore.substr(0, 1) !== "^") {
ignore += "$";
}
var re = new RegExp(ignore);

return function(filename, filePath, isDir) {
filename = "/" + filename;
if (mustBeDir && !isDir) {
return true;
}
filename = "/" + filename + (isDir ? "/" : "");
var ignore = !re.test(filename);
if (negate) {
ignore = !ignore;
Expand All @@ -113,7 +116,7 @@ var makeIgnoreFilter = function(ignores) {
if (!ignores) {
return function() {
return true;
}
};
}

var ignoreFuncs = ignores.map(makeIgnoreFunc);
Expand All @@ -122,14 +125,15 @@ var makeIgnoreFilter = function(ignores) {
var filename = nativeFilename.replace(/\\/g, '/');
for (var ii = 0; ii < ignoreFuncs.length; ++ii) {
var ignoreFunc = ignoreFuncs[ii];
if (!ignoreFunc(filename, filePath, isDir)) {
var result = ignoreFunc(filename, filePath, isDir);
if (!result) {
return false;
}
}
return true;
};
};

exports.makeIgnoreFilter = makeIgnoreFilter
exports.makeIgnoreFilter = makeIgnoreFilter;
exports.sync = readDirTreeSync;

41 changes: 38 additions & 3 deletions test/lib/readdirtree-test.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/*
/*
* Copyright 2014, Gregg Tavares.
* All rights reserved.
*
Expand Down Expand Up @@ -40,6 +40,8 @@ describe('readdirtree', function() {
it('should ignore files', function() {
var ignoreFn = readdirtree.makeIgnoreFilter(['foo.jpg']);
ignoreFn("foo.jpg", ".", false).should.be.false();
ignoreFn("sfoo.jpg", ".", false).should.be.true();
ignoreFn("foo.jpgs", ".", false).should.be.true();
ignoreFn("foodjpg", ".", false).should.be.true();
ignoreFn("bar/foo.jpg", ".", false).should.be.false();
ignoreFn("bar/moo/foo.jpg", ".", false).should.be.false();
Expand Down Expand Up @@ -83,6 +85,7 @@ describe('readdirtree', function() {
var ignoreFn = readdirtree.makeIgnoreFilter(['foo/']);
ignoreFn("foo", ".", true).should.be.false();
ignoreFn("foo", ".", false).should.be.true();
ignoreFn("foo/abc", ".", false).should.be.false();
ignoreFn("bar/foo", ".", true).should.be.false();
ignoreFn("bar/foo", ".", false).should.be.true();
});
Expand Down Expand Up @@ -132,8 +135,40 @@ describe('readdirtree', function() {
it('should not ignore only dir', function() {
var ignoreFn = readdirtree.makeIgnoreFilter(['!foo/']);
ignoreFn("foo", ".", true).should.be.true();
ignoreFn("foo", ".", false).should.be.true();
ignoreFn("foo", ".", false).should.be.false();
ignoreFn("foo/abc", ".", false).should.be.true();
ignoreFn("bar/foo", ".", true).should.be.true();
ignoreFn("bar/foo", ".", false).should.be.true();
ignoreFn("bar/foo", ".", false).should.be.false();
});

it('should filter out "/src/"', function() {
var ignoreFn = readdirtree.makeIgnoreFilter(['/src/']);
[
[ '3rdparty', '/Users/gregg/src/hft-garden', true ],
[ 'LICENSE.md', '/Users/gregg/src/hft-garden', false ],
[ 'README.md', '/Users/gregg/src/hft-garden', false ],
[ 'assets', '/Users/gregg/src/hft-garden', true ],
[ 'bower.json', '/Users/gregg/src/hft-garden', false ],
[ 'bower_components', '/Users/gregg/src/hft-garden', true ],
[ 'controller.html', '/Users/gregg/src/hft-garden', false ],
[ 'css', '/Users/gregg/src/hft-garden', true ],
[ 'game.html', '/Users/gregg/src/hft-garden', false ],
[ 'icon.png', '/Users/gregg/src/hft-garden', false ],
[ 'package.json', '/Users/gregg/src/hft-garden', false ],
[ 'screenshot.png', '/Users/gregg/src/hft-garden', false ],
[ 'scripts', '/Users/gregg/src/hft-garden', true ],
[ 'src', '/Users/gregg/src/hft-garden', true, false ],
[ 'scripts/stem.js', '/Users/gregg/src/hft-garden', false ],
[ 'scripts/tree.js', '/Users/gregg/src/hft-garden', false ],
[ 'scripts/tweeny.js', '/Users/gregg/src/hft-garden', false ],
[ 'src/flap.psd', '/Users/gregg/src/hft-garden', false, false ],
[ 'src/flap02.psd', '/Users/gregg/src/hft-garden', false, false ],
[ 'src/flap03.psd', '/Users/gregg/src/hft-garden', false, false ],
].forEach(function(f) {
var result = ignoreFn(f[0], f[1], f[2]);
var expected = (f[3] === false) ? false : true;
should.equal(result, expected, f[0]);
});
});

});

0 comments on commit 5faf6ae

Please sign in to comment.