Skip to content

[BUG] VSCode freezes on file change in large repo #1196

Open
@christianvuerings

Description

Describe the bug

VSCode freezes when making a file change (create / rename / delete) in a repo with lots of tests.

To Reproduce
Steps to reproduce the behavior:

  1. Clone repo with many test files: git clone https://github.com/christianvuerings/vscode-jest-large-repo.git
  2. Open VSCode with that repo: cd vscode-jest-large-repo; code .
  3. Run all tests in test explorer (running just 1 test also repros the issue)
    Image
  4. After tests finish to run, rename a non-test file src/main.js to src/main_renamed.js: mv src/main.js src/main_renamed.js

Expected behavior
VSCode doesn't freeze

Actual behavior
VSCode freezes for 5-10 seconds

Screenshots
If applicable, add screenshots to help explain your problem.

First part: shows freezing issue with 2 separate renames.
Second part: renaming works smoothly without the VSCode Jest extension

vscode-jest-free-file-rename.mp4

Environment:

  • vscode-jest version: v6.4.0
  • node -v: v18.16.1
  • npm -v or yarn --version: 9.5.1
  • jest or react-scripts (if you haven’t ejected) version: Jest 29.7.0
  • your vscode-jest settings:
    • jest.jestCommandLine? None
    • jest.runMode? on-demand
    • jest.outputConfig? None
    • anything else that you think might be relevant? Set deferred to true
  • Operating system: Mac OS 14.6.1

Prerequisite

  • are you able to run jest from the command line? Yes
  • where do you run jest CLI from? Root directory of the project
  • how do you run your tests from the command line? npm run test

Additional context
Add any other context about the problem here.

When debugging the root cause seems to be updateTestFileList:

private async updateTestFileList(): Promise<void> {
return new Promise((resolve, reject) => {
this.processSession.scheduleProcess({
type: 'list-test-files',
onResult: (files, error, exitCode) => {
this.setTestFiles(files);
this.logging('debug', `found ${files?.length} testFiles`);
if (error) {
const msg =
'failed to retrieve test file list. TestExplorer might show incomplete test items';
this.extContext.output.write(error, 'new-line');
const errorType = getExitErrorDef(exitCode) ?? 'error';
this.extContext.output.write(msg, errorType);
this.logging('error', msg, error);
reject(error);
} else {
resolve();
}
},
});
});
}

Which gets called on every file create, delete or rename

onDidCreateFiles(_event: vscode.FileCreateEvent): void {
this.updateTestFileList();
}
onDidRenameFiles(_event: vscode.FileRenameEvent): void {
this.updateTestFileList();
}
onDidDeleteFiles(_event: vscode.FileDeleteEvent): void {
this.updateTestFileList();
}

If we comment out the contents of updateTestFileList everything works smoothly

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions