Skip to content

Commit 9199a1b

Browse files
GAumalabestander
authored andcommitted
Give higher priority to .npmignore over .gitignore (#3538)
If .npmignore or .yarnignore are present in a directory that also contains .gitignore, don't take into account .gitignore when running the pack command. New function filterOverridenGitignores takes a WalkFiles object with all the potential package files and returns another WalkFiles object only with the relevant dot ignore files (.npmignore, .yarnignore or .gitignore) taking into account the priority rules. This new collection is the used by the pack command to create the ignore regexes.
1 parent 7a5df84 commit 9199a1b

File tree

3 files changed

+51
-11
lines changed

3 files changed

+51
-11
lines changed

__tests__/util/filter.js

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/* @flow */
22

3-
import {ignoreLinesToRegex} from '../../src/util/filter.js';
3+
import {ignoreLinesToRegex, filterOverridenGitignores} from '../../src/util/filter.js';
44

55
test('ignoreLinesToRegex', () => {
66
expect(
@@ -60,3 +60,26 @@ test('ignoreLinesToRegex', () => {
6060
{base: '.', isNegation: true, pattern: ' F # # ', regex: /^(?:F # #)$/i},
6161
]);
6262
});
63+
64+
test('filterOverridenGitignores', () => {
65+
expect(
66+
filterOverridenGitignores([
67+
{relative: '.gitignore', basename: '.gitignore', absolute: '/home/user/p/.gitignore', mtime: 0},
68+
{relative: '.npmignore', basename: '.npmignore', absolute: '/home/user/p/.npmignore', mtime: 0},
69+
{relative: 'docs', basename: 'lib', absolute: '/home/user/p/docs', mtime: 0},
70+
{relative: 'docs/file.txt', basename: 'file.txt', absolute: '/home/user/p/docs/file.txt', mtime: 0},
71+
{relative: 'index.js', basename: 'index.js', absolute: '/home/user/p/index.js', mtime: 0},
72+
{relative: 'lib', basename: 'lib', absolute: '/home/user/p/lib', mtime: 0},
73+
{relative: 'lib/.gitignore', basename: '.gitignore', absolute: '/home/user/p/lib/.gitignore', mtime: 0},
74+
{relative: 'lib/index.js', basename: 'index.js', absolute: '/home/user/p/lib/index.js', mtime: 0},
75+
{relative: 'README.md', basename: 'README.md', absolute: '/home/user/p/README.md', mtime: 0},
76+
{relative: 'src', basename: 'src', absolute: '/home/user/p/src', mtime: 0},
77+
{relative: 'src/.yarnignore', basename: '.yarnignore', absolute: '/home/user/p/src/.yarnignore', mtime: 0},
78+
{relative: 'src/app.js', basename: 'app.js', absolute: '/home/user/p/src/app.js', mtime: 0},
79+
]),
80+
).toEqual([
81+
{relative: '.npmignore', basename: '.npmignore', absolute: '/home/user/p/.npmignore', mtime: 0},
82+
{relative: 'lib/.gitignore', basename: '.gitignore', absolute: '/home/user/p/lib/.gitignore', mtime: 0},
83+
{relative: 'src/.yarnignore', basename: '.yarnignore', absolute: '/home/user/p/src/.yarnignore', mtime: 0},
84+
]);
85+
});

src/cli/commands/pack.js

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import type {Reporter} from '../../reporters/index.js';
44
import type Config from '../../config.js';
55
import type {IgnoreFilter} from '../../util/filter.js';
66
import * as fs from '../../util/fs.js';
7-
import {sortFilter, ignoreLinesToRegex} from '../../util/filter.js';
7+
import {sortFilter, ignoreLinesToRegex, filterOverridenGitignores} from '../../util/filter.js';
88
import {MessageError} from '../../errors.js';
99

1010
const zlib = require('zlib');
@@ -84,18 +84,16 @@ export async function pack(config: Config, dir: string): Promise<stream$Duplex>
8484
filters = filters.concat(regexes);
8585
}
8686

87-
//
8887
const files = await fs.walk(config.cwd, null, new Set(FOLDERS_IGNORE));
88+
const dotIgnoreFiles = filterOverridenGitignores(files);
8989

9090
// create ignores
91-
for (const file of files) {
92-
if (IGNORE_FILENAMES.indexOf(path.basename(file.relative)) >= 0) {
93-
const raw = await fs.readFile(file.absolute);
94-
const lines = raw.split('\n');
95-
96-
const regexes = ignoreLinesToRegex(lines, path.dirname(file.relative));
97-
filters = filters.concat(regexes);
98-
}
91+
for (const file of dotIgnoreFiles) {
92+
const raw = await fs.readFile(file.absolute);
93+
const lines = raw.split('\n');
94+
95+
const regexes = ignoreLinesToRegex(lines, path.dirname(file.relative));
96+
filters = filters.concat(regexes);
9997
}
10098

10199
// files to definitely keep, takes precedence over ignore filter

src/util/filter.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,3 +145,22 @@ export function ignoreLinesToRegex(lines: Array<string>, base: string = '.'): Ar
145145
.filter(Boolean)
146146
);
147147
}
148+
149+
export function filterOverridenGitignores(files: WalkFiles): WalkFiles {
150+
const IGNORE_FILENAMES = ['.yarnignore', '.npmignore', '.gitignore'];
151+
const GITIGNORE_NAME = IGNORE_FILENAMES[2];
152+
return files.filter(file => IGNORE_FILENAMES.includes(file.basename)).reduce((acc: WalkFiles, file) => {
153+
if (file.basename !== GITIGNORE_NAME) {
154+
return [...acc, file];
155+
} else {
156+
//don't include .gitignore if .npmignore or .yarnignore are present
157+
const dir = path.dirname(file.absolute);
158+
const higherPriorityIgnoreFilePaths = [`${dir}/${IGNORE_FILENAMES[0]}`, `${dir}/${IGNORE_FILENAMES[1]}`];
159+
const hasHigherPriorityFiles = files.find(file => higherPriorityIgnoreFilePaths.includes(file.absolute));
160+
if (!hasHigherPriorityFiles) {
161+
return [...acc, file];
162+
}
163+
}
164+
return acc;
165+
}, []);
166+
}

0 commit comments

Comments
 (0)