Skip to content

Commit

Permalink
Ignore paths from .gitignore (#147)
Browse files Browse the repository at this point in the history
  • Loading branch information
juanj authored and sindresorhus committed Oct 11, 2016
1 parent 8933f51 commit fa99f36
Show file tree
Hide file tree
Showing 12 changed files with 75 additions and 2 deletions.
23 changes: 22 additions & 1 deletion options-manager.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ const deepAssign = require('deep-assign');
const multimatch = require('multimatch');
const resolveFrom = require('resolve-from');
const pathExists = require('path-exists');
const parseGitignore = require('parse-gitignore');
const globby = require('globby');

const DEFAULT_IGNORE = [
'**/node_modules/**',
Expand Down Expand Up @@ -203,11 +205,29 @@ function groupConfigs(paths, baseOptions, overrides) {
return arr;
}

function getIgnores(opts) {
opts.ignores = DEFAULT_IGNORE.concat(opts.ignores || []);
const gitignores = globby.sync('**/.gitignore', {ignore: opts.ignores, cwd: opts.cwd || process.cwd()});
const ignores = gitignores
.map(pathToGitignore => {
const patterns = parseGitignore(pathToGitignore);
const base = path.dirname(pathToGitignore);

return patterns.map(file => path.join(base, file));
})
.reduce((a, b) => a.concat(b), []);

opts.ignores = opts.ignores.concat(ignores);

return opts;
}

function preprocess(opts) {
opts = mergeWithPkgConf(opts);
opts = normalizeOpts(opts);
opts.ignores = DEFAULT_IGNORE.concat(opts.ignores || []);
opts = getIgnores(opts);
opts.extensions = DEFAULT_EXTENSION.concat(opts.extensions || []);

return opts;
}

Expand All @@ -221,3 +241,4 @@ exports.mergeApplicableOverrides = mergeApplicableOverrides;
exports.groupConfigs = groupConfigs;
exports.preprocess = preprocess;
exports.emptyOptions = emptyOptions;
exports.getIgnores = getIgnores;
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@
"has-flag": "^2.0.0",
"meow": "^3.4.2",
"multimatch": "^2.1.0",
"parse-gitignore": "^0.3.1",
"path-exists": "^3.0.0",
"pkg-conf": "^2.0.0",
"resolve-cwd": "^1.0.0",
Expand Down
2 changes: 1 addition & 1 deletion readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ Additional global variables your code accesses during execution.

Type: `Array`

Some [paths](https://github.com/sindresorhus/xo/blob/master/options-manager.js) are ignored by default. Additional ignores can be added here.
Some [paths](https://github.com/sindresorhus/xo/blob/master/options-manager.js) are ignored by default, including paths in .gitignore. Additional ignores can be added here.

### space

Expand Down
2 changes: 2 additions & 0 deletions test/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# This is a test .gitignore.
foo/
1 change: 1 addition & 0 deletions test/bar/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
foo.js
1 change: 1 addition & 0 deletions test/bar/foobar/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
bar.js
11 changes: 11 additions & 0 deletions test/cli.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,17 @@ test.failing('ignores fixture', async t => {
t.throws(execa('../../../cli.js', ['--no-local'], {cwd}));
});

test('ignore files in .gitignore', async t => {
const cwd = path.join(__dirname, 'fixtures/gitignore');

try {
await execa('../../../cli.js', ['--no-local'], {cwd});
} catch (err) {
t.is(err.stdout.indexOf('foo.js'), -1);
t.true(err.stdout.indexOf('bar.js') !== -1);
}
});

test('supports being extended with a shareable config', async () => {
const cwd = path.join(__dirname, 'fixtures/project');
await execa('../../../cli.js', ['--no-local'], {cwd});
Expand Down
5 changes: 5 additions & 0 deletions test/fixtures/gitignore/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
'use strict'

module.exports = function (foo) {
return foo + 'bar'
}
1 change: 1 addition & 0 deletions test/fixtures/gitignore/test/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
foo.js
6 changes: 6 additions & 0 deletions test/fixtures/gitignore/test/bar.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import test from 'ava'
import fn from '../'

test(t => {
t.is(fn('foo'), fn('foobar'))
})
6 changes: 6 additions & 0 deletions test/fixtures/gitignore/test/foo.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import test from 'ava'
import fn from '../'

test(t => {
t.is(fn('foo'), fn('foobar'))
})
18 changes: 18 additions & 0 deletions test/options-manager.js
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,24 @@ test('groupConfigs', t => {
}));
});

test('gitignore', t => {
const result = manager.getIgnores({});
t.not(result.ignores.indexOf(path.join('foo', '**')), -1);
t.not(result.ignores.indexOf(path.join('bar', 'foo.js')), -1);
});

test('ignore ignored .gitignore', t => {
const opts = {
ignores: [
'**/foobar/**'
]
};

const result = manager.getIgnores(opts);

t.is(result.ignores.indexOf(path.join('bar', 'foobar', 'bar.js')), -1);
});

test('mergeWithPkgConf: use child if closest', t => {
const cwd = path.resolve('fixtures', 'nested', 'child');
const result = manager.mergeWithPkgConf({cwd});
Expand Down

0 comments on commit fa99f36

Please sign in to comment.