From 731e2b9591a3d99d949976c36f2c47e25d56a1e0 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Mon, 9 Dec 2019 10:56:30 -0800 Subject: [PATCH] Revert rootPath changes This reverts commits a416c77e56ef0314ae00633faa04878151610de8, 5bc80f3ea031739c2f8796857221be6825b288da, 0403a10885f2ce11c17c7222a70f8c73df7c3ba6 --- .../src/workspace-tests/workspace.test.ts | 2 +- .../workbench/api/common/extHostWorkspace.ts | 5 - .../browser/relauncher.contribution.ts | 99 +++++++++++++++++-- .../api/extHostWorkspace.test.ts | 2 +- 4 files changed, 93 insertions(+), 15 deletions(-) diff --git a/extensions/vscode-api-tests/src/workspace-tests/workspace.test.ts b/extensions/vscode-api-tests/src/workspace-tests/workspace.test.ts index 729dd8f14d5..f018f581c42 100644 --- a/extensions/vscode-api-tests/src/workspace-tests/workspace.test.ts +++ b/extensions/vscode-api-tests/src/workspace-tests/workspace.test.ts @@ -13,7 +13,7 @@ suite('workspace-namespace', () => { teardown(closeAllEditors); test('rootPath', () => { - assert.equal(vscode.workspace.rootPath, undefined); + assert.ok(pathEquals(vscode.workspace.rootPath!, join(__dirname, '../../testWorkspace'))); }); test('workspaceFile', () => { diff --git a/src/vs/workbench/api/common/extHostWorkspace.ts b/src/vs/workbench/api/common/extHostWorkspace.ts index 99654eded85..4b5c0c1301f 100644 --- a/src/vs/workbench/api/common/extHostWorkspace.ts +++ b/src/vs/workbench/api/common/extHostWorkspace.ts @@ -339,11 +339,6 @@ export class ExtHostWorkspace implements ExtHostWorkspaceShape, IExtHostWorkspac if (folders.length === 0) { return undefined; } - - if (folders.length > 1) { - return undefined; - } - // #54483 @Joh Why are we still using fsPath? return folders[0].uri.fsPath; } diff --git a/src/vs/workbench/contrib/relauncher/browser/relauncher.contribution.ts b/src/vs/workbench/contrib/relauncher/browser/relauncher.contribution.ts index 4ef39c8a040..a152b50423d 100644 --- a/src/vs/workbench/contrib/relauncher/browser/relauncher.contribution.ts +++ b/src/vs/workbench/contrib/relauncher/browser/relauncher.contribution.ts @@ -3,17 +3,23 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Disposable } from 'vs/base/common/lifecycle'; -import { isMacintosh, isNative } from 'vs/base/common/platform'; -import { localize } from 'vs/nls'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; -import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; -import { IProductService } from 'vs/platform/product/common/productService'; +import { IDisposable, dispose, Disposable, toDisposable } from 'vs/base/common/lifecycle'; +import { IWorkbenchContributionsRegistry, IWorkbenchContribution, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; import { Registry } from 'vs/platform/registry/common/platform'; import { IWindowsConfiguration } from 'vs/platform/windows/common/windows'; -import { Extensions as WorkbenchExtensions, IWorkbenchContribution, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; import { IHostService } from 'vs/workbench/services/host/browser/host'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { localize } from 'vs/nls'; +import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; +import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; +import { RunOnceScheduler } from 'vs/base/common/async'; +import { URI } from 'vs/base/common/uri'; +import { isEqual } from 'vs/base/common/resources'; +import { isMacintosh, isNative } from 'vs/base/common/platform'; +import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; +import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; +import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { IProductService } from 'vs/platform/product/common/productService'; interface IConfiguration extends IWindowsConfiguration { update: { mode: string; }; @@ -126,5 +132,82 @@ export class SettingsChangeRelauncher extends Disposable implements IWorkbenchCo } } +export class WorkspaceChangeExtHostRelauncher extends Disposable implements IWorkbenchContribution { + + private firstFolderResource?: URI; + private extensionHostRestarter: RunOnceScheduler; + + private onDidChangeWorkspaceFoldersUnbind: IDisposable | undefined; + + constructor( + @IWorkspaceContextService private readonly contextService: IWorkspaceContextService, + @IExtensionService extensionService: IExtensionService, + @IHostService hostService: IHostService, + @IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService + ) { + super(); + + this.extensionHostRestarter = this._register(new RunOnceScheduler(() => { + if (!!environmentService.extensionTestsLocationURI) { + return; // no restart when in tests: see https://github.com/Microsoft/vscode/issues/66936 + } + + if (environmentService.configuration.remoteAuthority) { + hostService.reload(); // TODO@aeschli, workaround + } else if (isNative) { + extensionService.restartExtensionHost(); + } + }, 10)); + + this.contextService.getCompleteWorkspace() + .then(workspace => { + this.firstFolderResource = workspace.folders.length > 0 ? workspace.folders[0].uri : undefined; + this.handleWorkbenchState(); + this._register(this.contextService.onDidChangeWorkbenchState(() => setTimeout(() => this.handleWorkbenchState()))); + }); + + this._register(toDisposable(() => { + if (this.onDidChangeWorkspaceFoldersUnbind) { + this.onDidChangeWorkspaceFoldersUnbind.dispose(); + } + })); + } + + private handleWorkbenchState(): void { + + // React to folder changes when we are in workspace state + if (this.contextService.getWorkbenchState() === WorkbenchState.WORKSPACE) { + + // Update our known first folder path if we entered workspace + const workspace = this.contextService.getWorkspace(); + this.firstFolderResource = workspace.folders.length > 0 ? workspace.folders[0].uri : undefined; + + // Install workspace folder listener + if (!this.onDidChangeWorkspaceFoldersUnbind) { + this.onDidChangeWorkspaceFoldersUnbind = this.contextService.onDidChangeWorkspaceFolders(() => this.onDidChangeWorkspaceFolders()); + } + } + + // Ignore the workspace folder changes in EMPTY or FOLDER state + else { + dispose(this.onDidChangeWorkspaceFoldersUnbind); + this.onDidChangeWorkspaceFoldersUnbind = undefined; + } + } + + private onDidChangeWorkspaceFolders(): void { + const workspace = this.contextService.getWorkspace(); + + // Restart extension host if first root folder changed (impact on deprecated workspace.rootPath API) + const newFirstFolderResource = workspace.folders.length > 0 ? workspace.folders[0].uri : undefined; + if (!isEqual(this.firstFolderResource, newFirstFolderResource)) { + this.firstFolderResource = newFirstFolderResource; + + this.extensionHostRestarter.schedule(); // buffer calls to extension host restart + } + } +} + const workbenchRegistry = Registry.as(WorkbenchExtensions.Workbench); workbenchRegistry.registerWorkbenchContribution(SettingsChangeRelauncher, LifecyclePhase.Restored); +workbenchRegistry.registerWorkbenchContribution(WorkspaceChangeExtHostRelauncher, LifecyclePhase.Restored); diff --git a/src/vs/workbench/test/electron-browser/api/extHostWorkspace.test.ts b/src/vs/workbench/test/electron-browser/api/extHostWorkspace.test.ts index d505968d588..c05a1d72fd8 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostWorkspace.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostWorkspace.test.ts @@ -120,7 +120,7 @@ suite('ExtHostWorkspace', function () { assert.equal(ws.getPath(), undefined); ws = createExtHostWorkspace(new TestRPCProtocol(), { id: 'foo', name: 'Test', folders: [aWorkspaceFolderData(URI.file('Folder'), 0), aWorkspaceFolderData(URI.file('Another/Folder'), 1)] }, new NullLogService()); - assert.equal(ws.getPath(), undefined); + assert.equal(ws.getPath()!.replace(/\\/g, '/'), '/Folder'); ws = createExtHostWorkspace(new TestRPCProtocol(), { id: 'foo', name: 'Test', folders: [aWorkspaceFolderData(URI.file('/Folder'), 0)] }, new NullLogService()); assert.equal(ws.getPath()!.replace(/\\/g, '/'), '/Folder'); -- GitLab