From a050619e35944629e8ff9d4a33397b7e7fafbee6 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 16 Apr 2024 14:16:11 +0200 Subject: [PATCH 1/2] Enable workspace extensions --- .vscode/settings.json | 1 - .../browser/workspaceRecommendations.ts | 19 ++++------- .../extensionRecommendationsService.test.ts | 1 - .../common/extensionManagement.ts | 1 - .../common/extensionManagementService.ts | 33 +++---------------- .../test/browser/workbenchTestServices.ts | 1 - 6 files changed, 11 insertions(+), 45 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index cb577d02703ea..d56fe6acf77fb 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -168,7 +168,6 @@ "[github-issues]": { "editor.wordWrap": "on" }, - "extensions.experimental.supportWorkspaceExtensions": true, "css.format.spaceAroundSelectorSeparator": true, "inlineChat.mode": "live", "typescript.enablePromptUseWorkspaceTsdk": true, diff --git a/src/vs/workbench/contrib/extensions/browser/workspaceRecommendations.ts b/src/vs/workbench/contrib/extensions/browser/workspaceRecommendations.ts index 81b3d737aa559..eda5f43eac0ba 100644 --- a/src/vs/workbench/contrib/extensions/browser/workspaceRecommendations.ts +++ b/src/vs/workbench/contrib/extensions/browser/workspaceRecommendations.ts @@ -55,15 +55,13 @@ export class WorkspaceRecommendations extends ExtensionRecommendations { this._register(this.fileService.watch(this.uriIdentityService.extUri.joinPath(folder.uri, WORKSPACE_EXTENSIONS_FOLDER))); } - if (this.workbenchExtensionManagementService.isWorkspaceExtensionsSupported()) { - this._register(this.fileService.onDidFilesChange(e => { - if (this.contextService.getWorkspace().folders.some(folder => - e.affects(this.uriIdentityService.extUri.joinPath(folder.uri, WORKSPACE_EXTENSIONS_FOLDER), FileChangeType.ADDED, FileChangeType.DELETED)) - ) { - this.onDidChangeWorkspaceExtensionsScheduler.schedule(); - } - })); - } + this._register(this.fileService.onDidFilesChange(e => { + if (this.contextService.getWorkspace().folders.some(folder => + e.affects(this.uriIdentityService.extUri.joinPath(folder.uri, WORKSPACE_EXTENSIONS_FOLDER), FileChangeType.ADDED, FileChangeType.DELETED)) + ) { + this.onDidChangeWorkspaceExtensionsScheduler.schedule(); + } + })); } private async onDidChangeWorkspaceExtensionsFolders(): Promise { @@ -75,9 +73,6 @@ export class WorkspaceRecommendations extends ExtensionRecommendations { } private async fetchWorkspaceExtensions(): Promise { - if (!this.workbenchExtensionManagementService.isWorkspaceExtensionsSupported()) { - return []; - } const workspaceExtensions: URI[] = []; for (const workspaceFolder of this.contextService.getWorkspace().folders) { const extensionsLocaiton = this.uriIdentityService.extUri.joinPath(workspaceFolder.uri, WORKSPACE_EXTENSIONS_FOLDER); diff --git a/src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionRecommendationsService.test.ts b/src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionRecommendationsService.test.ts index 0e382e8c94199..4e62c45838cf4 100644 --- a/src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionRecommendationsService.test.ts +++ b/src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionRecommendationsService.test.ts @@ -232,7 +232,6 @@ suite('ExtensionRecommendationsService Test', () => { async canInstall() { return true; }, async getExtensionsControlManifest() { return { malicious: [], deprecated: {}, search: [] }; }, async getTargetPlatform() { return getTargetPlatform(platform, arch); }, - isWorkspaceExtensionsSupported() { return false; }, }); instantiationService.stub(IExtensionService, { onDidChangeExtensions: Event.None, diff --git a/src/vs/workbench/services/extensionManagement/common/extensionManagement.ts b/src/vs/workbench/services/extensionManagement/common/extensionManagement.ts index 59bea5e74fc4f..d17f98f886aff 100644 --- a/src/vs/workbench/services/extensionManagement/common/extensionManagement.ts +++ b/src/vs/workbench/services/extensionManagement/common/extensionManagement.ts @@ -66,7 +66,6 @@ export interface IWorkbenchExtensionManagementService extends IProfileAwareExten onDidChangeProfile: Event; onDidEnableExtensions: Event; - isWorkspaceExtensionsSupported(): boolean; getExtensions(locations: URI[]): Promise; getInstalledWorkspaceExtensions(includeInvalid: boolean): Promise; diff --git a/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts b/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts index 9a82bc6da4f0b..ecefd88ee7d4e 100644 --- a/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts +++ b/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts @@ -8,7 +8,7 @@ import { ILocalExtension, IGalleryExtension, IExtensionIdentifier, IExtensionsControlManifest, IExtensionGalleryService, InstallOptions, UninstallOptions, InstallExtensionResult, ExtensionManagementError, ExtensionManagementErrorCode, Metadata, InstallOperation, EXTENSION_INSTALL_SYNC_CONTEXT, InstallExtensionInfo, IProductVersion } from 'vs/platform/extensionManagement/common/extensionManagement'; -import { DidChangeProfileForServerEvent, DidUninstallExtensionOnServerEvent, extensionsConfigurationNodeBase, IExtensionManagementServer, IExtensionManagementServerService, InstallExtensionOnServerEvent, IResourceExtension, IWorkbenchExtensionManagementService, UninstallExtensionOnServerEvent } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; +import { DidChangeProfileForServerEvent, DidUninstallExtensionOnServerEvent, IExtensionManagementServer, IExtensionManagementServerService, InstallExtensionOnServerEvent, IResourceExtension, IWorkbenchExtensionManagementService, UninstallExtensionOnServerEvent } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { ExtensionType, isLanguagePackExtension, IExtensionManifest, getWorkspaceSupportTypeMessage, TargetPlatform } from 'vs/platform/extensions/common/extensions'; import { URI } from 'vs/base/common/uri'; import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; @@ -38,8 +38,6 @@ import { IExtensionsScannerService, IScannedExtension } from 'vs/platform/extens import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { Registry } from 'vs/platform/registry/common/platform'; -import { ConfigurationScope, Extensions, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry'; export class ExtensionManagementService extends Disposable implements IWorkbenchExtensionManagementService { @@ -64,7 +62,7 @@ export class ExtensionManagementService extends Disposable implements IWorkbench protected readonly servers: IExtensionManagementServer[] = []; - private readonly workspaceExtensionManagementService?: WorkspaceExtensionsManagementService; + private readonly workspaceExtensionManagementService: WorkspaceExtensionsManagementService; constructor( @IExtensionManagementServerService protected readonly extensionManagementServerService: IExtensionManagementServerService, @@ -85,27 +83,8 @@ export class ExtensionManagementService extends Disposable implements IWorkbench ) { super(); - if (productService.quality !== 'stable') { - Registry.as(Extensions.Configuration) - .registerConfiguration({ - ...extensionsConfigurationNodeBase, - properties: { - 'extensions.experimental.supportWorkspaceExtensions': { - type: 'boolean', - description: localize('extensions.experimental.supportWorkspaceExtensions', "Enables support for workspace specific local extensions."), - default: false, - scope: ConfigurationScope.APPLICATION - } - } - }); - } - - if (this.productService.quality !== 'stable' && this.configurationService.getValue('extensions.experimental.supportWorkspaceExtensions') === true) { - this.workspaceExtensionManagementService = this._register(this.instantiationService.createInstance(WorkspaceExtensionsManagementService)); - this.onDidEnableExtensions = this.workspaceExtensionManagementService.onDidChangeInvalidExtensions; - } else { - this.onDidEnableExtensions = Event.None; - } + this.workspaceExtensionManagementService = this._register(this.instantiationService.createInstance(WorkspaceExtensionsManagementService)); + this.onDidEnableExtensions = this.workspaceExtensionManagementService.onDidChangeInvalidExtensions; if (this.extensionManagementServerService.localExtensionManagementServer) { this.servers.push(this.extensionManagementServerService.localExtensionManagementServer); @@ -149,10 +128,6 @@ export class ExtensionManagementService extends Disposable implements IWorkbench } } - isWorkspaceExtensionsSupported(): boolean { - return !!this.workspaceExtensionManagementService; - } - async getInstalled(type?: ExtensionType, profileLocation?: URI, productVersion?: IProductVersion): Promise { const result: ILocalExtension[] = []; await Promise.all(this.servers.map(async server => { diff --git a/src/vs/workbench/test/browser/workbenchTestServices.ts b/src/vs/workbench/test/browser/workbenchTestServices.ts index 3538b8bef6f3e..dcee3d47d7d72 100644 --- a/src/vs/workbench/test/browser/workbenchTestServices.ts +++ b/src/vs/workbench/test/browser/workbenchTestServices.ts @@ -2189,7 +2189,6 @@ export class TestWorkbenchExtensionManagementService implements IWorkbenchExtens getInstalledWorkspaceExtensions(): Promise { throw new Error('Method not implemented.'); } installResourceExtension(): Promise { throw new Error('Method not implemented.'); } getExtensions(): Promise { throw new Error('Method not implemented.'); } - isWorkspaceExtensionsSupported(): boolean { throw new Error('Method not implemented.'); } } export class TestUserDataProfileService implements IUserDataProfileService { From 74f16dcd3d8ab42198c3cd8965fc2bf120043558 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 16 Apr 2024 14:19:34 +0200 Subject: [PATCH 2/2] fix --- .../common/extensionManagementService.ts | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts b/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts index ecefd88ee7d4e..8e69418b0cc25 100644 --- a/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts +++ b/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts @@ -405,13 +405,10 @@ export class ExtensionManagementService extends Disposable implements IWorkbench } async getExtensions(locations: URI[]): Promise { - if (!this.workspaceExtensionManagementService) { - return []; - } const scannedExtensions = await this.extensionsScannerService.scanMultipleExtensions(locations, ExtensionType.User, { includeInvalid: true }); const result: IResourceExtension[] = []; await Promise.all(scannedExtensions.map(async scannedExtension => { - const workspaceExtension = await this.workspaceExtensionManagementService?.toLocalWorkspaceExtension(scannedExtension); + const workspaceExtension = await this.workspaceExtensionManagementService.toLocalWorkspaceExtension(scannedExtension); if (workspaceExtension) { result.push({ identifier: workspaceExtension.identifier, @@ -426,7 +423,7 @@ export class ExtensionManagementService extends Disposable implements IWorkbench } async getInstalledWorkspaceExtensions(includeInvalid: boolean): Promise { - return this.workspaceExtensionManagementService?.getInstalled(includeInvalid) ?? []; + return this.workspaceExtensionManagementService.getInstalled(includeInvalid); } async installResourceExtension(extension: IResourceExtension, installOptions: InstallOptions): Promise { @@ -434,10 +431,6 @@ export class ExtensionManagementService extends Disposable implements IWorkbench return this.installFromLocation(extension.location); } - if (!this.workspaceExtensionManagementService) { - throw new Error('Workspace Extensions are not supported'); - } - this.logService.info(`Installing the extension ${extension.identifier.id} from ${extension.location.toString()} in workspace`); const server = this.getWorkspaceExtensionsServer(); this._onInstallExtension.fire({ @@ -485,10 +478,6 @@ export class ExtensionManagementService extends Disposable implements IWorkbench throw new Error('The extension is not a workspace extension'); } - if (!this.workspaceExtensionManagementService) { - throw new Error('Workspace Extensions are not supported'); - } - this.logService.info(`Uninstalling the workspace extension ${extension.identifier.id} from ${extension.location.toString()}`); const server = this.getWorkspaceExtensionsServer(); this._onUninstallExtension.fire({