diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/workspace.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/workspace.test.ts index 31b471570a1..3949c1d1727 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/workspace.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/workspace.test.ts @@ -5,7 +5,7 @@ import * as assert from 'assert'; import * as vscode from 'vscode'; -import { createRandomFile, deleteFile, closeAllEditors, pathEquals, rndName, disposeAll, testFs, delay, withLogDisabled } from '../utils'; +import { createRandomFile, deleteFile, closeAllEditors, pathEquals, rndName, disposeAll, testFs, delay, withLogDisabled, revertAllDirty } from '../utils'; import { join, posix, basename } from 'path'; import * as fs from 'fs'; import { TestFS } from '../memfs'; @@ -288,7 +288,7 @@ suite('vscode API - workspace', () => { const file = await createRandomFile(); let disposables: vscode.Disposable[] = []; - await vscode.workspace.saveAll(); + await revertAllDirty(); // needed for a clean state for `onDidSaveTextDocument` (#102365) let pendingAsserts: Function[] = []; let onDidOpenTextDocument = false; @@ -330,6 +330,8 @@ suite('vscode API - workspace', () => { let disposables: vscode.Disposable[] = []; let pendingAsserts: Function[] = []; + await revertAllDirty(); // needed for a clean state for `onDidSaveTextDocument` (#102365) + let onDidSaveTextDocument = false; disposables.push(vscode.workspace.onDidSaveTextDocument(e => { pendingAsserts.push(() => assertEqualPath(e.uri.fsPath, file.fsPath)); diff --git a/extensions/vscode-api-tests/src/utils.ts b/extensions/vscode-api-tests/src/utils.ts index 3c34028feb4..e6a002aad2c 100644 --- a/extensions/vscode-api-tests/src/utils.ts +++ b/extensions/vscode-api-tests/src/utils.ts @@ -48,6 +48,10 @@ export function closeAllEditors(): Thenable { return vscode.commands.executeCommand('workbench.action.closeAllEditors'); } +export async function revertAllDirty(): Promise { + return vscode.commands.executeCommand('_workbench.revertAllDirty'); +} + export function disposeAll(disposables: vscode.Disposable[]) { vscode.Disposable.from(...disposables).dispose(); } diff --git a/src/vs/workbench/api/browser/mainThreadEditors.ts b/src/vs/workbench/api/browser/mainThreadEditors.ts index c6fdc10d334..157d9502816 100644 --- a/src/vs/workbench/api/browser/mainThreadEditors.ts +++ b/src/vs/workbench/api/browser/mainThreadEditors.ts @@ -27,6 +27,8 @@ import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editor import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; import { openEditorWith } from 'vs/workbench/services/editor/common/editorOpenWith'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { IWorkingCopyService } from 'vs/workbench/services/workingCopy/common/workingCopyService'; export class MainThreadTextEditors implements MainThreadTextEditorsShape { @@ -331,3 +333,15 @@ CommandsRegistry.registerCommand('_workbench.diff', function (accessor: Services return editorService.openEditor({ leftResource, rightResource, label, description, options }, viewColumnToEditorGroup(editorGroupService, position)).then(() => undefined); }); + +CommandsRegistry.registerCommand('_workbench.revertAllDirty', (accessor: ServicesAccessor) => { + const environmentService = accessor.get(IEnvironmentService); + if (!environmentService.extensionTestsLocationURI) { + throw new Error('Command is only available when running extension tests.'); + } + + const workingCopyService = accessor.get(IWorkingCopyService); + for (const workingCopy of workingCopyService.dirtyWorkingCopies) { + workingCopy.revert({ soft: true }); + } +});