From 43c39055dd18111b58e6436c8b1570e0ff7f3465 Mon Sep 17 00:00:00 2001 From: Jan Nicklas Date: Tue, 15 Jan 2019 11:52:29 +0100 Subject: [PATCH] fix: also use .prettierignore from current working directory (#14) --- README.md | 2 +- src/__tests__/scm-git.test.js | 21 ++++++++++++++++++++- src/__tests__/scm-hg.test.js | 21 ++++++++++++++++++++- src/index.js | 12 ++++++++++-- 4 files changed, 51 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index c80287c..ac4f328 100644 --- a/README.md +++ b/README.md @@ -108,4 +108,4 @@ For example `pretty-quick --since HEAD` will format only staged files. ## Configuration and Ignore Files -`pretty-quick` will respect your [`.prettierrc`](https://prettier.io/docs/en/configuration), [`.prettierignore`](https://prettier.io/docs/en/ignore#ignoring-files), and [`.editorconfig`](http://editorconfig.org/) files, so there's no additional setup required. Configuration files will be found by searching up the file system. `.prettierignore` files are only found from the working directory that the command was executed from. +`pretty-quick` will respect your [`.prettierrc`](https://prettier.io/docs/en/configuration), [`.prettierignore`](https://prettier.io/docs/en/ignore#ignoring-files), and [`.editorconfig`](http://editorconfig.org/) files, so there's no additional setup required. Configuration files will be found by searching up the file system. `.prettierignore` files are only found from the repository root and the working directory that the command was executed from. diff --git a/src/__tests__/scm-git.test.js b/src/__tests__/scm-git.test.js index 53436c9..025de60 100644 --- a/src/__tests__/scm-git.test.js +++ b/src/__tests__/scm-git.test.js @@ -11,12 +11,13 @@ afterEach(() => { jest.clearAllMocks(); }); -const mockGitFs = (additionalUnstaged = '') => { +const mockGitFs = (additionalUnstaged = '', additionalFiles = {}) => { mock({ '/.git': {}, '/raz.js': 'raz()', '/foo.js': 'foo()', '/bar.md': '# foo', + ...additionalFiles, }); execa.sync.mockImplementation((command, args) => { if (command !== 'git') { @@ -241,4 +242,22 @@ describe('with git', () => { expect(onExamineFile).not.toHaveBeenCalledWith('./foo.js'); expect(onExamineFile).not.toHaveBeenCalledWith('./bar.md'); }); + + test('ignore files matching patterns from the repositories root .prettierignore', () => { + const onWriteFile = jest.fn(); + mockGitFs('', { + '/.prettierignore': '*.md', + }); + prettyQuick('/sub-directory/', { since: 'banana', onWriteFile }); + expect(onWriteFile.mock.calls).toEqual([['./foo.js']]); + }); + + test('ignore files matching patterns from the working directories .prettierignore', () => { + const onWriteFile = jest.fn(); + mockGitFs('', { + '/sub-directory/.prettierignore': '*.md', + }); + prettyQuick('/sub-directory/', { since: 'banana', onWriteFile }); + expect(onWriteFile.mock.calls).toEqual([['./foo.js']]); + }); }); diff --git a/src/__tests__/scm-hg.test.js b/src/__tests__/scm-hg.test.js index fab4538..81b4646 100644 --- a/src/__tests__/scm-hg.test.js +++ b/src/__tests__/scm-hg.test.js @@ -11,11 +11,12 @@ afterEach(() => { jest.clearAllMocks(); }); -const mockHgFs = () => { +const mockHgFs = (additionalFiles = {}) => { mock({ '/.hg': {}, '/foo.js': 'foo()', '/bar.md': '# foo', + ...additionalFiles, }); execa.sync.mockImplementation((command, args) => { if (command !== 'hg') { @@ -152,4 +153,22 @@ describe('with hg', () => { expect(onExamineFile).not.toHaveBeenCalledWith('./foo.js'); expect(onExamineFile).not.toHaveBeenCalledWith('./bar.md'); }); + + test('ignore files matching patterns from the repositories root .prettierignore', () => { + const onWriteFile = jest.fn(); + mockHgFs({ + '/.prettierignore': '*.md', + }); + prettyQuick('/sub-directory/', { since: 'banana', onWriteFile }); + expect(onWriteFile.mock.calls).toEqual([['./foo.js']]); + }); + + test('ignore files matching patterns from the working directories .prettierignore', () => { + const onWriteFile = jest.fn(); + mockHgFs({ + '/sub-directory/.prettierignore': '*.md', + }); + prettyQuick('/sub-directory/', { since: 'banana', onWriteFile }); + expect(onWriteFile.mock.calls).toEqual([['./foo.js']]); + }); }); diff --git a/src/index.js b/src/index.js index f1fb2d5..280c831 100644 --- a/src/index.js +++ b/src/index.js @@ -29,16 +29,24 @@ export default ( onFoundSinceRevision && onFoundSinceRevision(scm.name, revision); + const rootIgnorer = createIgnorer(directory); + const cwdIgnorer = + currentDirectory !== directory + ? createIgnorer(currentDirectory) + : () => true; + const changedFiles = scm .getChangedFiles(directory, revision, staged) .filter(isSupportedExtension) - .filter(createIgnorer(directory)); + .filter(rootIgnorer) + .filter(cwdIgnorer); const unstagedFiles = staged ? scm .getUnstagedChangedFiles(directory, revision) .filter(isSupportedExtension) - .filter(createIgnorer(directory)) + .filter(rootIgnorer) + .filter(cwdIgnorer) : []; const wasFullyStaged = f => unstagedFiles.indexOf(f) < 0;