Path: blob/main/src/vs/workbench/api/browser/mainThreadCLICommands.ts
5225 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { Schemas } from '../../../base/common/network.js';6import { isWeb } from '../../../base/common/platform.js';7import { isString } from '../../../base/common/types.js';8import { URI, UriComponents } from '../../../base/common/uri.js';9import { localize } from '../../../nls.js';10import { CommandsRegistry, ICommandService } from '../../../platform/commands/common/commands.js';11import { IExtensionGalleryService, IExtensionManagementService } from '../../../platform/extensionManagement/common/extensionManagement.js';12import { ExtensionManagementCLI } from '../../../platform/extensionManagement/common/extensionManagementCLI.js';13import { getExtensionId } from '../../../platform/extensionManagement/common/extensionManagementUtil.js';14import { IExtensionManifest } from '../../../platform/extensions/common/extensions.js';15import { IInstantiationService, ServicesAccessor } from '../../../platform/instantiation/common/instantiation.js';16import { ServiceCollection } from '../../../platform/instantiation/common/serviceCollection.js';17import { ILabelService } from '../../../platform/label/common/label.js';18import { AbstractMessageLogger, ILogger, LogLevel } from '../../../platform/log/common/log.js';19import { IOpenerService } from '../../../platform/opener/common/opener.js';20import { IProductService } from '../../../platform/product/common/productService.js';21import { IOpenWindowOptions, IWindowOpenable } from '../../../platform/window/common/window.js';22import { IWorkbenchEnvironmentService } from '../../services/environment/common/environmentService.js';23import { IExtensionManagementServerService } from '../../services/extensionManagement/common/extensionManagement.js';24import { IExtensionManifestPropertiesService } from '../../services/extensions/common/extensionManifestPropertiesService.js';252627// this class contains the commands that the CLI server is reying on2829CommandsRegistry.registerCommand('_remoteCLI.openExternal', function (accessor: ServicesAccessor, uri: UriComponents | string): Promise<boolean> {30const openerService = accessor.get(IOpenerService);31return openerService.open(isString(uri) ? uri : URI.revive(uri), { openExternal: true, allowTunneling: true });32});3334CommandsRegistry.registerCommand('_remoteCLI.windowOpen', function (accessor: ServicesAccessor, toOpen: IWindowOpenable[], options: IOpenWindowOptions) {35const commandService = accessor.get(ICommandService);36if (!toOpen.length) {37return commandService.executeCommand('_files.newWindow', options);38}39return commandService.executeCommand('_files.windowOpen', toOpen, options);40});4142CommandsRegistry.registerCommand('_remoteCLI.getSystemStatus', function (accessor: ServicesAccessor): Promise<string | undefined> {43const commandService = accessor.get(ICommandService);44return commandService.executeCommand<string>('_issues.getSystemStatus');45});4647interface ManageExtensionsArgs {48list?: { showVersions?: boolean; category?: string };49install?: (string | URI)[];50uninstall?: string[];51force?: boolean;52}5354CommandsRegistry.registerCommand('_remoteCLI.manageExtensions', async function (accessor: ServicesAccessor, args: ManageExtensionsArgs): Promise<string | undefined> {55const instantiationService = accessor.get(IInstantiationService);56const extensionManagementServerService = accessor.get(IExtensionManagementServerService);57const remoteExtensionManagementService = extensionManagementServerService.remoteExtensionManagementServer?.extensionManagementService;58if (!remoteExtensionManagementService) {59return;60}6162const lines: string[] = [];63const logger = new class extends AbstractMessageLogger {64protected override log(level: LogLevel, message: string): void {65lines.push(message);66}67}();68const childInstantiationService = instantiationService.createChild(new ServiceCollection([IExtensionManagementService, remoteExtensionManagementService]));69try {70const cliService = childInstantiationService.createInstance(RemoteExtensionManagementCLI, logger);7172if (args.list) {73await cliService.listExtensions(!!args.list.showVersions, args.list.category, undefined);74} else {75const revive = (inputs: (string | UriComponents)[]) => inputs.map(input => isString(input) ? input : URI.revive(input));76if (Array.isArray(args.install) && args.install.length) {77try {78await cliService.installExtensions(revive(args.install), [], { isMachineScoped: true }, !!args.force);79} catch (e) {80lines.push(e.message);81}82}83if (Array.isArray(args.uninstall) && args.uninstall.length) {84try {85await cliService.uninstallExtensions(revive(args.uninstall), !!args.force, undefined);86} catch (e) {87lines.push(e.message);88}89}90}91return lines.join('\n');92} finally {93childInstantiationService.dispose();94}9596});9798class RemoteExtensionManagementCLI extends ExtensionManagementCLI {99100private _location: string | undefined;101102constructor(103logger: ILogger,104@IExtensionManagementService extensionManagementService: IExtensionManagementService,105@IExtensionGalleryService extensionGalleryService: IExtensionGalleryService,106@ILabelService labelService: ILabelService,107@IWorkbenchEnvironmentService envService: IWorkbenchEnvironmentService,108@IExtensionManifestPropertiesService private readonly _extensionManifestPropertiesService: IExtensionManifestPropertiesService,109@IProductService productService: IProductService,110) {111super([], logger, extensionManagementService, extensionGalleryService, productService);112113const remoteAuthority = envService.remoteAuthority;114this._location = remoteAuthority ? labelService.getHostLabel(Schemas.vscodeRemote, remoteAuthority) : undefined;115}116117protected override get location(): string | undefined {118return this._location;119}120121protected override validateExtensionKind(manifest: IExtensionManifest): boolean {122if (!this._extensionManifestPropertiesService.canExecuteOnWorkspace(manifest)123// Web extensions installed on remote can be run in web worker extension host124&& !(isWeb && this._extensionManifestPropertiesService.canExecuteOnWeb(manifest))) {125this.logger.info(localize('cannot be installed', "Cannot install the '{0}' extension because it is declared to not run in this setup.", getExtensionId(manifest.publisher, manifest.name)));126return false;127}128return true;129}130}131132133