diff --git a/lib/gitWorkflow.js b/lib/gitWorkflow.js index 321b137b5..2d2822dcd 100644 --- a/lib/gitWorkflow.js +++ b/lib/gitWorkflow.js @@ -193,8 +193,8 @@ class GitWorkflow { // Manually check and backup if necessary await this.backupMergeStatus() - // Save stash of entire original state, including unstaged and untracked changes - await this.execGit(['stash', 'save', '--include-untracked', STASH]) + // Save stash of original state + await this.execGit(['stash', 'save', STASH]) await this.execGit(['stash', 'apply', '--quiet', '--index', await this.getBackupStash()]) // Restore meta information about ongoing git merge, cleared by `git stash` diff --git a/lib/runAll.js b/lib/runAll.js index 328efa5d9..ef6ca672d 100644 --- a/lib/runAll.js +++ b/lib/runAll.js @@ -254,7 +254,7 @@ const runAll = async ( > git stash list stash@{0}: On master: automatic lint-staged backup - > git stash pop stash@{0}\n`) + > git stash apply --index stash@{0}\n`) } } diff --git a/test/runAll.unmocked.2.spec.js b/test/runAll.unmocked.2.spec.js index 86aea6588..b20fb3477 100644 --- a/test/runAll.unmocked.2.spec.js +++ b/test/runAll.unmocked.2.spec.js @@ -124,7 +124,7 @@ describe('runAll', () => { > git stash list stash@{0}: On master: automatic lint-staged backup - > git stash pop stash@{0} + > git stash apply --index stash@{0} " `) }) diff --git a/test/runAll.unmocked.spec.js b/test/runAll.unmocked.spec.js index 1f78eece1..3a7a82217 100644 --- a/test/runAll.unmocked.spec.js +++ b/test/runAll.unmocked.spec.js @@ -428,7 +428,7 @@ describe('runAll', () => { > git stash list stash@{0}: On master: automatic lint-staged backup - > git stash pop stash@{0} + > git stash apply --index stash@{0} " `) @@ -608,6 +608,29 @@ describe('runAll', () => { expect(Buffer.from(await readFile('binary'), 'binary').toString()).toEqual('Hello, World!') }) + it('should keep untracked files when taks fails', async () => { + // Stage unfixable file + await appendFile('test.js', testJsFileUnfixable) + await execGit(['add', 'test.js']) + + // Add untracked files + await appendFile('test-untracked.js', testJsFilePretty) + await appendFile('.gitattributes', 'binary\n') + await writeFile('binary', Buffer.from('Hello, World!', 'binary')) + + // Run lint-staged with `prettier --list-different` and commit pretty file + await expect( + gitCommit({ config: { '*.js': 'prettier --list-different' } }) + ).rejects.toThrowError() + + // Something was wrong so the repo is returned to original state + expect(await execGit(['rev-list', '--count', 'HEAD'])).toEqual('1') + expect(await execGit(['log', '-1', '--pretty=%B'])).toMatch('initial commit') + expect(await readFile('test.js')).toEqual(testJsFileUnfixable) + expect(await readFile('test-untracked.js')).toEqual(testJsFilePretty) + expect(Buffer.from(await readFile('binary'), 'binary').toString()).toEqual('Hello, World!') + }) + it('should work when amending previous commit with unstaged changes', async () => { // Edit file from previous commit await appendFile('README.md', '\n## Amended\n')