From e4023f687616dcf4816545b8eefbcce50e255c9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iiro=20J=C3=A4ppinen?= Date: Wed, 24 Jan 2024 18:27:51 +0200 Subject: [PATCH] fix: ignore stdin of spawned commands --- .changeset/dirty-eagles-decide.md | 5 +++++ lib/execGit.js | 1 + lib/resolveTaskFn.js | 1 + test/unit/execGit.spec.js | 2 ++ test/unit/makeCmdTasks.spec.js | 2 ++ test/unit/resolveTaskFn.spec.js | 7 +++++++ test/unit/resolveTaskFn.unmocked.spec.js | 6 ++++-- 7 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 .changeset/dirty-eagles-decide.md diff --git a/.changeset/dirty-eagles-decide.md b/.changeset/dirty-eagles-decide.md new file mode 100644 index 000000000..1779672c9 --- /dev/null +++ b/.changeset/dirty-eagles-decide.md @@ -0,0 +1,5 @@ +--- +'lint-staged': patch +--- + +Ignore stdin of spawned commands so that they don't get stuck waiting. Until now, _lint-staged_ has used the default settings to spawn linter commands. This means the `stdin` of the spawned commands has accepted input, and essentially gotten stuck waiting. Now the `stdin` is ignored and commands will no longer get stuck. If you relied on this behavior, please open a new issue and describe how; the behavior has not been intended. diff --git a/lib/execGit.js b/lib/execGit.js index e2f79c6b4..65a43623c 100644 --- a/lib/execGit.js +++ b/lib/execGit.js @@ -19,6 +19,7 @@ export const execGit = async (cmd, options = {}) => { ...options, all: true, cwd: options.cwd || process.cwd(), + stdin: 'ignore', }) return stdout } catch ({ all }) { diff --git a/lib/resolveTaskFn.js b/lib/resolveTaskFn.js index 71f468fbb..95e2349d3 100644 --- a/lib/resolveTaskFn.js +++ b/lib/resolveTaskFn.js @@ -152,6 +152,7 @@ export const resolveTaskFn = ({ preferLocal: true, reject: false, shell, + stdin: 'ignore', } debugLog('execaOptions:', execaOptions) diff --git a/test/unit/execGit.spec.js b/test/unit/execGit.spec.js index 97b40117a..d6acf3f78 100644 --- a/test/unit/execGit.spec.js +++ b/test/unit/execGit.spec.js @@ -21,6 +21,7 @@ describe('execGit', () => { expect(execa).toHaveBeenCalledWith('git', [...GIT_GLOBAL_OPTIONS, 'init', 'param'], { all: true, cwd, + stdin: 'ignore', }) }) @@ -30,6 +31,7 @@ describe('execGit', () => { expect(execa).toHaveBeenCalledWith('git', [...GIT_GLOBAL_OPTIONS, 'init', 'param'], { all: true, cwd, + stdin: 'ignore', }) }) }) diff --git a/test/unit/makeCmdTasks.spec.js b/test/unit/makeCmdTasks.spec.js index a599fd056..71cfec165 100644 --- a/test/unit/makeCmdTasks.spec.js +++ b/test/unit/makeCmdTasks.spec.js @@ -49,6 +49,7 @@ describe('makeCmdTasks', () => { preferLocal: true, reject: false, shell: false, + stdin: 'ignore', }) taskPromise = linter2.task() expect(taskPromise).toBeInstanceOf(Promise) @@ -59,6 +60,7 @@ describe('makeCmdTasks', () => { preferLocal: true, reject: false, shell: false, + stdin: 'ignore', }) }) diff --git a/test/unit/resolveTaskFn.spec.js b/test/unit/resolveTaskFn.spec.js index 8df03bf25..48f4b0f99 100644 --- a/test/unit/resolveTaskFn.spec.js +++ b/test/unit/resolveTaskFn.spec.js @@ -40,6 +40,7 @@ describe('resolveTaskFn', () => { preferLocal: true, reject: false, shell: false, + stdin: 'ignore', }) }) @@ -58,6 +59,7 @@ describe('resolveTaskFn', () => { preferLocal: true, reject: false, shell: false, + stdin: 'ignore', }) }) @@ -77,6 +79,7 @@ describe('resolveTaskFn', () => { preferLocal: true, reject: false, shell: true, + stdin: 'ignore', }) }) @@ -95,6 +98,7 @@ describe('resolveTaskFn', () => { preferLocal: true, reject: false, shell: true, + stdin: 'ignore', }) }) @@ -113,6 +117,7 @@ describe('resolveTaskFn', () => { preferLocal: true, reject: false, shell: '/bin/bash', + stdin: 'ignore', }) }) @@ -131,6 +136,7 @@ describe('resolveTaskFn', () => { preferLocal: true, reject: false, shell: false, + stdin: 'ignore', }) }) @@ -145,6 +151,7 @@ describe('resolveTaskFn', () => { preferLocal: true, reject: false, shell: false, + stdin: 'ignore', }) }) diff --git a/test/unit/resolveTaskFn.unmocked.spec.js b/test/unit/resolveTaskFn.unmocked.spec.js index 61502791f..136e8b1c4 100644 --- a/test/unit/resolveTaskFn.unmocked.spec.js +++ b/test/unit/resolveTaskFn.unmocked.spec.js @@ -17,7 +17,7 @@ describe('resolveTaskFn', () => { const context = getInitialState() const taskFn = resolveTaskFn({ - command: 'node', + command: 'node -e "setTimeout(() => void 0, 10000)"', isFn: true, }) const taskPromise = taskFn(context) @@ -31,6 +31,8 @@ describe('resolveTaskFn', () => { await expect(task2Promise).rejects.toThrowErrorMatchingInlineSnapshot( `"node -e "process.exit(1)" [FAILED]"` ) - await expect(taskPromise).rejects.toThrowErrorMatchingInlineSnapshot(`"node [KILLED]"`) + await expect(taskPromise).rejects.toThrowErrorMatchingInlineSnapshot( + `"node -e "setTimeout(() => void 0, 10000)" [KILLED]"` + ) }) })