提交 74ae993e 编写于 作者: S Sandeep Somavarapu

Add support for multiple extension management servers

上级 36f66042
...@@ -312,6 +312,19 @@ export interface IExtensionManagementService { ...@@ -312,6 +312,19 @@ export interface IExtensionManagementService {
updateMetadata(local: ILocalExtension, metadata: IGalleryMetadata): TPromise<ILocalExtension>; updateMetadata(local: ILocalExtension, metadata: IGalleryMetadata): TPromise<ILocalExtension>;
} }
export const IExtensionManagementServerService = createDecorator<IExtensionManagementServerService>('extensionManagementServerService');
export interface IExtensionManagementServer {
extensionManagementService: IExtensionManagementService;
location: URI;
}
export interface IExtensionManagementServerService {
_serviceBrand: any;
readonly extensionManagementServers: IExtensionManagementServer[];
getExtensionManagementServer(location: URI): IExtensionManagementServer;
}
export enum EnablementState { export enum EnablementState {
Disabled, Disabled,
WorkspaceDisabled, WorkspaceDisabled,
......
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { TPromise } from 'vs/base/common/winjs.base';
import { Event, EventMultiplexer } from 'vs/base/common/event';
import {
IExtensionManagementService, ILocalExtension, IGalleryExtension, LocalExtensionType, InstallExtensionEvent, DidInstallExtensionEvent, IExtensionIdentifier, DidUninstallExtensionEvent, IReportedExtension, IGalleryMetadata,
IExtensionManagementServerService, IExtensionManagementServer
} from 'vs/platform/extensionManagement/common/extensionManagement';
import { flatten } from 'vs/base/common/arrays';
export class MulitExtensionManagementService implements IExtensionManagementService {
_serviceBrand: any;
onInstallExtension: Event<InstallExtensionEvent>;
onDidInstallExtension: Event<DidInstallExtensionEvent>;
onUninstallExtension: Event<IExtensionIdentifier>;
onDidUninstallExtension: Event<DidUninstallExtensionEvent>;
private readonly servers: IExtensionManagementServer[];
constructor(
servers: IExtensionManagementServer[],
@IExtensionManagementServerService private extensionManagementServerService: IExtensionManagementServerService
) {
this.servers = servers ? servers : this.extensionManagementServerService.extensionManagementServers;
this.onInstallExtension = this.servers.reduce((emitter: EventMultiplexer<InstallExtensionEvent>, server) => { emitter.add(server.extensionManagementService.onInstallExtension); return emitter; }, new EventMultiplexer<InstallExtensionEvent>()).event;
this.onDidInstallExtension = this.servers.reduce((emitter: EventMultiplexer<DidInstallExtensionEvent>, server) => { emitter.add(server.extensionManagementService.onDidInstallExtension); return emitter; }, new EventMultiplexer<DidInstallExtensionEvent>()).event;
this.onUninstallExtension = this.servers.reduce((emitter: EventMultiplexer<IExtensionIdentifier>, server) => { emitter.add(server.extensionManagementService.onUninstallExtension); return emitter; }, new EventMultiplexer<IExtensionIdentifier>()).event;
this.onDidUninstallExtension = this.servers.reduce((emitter: EventMultiplexer<DidUninstallExtensionEvent>, server) => { emitter.add(server.extensionManagementService.onDidUninstallExtension); return emitter; }, new EventMultiplexer<DidUninstallExtensionEvent>()).event;
}
getInstalled(type?: LocalExtensionType): TPromise<ILocalExtension[]> {
return TPromise.join(this.servers.map(({ extensionManagementService }) => extensionManagementService.getInstalled(type)))
.then(result => flatten(result));
}
uninstall(extension: ILocalExtension, force?: boolean): TPromise<void> {
return this.getServer(extension).extensionManagementService.uninstall(extension, force);
}
reinstallFromGallery(extension: ILocalExtension): TPromise<ILocalExtension> {
return this.getServer(extension).extensionManagementService.reinstallFromGallery(extension);
}
updateMetadata(extension: ILocalExtension, metadata: IGalleryMetadata): TPromise<ILocalExtension> {
return this.getServer(extension).extensionManagementService.updateMetadata(extension, metadata);
}
install(zipPath: string): TPromise<ILocalExtension> {
return this.servers[0].extensionManagementService.install(zipPath);
}
installFromGallery(extension: IGalleryExtension): TPromise<ILocalExtension> {
return this.servers[0].extensionManagementService.installFromGallery(extension);
}
getExtensionsReport(): TPromise<IReportedExtension[]> {
return this.servers[0].extensionManagementService.getExtensionsReport();
}
private getServer(extension: ILocalExtension): IExtensionManagementServer {
return this.extensionManagementServerService.getExtensionManagementServer(extension.location);
}
}
\ No newline at end of file
...@@ -64,7 +64,7 @@ import { getDelayedChannel, IPCClient } from 'vs/base/parts/ipc/common/ipc'; ...@@ -64,7 +64,7 @@ import { getDelayedChannel, IPCClient } from 'vs/base/parts/ipc/common/ipc';
import { connect as connectNet } from 'vs/base/parts/ipc/node/ipc.net'; import { connect as connectNet } from 'vs/base/parts/ipc/node/ipc.net';
import { DefaultURITransformer } from 'vs/base/common/uriIpc'; import { DefaultURITransformer } from 'vs/base/common/uriIpc';
import { IExtensionManagementChannel, ExtensionManagementChannelClient } from 'vs/platform/extensionManagement/common/extensionManagementIpc'; import { IExtensionManagementChannel, ExtensionManagementChannelClient } from 'vs/platform/extensionManagement/common/extensionManagementIpc';
import { IExtensionManagementService, IExtensionEnablementService } from 'vs/platform/extensionManagement/common/extensionManagement'; import { IExtensionManagementService, IExtensionEnablementService, IExtensionManagementServerService } from 'vs/platform/extensionManagement/common/extensionManagement';
import { ExtensionEnablementService } from 'vs/platform/extensionManagement/common/extensionEnablementService'; import { ExtensionEnablementService } from 'vs/platform/extensionManagement/common/extensionEnablementService';
import { ITimerService } from 'vs/workbench/services/timer/common/timerService'; import { ITimerService } from 'vs/workbench/services/timer/common/timerService';
import { BareFontInfo } from 'vs/editor/common/config/fontInfo'; import { BareFontInfo } from 'vs/editor/common/config/fontInfo';
...@@ -98,6 +98,8 @@ import { EventType, addDisposableListener, addClass, getClientArea } from 'vs/ba ...@@ -98,6 +98,8 @@ import { EventType, addDisposableListener, addClass, getClientArea } from 'vs/ba
import { IOpenerService } from 'vs/platform/opener/common/opener'; import { IOpenerService } from 'vs/platform/opener/common/opener';
import { OpenerService } from 'vs/editor/browser/services/openerService'; import { OpenerService } from 'vs/editor/browser/services/openerService';
import { SearchHistoryService } from 'vs/workbench/services/search/node/searchHistoryService'; import { SearchHistoryService } from 'vs/workbench/services/search/node/searchHistoryService';
import { MulitExtensionManagementService } from 'vs/platform/extensionManagement/common/multiExtensionManagement';
import { ExtensionManagementServerService } from 'vs/workbench/services/extensions/node/extensionManagementServerService';
/** /**
* Services that we require for the Shell * Services that we require for the Shell
...@@ -408,7 +410,9 @@ export class WorkbenchShell { ...@@ -408,7 +410,9 @@ export class WorkbenchShell {
this.lifecycleService = lifecycleService; this.lifecycleService = lifecycleService;
const extensionManagementChannel = getDelayedChannel<IExtensionManagementChannel>(sharedProcess.then(c => c.getChannel('extensions'))); const extensionManagementChannel = getDelayedChannel<IExtensionManagementChannel>(sharedProcess.then(c => c.getChannel('extensions')));
serviceCollection.set(IExtensionManagementService, new SyncDescriptor(ExtensionManagementChannelClient, extensionManagementChannel, DefaultURITransformer)); const extensionManagementChannelClient = new ExtensionManagementChannelClient(extensionManagementChannel, DefaultURITransformer);
serviceCollection.set(IExtensionManagementServerService, new SyncDescriptor(ExtensionManagementServerService, extensionManagementChannelClient));
serviceCollection.set(IExtensionManagementService, new SyncDescriptor(MulitExtensionManagementService));
const extensionEnablementService = instantiationService.createInstance(ExtensionEnablementService); const extensionEnablementService = instantiationService.createInstance(ExtensionEnablementService);
serviceCollection.set(IExtensionEnablementService, extensionEnablementService); serviceCollection.set(IExtensionEnablementService, extensionEnablementService);
......
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="575" height="6px">
<style>
circle {
animation: ball 2.5s cubic-bezier(0.000, 1.000, 1.000, 0.000) infinite;
fill: #bbb;
}
#balls {
animation: balls 2.5s linear infinite;
}
#circle2 { animation-delay: 0.1s; }
#circle3 { animation-delay: 0.2s; }
#circle4 { animation-delay: 0.3s; }
#circle5 { animation-delay: 0.4s; }
@keyframes ball {
from { transform: none; }
20% { transform: none; }
80% { transform: translateX(864px); }
to { transform: translateX(864px); }
}
@keyframes balls {
from { transform: translateX(-40px); }
to { transform: translateX(30px); }
}
</style>
<g id="balls">
<circle class="circle" id="circle1" cx="-115" cy="3" r="3"/>
<circle class="circle" id="circle2" cx="-130" cy="3" r="3" />
<circle class="circle" id="circle3" cx="-145" cy="3" r="3" />
<circle class="circle" id="circle4" cx="-160" cy="3" r="3" />
<circle class="circle" id="circle5" cx="-175" cy="3" r="3" />
</g>
</svg>
\ No newline at end of file
...@@ -5,20 +5,26 @@ ...@@ -5,20 +5,26 @@
export class Query { export class Query {
constructor(public value: string, public sortBy: string) { constructor(public value: string, public sortBy: string, public groupBy: string) {
this.value = value.trim(); this.value = value.trim();
} }
static parse(value: string): Query { static parse(value: string): Query {
let sortBy = ''; let sortBy = '';
value = value.replace(/@sort:(\w+)(-\w*)?/g, (match, by: string, order: string) => { value = value.replace(/@sort:(\w+)(-\w*)?/g, (match, by: string, order: string) => {
sortBy = by; sortBy = by;
return ''; return '';
}); });
return new Query(value, sortBy); let groupBy = '';
value = value.replace(/@group:(\w+)(-\w*)?/g, (match, by: string, order: string) => {
groupBy = by;
return '';
});
return new Query(value, sortBy, groupBy);
} }
toString(): string { toString(): string {
...@@ -27,6 +33,9 @@ export class Query { ...@@ -27,6 +33,9 @@ export class Query {
if (this.sortBy) { if (this.sortBy) {
result = `${result}${result ? ' ' : ''}@sort:${this.sortBy}`; result = `${result}${result ? ' ' : ''}@sort:${this.sortBy}`;
} }
if (this.groupBy) {
result = `${result}${result ? ' ' : ''}@group:${this.groupBy}`;
}
return result; return result;
} }
......
...@@ -10,13 +10,18 @@ import { TPromise } from 'vs/base/common/winjs.base'; ...@@ -10,13 +10,18 @@ import { TPromise } from 'vs/base/common/winjs.base';
import { EditorInput } from 'vs/workbench/common/editor'; import { EditorInput } from 'vs/workbench/common/editor';
import { IExtension } from 'vs/workbench/parts/extensions/common/extensions'; import { IExtension } from 'vs/workbench/parts/extensions/common/extensions';
import URI from 'vs/base/common/uri'; import URI from 'vs/base/common/uri';
import { IExtensionManagementServerService, IExtensionManagementServer } from 'vs/platform/extensionManagement/common/extensionManagement';
export class ExtensionsInput extends EditorInput { export class ExtensionsInput extends EditorInput {
static readonly ID = 'workbench.extensions.input2'; static readonly ID = 'workbench.extensions.input2';
get extension(): IExtension { return this._extension; } get extension(): IExtension { return this._extension; }
get servers(): IExtensionManagementServer[] { return this.extensionManagementServerService.extensionManagementServers; }
constructor(private _extension: IExtension) { constructor(
private _extension: IExtension,
@IExtensionManagementServerService private extensionManagementServerService: IExtensionManagementServerService
) {
super(); super();
} }
......
...@@ -31,7 +31,7 @@ import { Renderer, DataSource, Controller } from 'vs/workbench/parts/extensions/ ...@@ -31,7 +31,7 @@ import { Renderer, DataSource, Controller } from 'vs/workbench/parts/extensions/
import { RatingsWidget, InstallCountWidget } from 'vs/workbench/parts/extensions/browser/extensionsWidgets'; import { RatingsWidget, InstallCountWidget } from 'vs/workbench/parts/extensions/browser/extensionsWidgets';
import { EditorOptions } from 'vs/workbench/common/editor'; import { EditorOptions } from 'vs/workbench/common/editor';
import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar';
import { CombinedInstallAction, UpdateAction, EnableAction, DisableAction, ReloadAction, MaliciousStatusLabelAction, DisabledStatusLabelAction } from 'vs/workbench/parts/extensions/browser/extensionsActions'; import { CombinedInstallAction, UpdateAction, EnableAction, DisableAction, ReloadAction, MaliciousStatusLabelAction, DisabledStatusLabelAction, MultiServerInstallAction, MultiServerUpdateAction } from 'vs/workbench/parts/extensions/electron-browser/extensionsActions';
import { WebviewElement } from 'vs/workbench/parts/webview/electron-browser/webviewElement'; import { WebviewElement } from 'vs/workbench/parts/webview/electron-browser/webviewElement';
import { KeybindingIO } from 'vs/workbench/services/keybinding/common/keybindingIO'; import { KeybindingIO } from 'vs/workbench/services/keybinding/common/keybindingIO';
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
...@@ -247,6 +247,12 @@ export class ExtensionEditor extends BaseEditor { ...@@ -247,6 +247,12 @@ export class ExtensionEditor extends BaseEditor {
if (action.id === DisableAction.ID) { if (action.id === DisableAction.ID) {
return (<DisableAction>action).actionItem; return (<DisableAction>action).actionItem;
} }
if (action.id === MultiServerInstallAction.ID) {
return (<MultiServerInstallAction>action).actionItem;
}
if (action.id === MultiServerUpdateAction.ID) {
return (<MultiServerUpdateAction>action).actionItem;
}
return null; return null;
} }
}); });
...@@ -268,6 +274,7 @@ export class ExtensionEditor extends BaseEditor { ...@@ -268,6 +274,7 @@ export class ExtensionEditor extends BaseEditor {
setInput(input: ExtensionsInput, options: EditorOptions, token: CancellationToken): Thenable<void> { setInput(input: ExtensionsInput, options: EditorOptions, token: CancellationToken): Thenable<void> {
this.editorLoadComplete = false; this.editorLoadComplete = false;
const extension = input.extension; const extension = input.extension;
const servers = input.servers;
this.transientDisposables = dispose(this.transientDisposables); this.transientDisposables = dispose(this.transientDisposables);
...@@ -351,8 +358,8 @@ export class ExtensionEditor extends BaseEditor { ...@@ -351,8 +358,8 @@ export class ExtensionEditor extends BaseEditor {
const maliciousStatusAction = this.instantiationService.createInstance(MaliciousStatusLabelAction, true); const maliciousStatusAction = this.instantiationService.createInstance(MaliciousStatusLabelAction, true);
const disabledStatusAction = this.instantiationService.createInstance(DisabledStatusLabelAction); const disabledStatusAction = this.instantiationService.createInstance(DisabledStatusLabelAction);
const installAction = this.instantiationService.createInstance(CombinedInstallAction); const installAction = servers.length === 1 ? this.instantiationService.createInstance(CombinedInstallAction, servers[0]) : this.instantiationService.createInstance(MultiServerInstallAction);
const updateAction = this.instantiationService.createInstance(UpdateAction); const updateAction = servers.length === 1 ? this.instantiationService.createInstance(UpdateAction, servers[0]) : this.instantiationService.createInstance(MultiServerUpdateAction);
const enableAction = this.instantiationService.createInstance(EnableAction); const enableAction = this.instantiationService.createInstance(EnableAction);
const disableAction = this.instantiationService.createInstance(DisableAction); const disableAction = this.instantiationService.createInstance(DisableAction);
const reloadAction = this.instantiationService.createInstance(ReloadAction); const reloadAction = this.instantiationService.createInstance(ReloadAction);
......
...@@ -16,7 +16,7 @@ import { ITextModel } from 'vs/editor/common/model'; ...@@ -16,7 +16,7 @@ import { ITextModel } from 'vs/editor/common/model';
import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage';
import product from 'vs/platform/node/product'; import product from 'vs/platform/node/product';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { ShowRecommendedExtensionsAction, InstallWorkspaceRecommendedExtensionsAction, InstallRecommendedExtensionAction } from 'vs/workbench/parts/extensions/browser/extensionsActions'; import { ShowRecommendedExtensionsAction, InstallWorkspaceRecommendedExtensionsAction, InstallRecommendedExtensionAction } from 'vs/workbench/parts/extensions/electron-browser/extensionsActions';
import Severity from 'vs/base/common/severity'; import Severity from 'vs/base/common/severity';
import { IWorkspaceContextService, IWorkspaceFolder, IWorkspace, IWorkspaceFoldersChangeEvent, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { IWorkspaceContextService, IWorkspaceFolder, IWorkspace, IWorkspaceFoldersChangeEvent, WorkbenchState } from 'vs/platform/workspace/common/workspace';
import { Schemas } from 'vs/base/common/network'; import { Schemas } from 'vs/base/common/network';
......
...@@ -23,7 +23,7 @@ import { ...@@ -23,7 +23,7 @@ import {
OpenExtensionsViewletAction, InstallExtensionsAction, ShowOutdatedExtensionsAction, ShowRecommendedExtensionsAction, ShowRecommendedKeymapExtensionsAction, ShowPopularExtensionsAction, OpenExtensionsViewletAction, InstallExtensionsAction, ShowOutdatedExtensionsAction, ShowRecommendedExtensionsAction, ShowRecommendedKeymapExtensionsAction, ShowPopularExtensionsAction,
ShowEnabledExtensionsAction, ShowInstalledExtensionsAction, ShowDisabledExtensionsAction, ShowBuiltInExtensionsAction, UpdateAllAction, ShowEnabledExtensionsAction, ShowInstalledExtensionsAction, ShowDisabledExtensionsAction, ShowBuiltInExtensionsAction, UpdateAllAction,
EnableAllAction, EnableAllWorkpsaceAction, DisableAllAction, DisableAllWorkpsaceAction, CheckForUpdatesAction, ShowLanguageExtensionsAction, ShowAzureExtensionsAction, EnableAutoUpdateAction, DisableAutoUpdateAction, ConfigureRecommendedExtensionsCommandsContributor, OpenExtensionsFolderAction, InstallVSIXAction, ReinstallAction EnableAllAction, EnableAllWorkpsaceAction, DisableAllAction, DisableAllWorkpsaceAction, CheckForUpdatesAction, ShowLanguageExtensionsAction, ShowAzureExtensionsAction, EnableAutoUpdateAction, DisableAutoUpdateAction, ConfigureRecommendedExtensionsCommandsContributor, OpenExtensionsFolderAction, InstallVSIXAction, ReinstallAction
} from 'vs/workbench/parts/extensions/browser/extensionsActions'; } from 'vs/workbench/parts/extensions/electron-browser/extensionsActions';
import { ExtensionsInput } from 'vs/workbench/parts/extensions/common/extensionsInput'; import { ExtensionsInput } from 'vs/workbench/parts/extensions/common/extensionsInput';
import { ViewletRegistry, Extensions as ViewletExtensions, ViewletDescriptor } from 'vs/workbench/browser/viewlet'; import { ViewletRegistry, Extensions as ViewletExtensions, ViewletDescriptor } from 'vs/workbench/browser/viewlet';
import { ExtensionEditor } from 'vs/workbench/parts/extensions/electron-browser/extensionEditor'; import { ExtensionEditor } from 'vs/workbench/parts/extensions/electron-browser/extensionEditor';
......
...@@ -17,7 +17,7 @@ import { IContextMenuService } from 'vs/platform/contextview/browser/contextView ...@@ -17,7 +17,7 @@ import { IContextMenuService } from 'vs/platform/contextview/browser/contextView
import { IDisposable, dispose, Disposable } from 'vs/base/common/lifecycle'; import { IDisposable, dispose, Disposable } from 'vs/base/common/lifecycle';
import { IExtension, ExtensionState, IExtensionsWorkbenchService, VIEWLET_ID, IExtensionsViewlet, AutoUpdateConfigurationKey } from 'vs/workbench/parts/extensions/common/extensions'; import { IExtension, ExtensionState, IExtensionsWorkbenchService, VIEWLET_ID, IExtensionsViewlet, AutoUpdateConfigurationKey } from 'vs/workbench/parts/extensions/common/extensions';
import { ExtensionsConfigurationInitialContent } from 'vs/workbench/parts/extensions/common/extensionsFileTemplate'; import { ExtensionsConfigurationInitialContent } from 'vs/workbench/parts/extensions/common/extensionsFileTemplate';
import { LocalExtensionType, IExtensionEnablementService, IExtensionTipsService, EnablementState, ExtensionsLabel } from 'vs/platform/extensionManagement/common/extensionManagement'; import { LocalExtensionType, IExtensionEnablementService, IExtensionTipsService, EnablementState, ExtensionsLabel, IExtensionManagementServer, IExtensionManagementServerService, IExtensionManagementService } from 'vs/platform/extensionManagement/common/extensionManagement';
import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil';
import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
import { ToggleViewletAction } from 'vs/workbench/browser/viewlet'; import { ToggleViewletAction } from 'vs/workbench/browser/viewlet';
...@@ -48,6 +48,9 @@ import { IEnvironmentService } from 'vs/platform/environment/common/environment' ...@@ -48,6 +48,9 @@ import { IEnvironmentService } from 'vs/platform/environment/common/environment'
import { IQuickOpenService, IPickOpenEntry } from 'vs/platform/quickOpen/common/quickOpen'; import { IQuickOpenService, IPickOpenEntry } from 'vs/platform/quickOpen/common/quickOpen';
import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService';
import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection';
import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors';
import { ExtensionsWorkbenchService } from 'vs/workbench/parts/extensions/node/extensionsWorkbenchService';
const promptDownloadManually = (extension: IExtension, message: string, instantiationService: IInstantiationService, notificationService: INotificationService, openerService: IOpenerService) => { const promptDownloadManually = (extension: IExtension, message: string, instantiationService: IInstantiationService, notificationService: INotificationService, openerService: IOpenerService) => {
notificationService.prompt(Severity.Error, message, [{ notificationService.prompt(Severity.Error, message, [{
...@@ -69,26 +72,31 @@ const promptDownloadManually = (extension: IExtension, message: string, instanti ...@@ -69,26 +72,31 @@ const promptDownloadManually = (extension: IExtension, message: string, instanti
}]); }]);
}; };
export class InstallAction extends Action { export interface IExtensionAction extends IAction {
extension: IExtension;
}
private static readonly InstallLabel = localize('installAction', "Install"); export class InstallAction extends Action {
private static readonly InstallingLabel = localize('installing', "Installing");
private static readonly Class = 'extension-action prominent install'; private static readonly Class = 'extension-action prominent install';
private static readonly InstallingClass = 'extension-action install installing'; private static readonly InstallingClass = 'extension-action install installing';
private disposables: IDisposable[] = []; private disposables: IDisposable[] = [];
private _extension: IExtension; private _extension: IExtension;
get extension(): IExtension { return this._extension; } get extension(): IExtension { return this._extension; }
set extension(extension: IExtension) { this._extension = extension; this.update(); } set extension(extension: IExtension) { this._extension = extension; this.update(); }
constructor( constructor(
private server: IExtensionManagementServer,
@IExtensionsWorkbenchService private extensionsWorkbenchService: IExtensionsWorkbenchService, @IExtensionsWorkbenchService private extensionsWorkbenchService: IExtensionsWorkbenchService,
@IInstantiationService private instantiationService: IInstantiationService, @IInstantiationService private instantiationService: IInstantiationService,
@INotificationService private notificationService: INotificationService, @INotificationService private notificationService: INotificationService,
@IOpenerService private openerService: IOpenerService @IOpenerService private openerService: IOpenerService,
@IExtensionManagementServerService private extensionManagementServerService: IExtensionManagementServerService
) { ) {
super('extensions.install', InstallAction.InstallLabel, InstallAction.Class, false); super(`extensions.install.${server.location.authority}`, '', InstallAction.Class, false);
this.disposables.push(this.extensionsWorkbenchService.onChange(() => this.update())); this.disposables.push(this.extensionsWorkbenchService.onChange(() => this.update()));
this.update(); this.update();
...@@ -98,23 +106,33 @@ export class InstallAction extends Action { ...@@ -98,23 +106,33 @@ export class InstallAction extends Action {
if (!this.extension || this.extension.type === LocalExtensionType.System) { if (!this.extension || this.extension.type === LocalExtensionType.System) {
this.enabled = false; this.enabled = false;
this.class = InstallAction.Class; this.class = InstallAction.Class;
this.label = InstallAction.InstallLabel; this.label = this.getInstallLabel();
return; return;
} }
this.enabled = this.extensionsWorkbenchService.canInstall(this.extension) && this.extension.state === ExtensionState.Uninstalled; this.enabled = this.extensionsWorkbenchService.canInstall(this.extension) && this.extension.state === ExtensionState.Uninstalled;
if (this.extension.state === ExtensionState.Installing) { if (this.extension.state === ExtensionState.Installing) {
this.label = InstallAction.InstallingLabel; this.label = this.getInstallingLabel();
this.class = InstallAction.InstallingClass; this.class = InstallAction.InstallingClass;
this.tooltip = InstallAction.InstallingLabel; this.tooltip = this.getInstallingLabel();
} else { } else {
this.label = InstallAction.InstallLabel; this.label = this.getInstallLabel();
this.class = InstallAction.Class; this.class = InstallAction.Class;
this.tooltip = InstallAction.InstallLabel; this.tooltip = this.getInstallLabel();
} }
} }
private getInstallLabel(): string {
const isSingleServer = this.extensionManagementServerService.extensionManagementServers.length === 1;
return isSingleServer ? localize('install', "Install") : localize('installInServer', "{0}", this.server.location.authority);
}
private getInstallingLabel(): string {
const isSingleServer = this.extensionManagementServerService.extensionManagementServers.length === 1;
return isSingleServer ? localize('installing', "Installing") : localize('installingInServer', "{0}: Installing", this.server.location.authority);
}
run(): TPromise<any> { run(): TPromise<any> {
this.extensionsWorkbenchService.open(this.extension); this.extensionsWorkbenchService.open(this.extension);
...@@ -219,11 +237,12 @@ export class CombinedInstallAction extends Action { ...@@ -219,11 +237,12 @@ export class CombinedInstallAction extends Action {
} }
constructor( constructor(
server: IExtensionManagementServer,
@IInstantiationService instantiationService: IInstantiationService @IInstantiationService instantiationService: IInstantiationService
) { ) {
super('extensions.combinedInstall', '', '', false); super('extensions.combinedInstall', '', '', false);
this.installAction = instantiationService.createInstance(InstallAction); this.installAction = instantiationService.createInstance(InstallAction, server);
this.uninstallAction = instantiationService.createInstance(UninstallAction); this.uninstallAction = instantiationService.createInstance(UninstallAction);
this.disposables.push(this.installAction, this.uninstallAction); this.disposables.push(this.installAction, this.uninstallAction);
...@@ -284,7 +303,6 @@ export class UpdateAction extends Action { ...@@ -284,7 +303,6 @@ export class UpdateAction extends Action {
private static readonly EnabledClass = 'extension-action prominent update'; private static readonly EnabledClass = 'extension-action prominent update';
private static readonly DisabledClass = `${UpdateAction.EnabledClass} disabled`; private static readonly DisabledClass = `${UpdateAction.EnabledClass} disabled`;
private static readonly Label = localize('updateAction', "Update");
private disposables: IDisposable[] = []; private disposables: IDisposable[] = [];
private _extension: IExtension; private _extension: IExtension;
...@@ -292,13 +310,14 @@ export class UpdateAction extends Action { ...@@ -292,13 +310,14 @@ export class UpdateAction extends Action {
set extension(extension: IExtension) { this._extension = extension; this.update(); } set extension(extension: IExtension) { this._extension = extension; this.update(); }
constructor( constructor(
private server: IExtensionManagementServer,
@IExtensionsWorkbenchService private extensionsWorkbenchService: IExtensionsWorkbenchService, @IExtensionsWorkbenchService private extensionsWorkbenchService: IExtensionsWorkbenchService,
@IInstantiationService private instantiationService: IInstantiationService, @IInstantiationService private instantiationService: IInstantiationService,
@INotificationService private notificationService: INotificationService, @INotificationService private notificationService: INotificationService,
@IOpenerService private openerService: IOpenerService @IOpenerService private openerService: IOpenerService,
@IExtensionManagementServerService private extensionManagementServerService: IExtensionManagementServerService
) { ) {
super('extensions.update', UpdateAction.Label, UpdateAction.DisabledClass, false); super(`extensions.update.${server.location.authority}`, '', UpdateAction.DisabledClass, false);
this.disposables.push(this.extensionsWorkbenchService.onChange(() => this.update())); this.disposables.push(this.extensionsWorkbenchService.onChange(() => this.update()));
this.update(); this.update();
} }
...@@ -307,14 +326,14 @@ export class UpdateAction extends Action { ...@@ -307,14 +326,14 @@ export class UpdateAction extends Action {
if (!this.extension) { if (!this.extension) {
this.enabled = false; this.enabled = false;
this.class = UpdateAction.DisabledClass; this.class = UpdateAction.DisabledClass;
this.label = UpdateAction.Label; this.label = this.getUpdateLabel();
return; return;
} }
if (this.extension.type !== LocalExtensionType.User) { if (this.extension.type !== LocalExtensionType.User) {
this.enabled = false; this.enabled = false;
this.class = UpdateAction.DisabledClass; this.class = UpdateAction.DisabledClass;
this.label = UpdateAction.Label; this.label = this.getUpdateLabel();
return; return;
} }
...@@ -323,7 +342,7 @@ export class UpdateAction extends Action { ...@@ -323,7 +342,7 @@ export class UpdateAction extends Action {
this.enabled = canInstall && isInstalled && this.extension.outdated; this.enabled = canInstall && isInstalled && this.extension.outdated;
this.class = this.enabled ? UpdateAction.EnabledClass : UpdateAction.DisabledClass; this.class = this.enabled ? UpdateAction.EnabledClass : UpdateAction.DisabledClass;
this.label = localize('updateTo', "Update to {0}", this.extension.latestVersion); this.label = this.extension.outdated ? this.getUpdateLabel(this.extension.latestVersion) : this.getUpdateLabel();
} }
run(): TPromise<any> { run(): TPromise<any> {
...@@ -342,14 +361,160 @@ export class UpdateAction extends Action { ...@@ -342,14 +361,160 @@ export class UpdateAction extends Action {
}); });
} }
private getUpdateLabel(version?: string): string {
const isSingleServer = this.extensionManagementServerService.extensionManagementServers.length === 1;
if (isSingleServer) {
return version ? localize('updateTo', "Update to {0}", version) : localize('updateAction', "Update");
} else {
return version ? localize('updateToInServer', "Update to {0} ({1})", version, this.server.location.authority) : localize('updateLabelInServer', "Update ({0})", this.server.location.authority);
}
}
dispose(): void { dispose(): void {
super.dispose(); super.dispose();
this.disposables = dispose(this.disposables); this.disposables = dispose(this.disposables);
} }
} }
export interface IExtensionAction extends IAction { export class MultiServerInstallAction extends Action {
extension: IExtension;
static ID: string = 'extensions.multiserver.install';
private static readonly InstallLabel = localize('installAction', "Install");
private static readonly InstallingLabel = localize('installing', "Installing");
private static readonly Class = 'extension-action multiserver prominent install';
private static readonly InstallingClass = 'extension-action multiserver install installing';
private _installActions: IExtensionAction[];
private _actionItem: DropDownMenuActionItem;
get actionItem(): IActionItem { return this._actionItem; }
private disposables: IDisposable[] = [];
private _extension: IExtension;
get extension(): IExtension { return this._extension; }
set extension(extension: IExtension) { this._extension = extension; this._actionItem.extension = extension; this.update(); }
constructor(
@IExtensionManagementServerService extensionManagementServerService: IExtensionManagementServerService,
@IInstantiationService private instantiationService: IInstantiationService,
@IExtensionsWorkbenchService private extensionsWorkbenchService: IExtensionsWorkbenchService
) {
super(MultiServerInstallAction.ID, MultiServerInstallAction.InstallLabel, MultiServerInstallAction.Class, false);
this._installActions = extensionManagementServerService.extensionManagementServers.map(server => this.createInstallActionForServer(server));
this._actionItem = this.instantiationService.createInstance(DropDownMenuActionItem, this, [this._installActions]);
this.disposables.push(this._actionItem);
this.disposables.push(this.extensionsWorkbenchService.onChange(() => this.update()));
this.update();
}
private update(): void {
if (!this.extension || this.extension.type === LocalExtensionType.System) {
this.enabled = false;
this.class = MultiServerInstallAction.Class;
this.label = MultiServerInstallAction.InstallLabel;
return;
}
this.enabled = this._installActions.some(a => a.enabled);
if (this.extension.state === ExtensionState.Installing) {
this.label = MultiServerInstallAction.InstallingLabel;
this.class = MultiServerInstallAction.InstallingClass;
this.tooltip = MultiServerInstallAction.InstallingLabel;
} else {
this.label = MultiServerInstallAction.InstallLabel;
this.class = MultiServerInstallAction.Class;
this.tooltip = MultiServerInstallAction.InstallLabel;
}
}
private createInstallActionForServer(extensionManagementServer: IExtensionManagementServer): IExtensionAction {
const servicesCollection: ServiceCollection = new ServiceCollection();
servicesCollection.set(IExtensionManagementService, extensionManagementServer.extensionManagementService);
const instantiationService = this.instantiationService.createChild(servicesCollection);
servicesCollection.set(IExtensionsWorkbenchService, new SyncDescriptor(ExtensionsWorkbenchService));
return instantiationService.createInstance(InstallAction, extensionManagementServer);
}
public run(): TPromise<any> {
this._actionItem.showMenu();
return TPromise.wrap(null);
}
dispose(): void {
super.dispose();
this.disposables = dispose(this.disposables);
}
}
export class MultiServerUpdateAction extends Action {
static ID: string = 'extensions.multiserver.update';
private static readonly Class = 'extension-action multiserver prominent update';
private _updateActions: IExtensionAction[];
private _extensionServices: IExtensionsWorkbenchService[];
private _actionItem: DropDownMenuActionItem;
get actionItem(): IActionItem { return this._actionItem; }
private disposables: IDisposable[] = [];
private _extension: IExtension;
get extension(): IExtension { return this._extension; }
set extension(extension: IExtension) { this._extension = extension; this.update(); }
constructor(
@IExtensionManagementServerService private extensionManagementServerService: IExtensionManagementServerService,
@IInstantiationService private instantiationService: IInstantiationService,
@IExtensionsWorkbenchService private extensionsWorkbenchService: IExtensionsWorkbenchService
) {
super(MultiServerUpdateAction.ID, localize('update', "Update"), MultiServerUpdateAction.Class, false);
this.createUpdateActions();
this._actionItem = this.instantiationService.createInstance(DropDownMenuActionItem, this, [this._updateActions]);
this.disposables.push(this._actionItem);
this.disposables.push(this.extensionsWorkbenchService.onChange(() => this.update()));
this.update();
}
private update(): void {
TPromise.join(this._extensionServices.map((extensionService, index) => {
const promise = extensionService.local ? TPromise.as(extensionService.local) : extensionService.queryLocal();
return promise.then(extensions => {
this._updateActions[index].extension = extensions.filter(l => areSameExtensions(l, this.extension))[0];
});
})).then(() => {
this.enabled = this._updateActions.some(a => a.enabled);
});
}
private createUpdateActions(): void {
this._updateActions = [];
this._extensionServices = [];
for (const extensionManagementServer of this.extensionManagementServerService.extensionManagementServers) {
const servicesCollection: ServiceCollection = new ServiceCollection();
servicesCollection.set(IExtensionManagementService, extensionManagementServer.extensionManagementService);
servicesCollection.set(IExtensionsWorkbenchService, new SyncDescriptor(ExtensionsWorkbenchService));
const instantiationService = this.instantiationService.createChild(servicesCollection);
this._updateActions.push(instantiationService.createInstance(UpdateAction, extensionManagementServer));
instantiationService.invokeFunction(accessor => this._extensionServices.push(accessor.get(IExtensionsWorkbenchService)));
}
}
public run(): TPromise<any> {
this._actionItem.showMenu();
return TPromise.wrap(null);
}
dispose(): void {
super.dispose();
this.disposables = dispose(this.disposables);
}
} }
export class DropDownMenuActionItem extends ActionItem { export class DropDownMenuActionItem extends ActionItem {
...@@ -900,42 +1065,45 @@ export class ReloadAction extends Action { ...@@ -900,42 +1065,45 @@ export class ReloadAction extends Action {
} }
private computeReloadState(runningExtensions: IExtensionDescription[]): void { private computeReloadState(runningExtensions: IExtensionDescription[]): void {
const isInstalled = this.extensionsWorkbenchService.local.some(e => e.id === this.extension.id); const installed = this.extensionsWorkbenchService.local.filter(e => e.id === this.extension.id)[0];
const isUninstalled = this.extension.state === ExtensionState.Uninstalled; const isUninstalled = this.extension.state === ExtensionState.Uninstalled;
const isDisabled = this.extension.local ? !this.extensionEnablementService.isEnabled(this.extension.local) : false; const isDisabled = this.extension.local ? !this.extensionEnablementService.isEnabled(this.extension.local) : false;
const runningExtension = runningExtensions.filter(e => areSameExtensions(e, this.extension))[0];
const filteredExtensions = runningExtensions.filter(e => areSameExtensions(e, this.extension));
const isExtensionRunning = filteredExtensions.length > 0; if (installed && installed.local) {
const isDifferentVersionRunning = filteredExtensions.length > 0 && this.extension.version !== filteredExtensions[0].version; if (runningExtension) {
const isSameLocation = runningExtension.extensionLocation.toString() === installed.local.location.toString();
if (isInstalled) { if (isSameLocation) {
if (isDifferentVersionRunning && !isDisabled) { const isDifferentVersionRunning = this.extension.version !== runningExtension.version;
// Requires reload to run the updated extension if (isDifferentVersionRunning && !isDisabled) {
this.enabled = true; // Requires reload to run the updated extension
this.tooltip = localize('postUpdateTooltip', "Reload to update"); this.enabled = true;
this.reloadMessage = localize('postUpdateMessage', "Reload this window to activate the updated extension '{0}'?", this.extension.displayName); this.tooltip = localize('postUpdateTooltip', "Reload to update");
return; this.reloadMessage = localize('postUpdateMessage', "Reload this window to activate the updated extension '{0}'?", this.extension.displayName);
} return;
}
if (!isExtensionRunning && !isDisabled) { if (isDisabled) {
// Requires reload to enable the extension // Requires reload to disable the extension
this.enabled = true; this.enabled = true;
this.tooltip = localize('postEnableTooltip', "Reload to activate"); this.tooltip = localize('postDisableTooltip', "Reload to deactivate");
this.reloadMessage = localize('postEnableMessage', "Reload this window to activate the extension '{0}'?", this.extension.displayName); this.reloadMessage = localize('postDisableMessage', "Reload this window to deactivate the extension '{0}'?", this.extension.displayName);
return; return;
} }
}
if (isExtensionRunning && isDisabled) {
// Requires reload to disable the extension
this.enabled = true;
this.tooltip = localize('postDisableTooltip', "Reload to deactivate");
this.reloadMessage = localize('postDisableMessage', "Reload this window to deactivate the extension '{0}'?", this.extension.displayName);
return; return;
} else {
if (!isDisabled) {
// Requires reload to enable the extension
this.enabled = true;
this.tooltip = localize('postEnableTooltip', "Reload to activate");
this.reloadMessage = localize('postEnableMessage', "Reload this window to activate the extension '{0}'?", this.extension.displayName);
return;
}
} }
return; return;
} }
if (isUninstalled && isExtensionRunning) { if (isUninstalled && runningExtension) {
// Requires reload to deactivate the extension // Requires reload to deactivate the extension
this.enabled = true; this.enabled = true;
this.tooltip = localize('postUninstallTooltip', "Reload to deactivate"); this.tooltip = localize('postUninstallTooltip', "Reload to deactivate");
...@@ -1415,7 +1583,7 @@ export class ChangeSortAction extends Action { ...@@ -1415,7 +1583,7 @@ export class ChangeSortAction extends Action {
private onSearchChange(value: string): void { private onSearchChange(value: string): void {
const query = Query.parse(value); const query = Query.parse(value);
this.query = new Query(query.value, this.sortBy || query.sortBy); this.query = new Query(query.value, this.sortBy || query.sortBy, query.groupBy);
this.enabled = value && this.query.isValid() && !this.query.equals(query); this.enabled = value && this.query.isValid() && !this.query.equals(query);
} }
...@@ -1429,6 +1597,44 @@ export class ChangeSortAction extends Action { ...@@ -1429,6 +1597,44 @@ export class ChangeSortAction extends Action {
} }
} }
export class ChangeGroupAction extends Action {
private query: Query;
private disposables: IDisposable[] = [];
constructor(
id: string,
label: string,
onSearchChange: Event<string>,
private groupBy: string,
@IViewletService private viewletService: IViewletService
) {
super(id, label, null, true);
if (groupBy === undefined) {
throw new Error('bad arguments');
}
this.query = Query.parse('');
onSearchChange(this.onSearchChange, this, this.disposables);
this.onSearchChange('');
}
private onSearchChange(value: string): void {
const query = Query.parse(value);
this.query = new Query(query.value, query.sortBy, this.groupBy || query.groupBy);
}
run(): TPromise<void> {
return this.viewletService.openViewlet(VIEWLET_ID, true)
.then(viewlet => viewlet as IExtensionsViewlet)
.then(viewlet => {
viewlet.search(this.query.toString());
viewlet.focus();
});
}
}
export class ConfigureRecommendedExtensionsCommandsContributor extends Disposable implements IWorkbenchContribution { export class ConfigureRecommendedExtensionsCommandsContributor extends Disposable implements IWorkbenchContribution {
private workspaceContextKey = new RawContextKey<boolean>('workspaceRecommendations', true); private workspaceContextKey = new RawContextKey<boolean>('workspaceRecommendations', true);
......
...@@ -15,11 +15,11 @@ import { IPagedRenderer } from 'vs/base/browser/ui/list/listPaging'; ...@@ -15,11 +15,11 @@ import { IPagedRenderer } from 'vs/base/browser/ui/list/listPaging';
import { once } from 'vs/base/common/event'; import { once } from 'vs/base/common/event';
import { domEvent } from 'vs/base/browser/event'; import { domEvent } from 'vs/base/browser/event';
import { IExtension, IExtensionsWorkbenchService } from 'vs/workbench/parts/extensions/common/extensions'; import { IExtension, IExtensionsWorkbenchService } from 'vs/workbench/parts/extensions/common/extensions';
import { InstallAction, UpdateAction, ManageExtensionAction, ReloadAction, extensionButtonProminentBackground, extensionButtonProminentForeground, MaliciousStatusLabelAction, DisabledStatusLabelAction } from 'vs/workbench/parts/extensions/browser/extensionsActions'; import { InstallAction, UpdateAction, ManageExtensionAction, ReloadAction, extensionButtonProminentBackground, extensionButtonProminentForeground, MaliciousStatusLabelAction, DisabledStatusLabelAction, MultiServerInstallAction, MultiServerUpdateAction } from 'vs/workbench/parts/extensions/electron-browser/extensionsActions';
import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil';
import { Label, RatingsWidget, InstallCountWidget } from 'vs/workbench/parts/extensions/browser/extensionsWidgets'; import { Label, RatingsWidget, InstallCountWidget } from 'vs/workbench/parts/extensions/browser/extensionsWidgets';
import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions';
import { IExtensionTipsService } from 'vs/platform/extensionManagement/common/extensionManagement'; import { IExtensionTipsService, IExtensionManagementServerService } from 'vs/platform/extensionManagement/common/extensionManagement';
import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IThemeService } from 'vs/platform/theme/common/themeService';
import { INotificationService } from 'vs/platform/notification/common/notification'; import { INotificationService } from 'vs/platform/notification/common/notification';
...@@ -52,7 +52,8 @@ export class Renderer implements IPagedRenderer<IExtension, ITemplateData> { ...@@ -52,7 +52,8 @@ export class Renderer implements IPagedRenderer<IExtension, ITemplateData> {
@IExtensionsWorkbenchService private extensionsWorkbenchService: IExtensionsWorkbenchService, @IExtensionsWorkbenchService private extensionsWorkbenchService: IExtensionsWorkbenchService,
@IExtensionService private extensionService: IExtensionService, @IExtensionService private extensionService: IExtensionService,
@IExtensionTipsService private extensionTipsService: IExtensionTipsService, @IExtensionTipsService private extensionTipsService: IExtensionTipsService,
@IThemeService private themeService: IThemeService @IThemeService private themeService: IThemeService,
@IExtensionManagementServerService private extensionManagementServerService: IExtensionManagementServerService
) { } ) { }
get templateId() { return 'extension'; } get templateId() { return 'extension'; }
...@@ -87,6 +88,12 @@ export class Renderer implements IPagedRenderer<IExtension, ITemplateData> { ...@@ -87,6 +88,12 @@ export class Renderer implements IPagedRenderer<IExtension, ITemplateData> {
if (action.id === ManageExtensionAction.ID) { if (action.id === ManageExtensionAction.ID) {
return (<ManageExtensionAction>action).actionItem; return (<ManageExtensionAction>action).actionItem;
} }
if (action.id === MultiServerInstallAction.ID) {
return (<MultiServerInstallAction>action).actionItem;
}
if (action.id === MultiServerUpdateAction.ID) {
return (<MultiServerUpdateAction>action).actionItem;
}
return null; return null;
} }
}); });
...@@ -98,8 +105,10 @@ export class Renderer implements IPagedRenderer<IExtension, ITemplateData> { ...@@ -98,8 +105,10 @@ export class Renderer implements IPagedRenderer<IExtension, ITemplateData> {
const maliciousStatusAction = this.instantiationService.createInstance(MaliciousStatusLabelAction, false); const maliciousStatusAction = this.instantiationService.createInstance(MaliciousStatusLabelAction, false);
const disabledStatusAction = this.instantiationService.createInstance(DisabledStatusLabelAction); const disabledStatusAction = this.instantiationService.createInstance(DisabledStatusLabelAction);
const installAction = this.instantiationService.createInstance(InstallAction); const installAction = this.extensionManagementServerService.extensionManagementServers.length === 1 ? this.instantiationService.createInstance(InstallAction, this.extensionManagementServerService.extensionManagementServers[0])
const updateAction = this.instantiationService.createInstance(UpdateAction); : this.instantiationService.createInstance(MultiServerInstallAction);
const updateAction = this.extensionManagementServerService.extensionManagementServers.length === 1 ? this.instantiationService.createInstance(UpdateAction, this.extensionManagementServerService.extensionManagementServers[0])
: this.instantiationService.createInstance(MultiServerUpdateAction);
const reloadAction = this.instantiationService.createInstance(ReloadAction); const reloadAction = this.instantiationService.createInstance(ReloadAction);
const manageAction = this.instantiationService.createInstance(ManageExtensionAction); const manageAction = this.instantiationService.createInstance(ManageExtensionAction);
...@@ -141,12 +150,10 @@ export class Renderer implements IPagedRenderer<IExtension, ITemplateData> { ...@@ -141,12 +150,10 @@ export class Renderer implements IPagedRenderer<IExtension, ITemplateData> {
removeClass(data.element, 'loading'); removeClass(data.element, 'loading');
data.extensionDisposables = dispose(data.extensionDisposables); data.extensionDisposables = dispose(data.extensionDisposables);
const isInstalled = this.extensionsWorkbenchService.local.some(e => e.id === extension.id); const installed = this.extensionsWorkbenchService.local.filter(e => e.id === extension.id)[0];
this.extensionService.getExtensions().then(enabledExtensions => {
const isExtensionRunning = enabledExtensions.some(e => areSameExtensions(e, extension));
toggleClass(data.root, 'disabled', isInstalled && !isExtensionRunning); this.extensionService.getExtensions().then(runningExtensions => {
toggleClass(data.root, 'disabled', installed ? runningExtensions.every(e => !(installed.local.location.toString() === e.extensionLocation.toString() && areSameExtensions(e, extension))) : false);
}); });
const onError = once(domEvent(data.icon, 'error')); const onError = once(domEvent(data.icon, 'error'));
......
...@@ -28,11 +28,11 @@ import { IExtensionsWorkbenchService, IExtensionsViewlet, VIEWLET_ID, ExtensionS ...@@ -28,11 +28,11 @@ import { IExtensionsWorkbenchService, IExtensionsViewlet, VIEWLET_ID, ExtensionS
import { import {
ShowEnabledExtensionsAction, ShowInstalledExtensionsAction, ShowRecommendedExtensionsAction, ShowPopularExtensionsAction, ShowDisabledExtensionsAction, ShowEnabledExtensionsAction, ShowInstalledExtensionsAction, ShowRecommendedExtensionsAction, ShowPopularExtensionsAction, ShowDisabledExtensionsAction,
ShowOutdatedExtensionsAction, ClearExtensionsInputAction, ChangeSortAction, UpdateAllAction, CheckForUpdatesAction, DisableAllAction, EnableAllAction, ShowOutdatedExtensionsAction, ClearExtensionsInputAction, ChangeSortAction, UpdateAllAction, CheckForUpdatesAction, DisableAllAction, EnableAllAction,
EnableAutoUpdateAction, DisableAutoUpdateAction, ShowBuiltInExtensionsAction, InstallVSIXAction EnableAutoUpdateAction, DisableAutoUpdateAction, ShowBuiltInExtensionsAction, InstallVSIXAction, ChangeGroupAction
} from 'vs/workbench/parts/extensions/browser/extensionsActions'; } from 'vs/workbench/parts/extensions/electron-browser/extensionsActions';
import { LocalExtensionType, IExtensionManagementService } from 'vs/platform/extensionManagement/common/extensionManagement'; import { LocalExtensionType, IExtensionManagementService, IExtensionManagementServerService, IExtensionManagementServer } from 'vs/platform/extensionManagement/common/extensionManagement';
import { ExtensionsInput } from 'vs/workbench/parts/extensions/common/extensionsInput'; import { ExtensionsInput } from 'vs/workbench/parts/extensions/common/extensionsInput';
import { ExtensionsListView, InstalledExtensionsView, EnabledExtensionsView, DisabledExtensionsView, RecommendedExtensionsView, WorkspaceRecommendedExtensionsView, BuiltInExtensionsView, BuiltInThemesExtensionsView, BuiltInBasicsExtensionsView } from './extensionsViews'; import { ExtensionsListView, InstalledExtensionsView, EnabledExtensionsView, DisabledExtensionsView, RecommendedExtensionsView, WorkspaceRecommendedExtensionsView, BuiltInExtensionsView, BuiltInThemesExtensionsView, BuiltInBasicsExtensionsView, GroupByServerExtensionsView } from './extensionsViews';
import { OpenGlobalSettingsAction } from 'vs/workbench/parts/preferences/browser/preferencesActions'; import { OpenGlobalSettingsAction } from 'vs/workbench/parts/preferences/browser/preferencesActions';
import { IProgressService } from 'vs/platform/progress/common/progress'; import { IProgressService } from 'vs/platform/progress/common/progress';
import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService';
...@@ -42,7 +42,7 @@ import { IThemeService } from 'vs/platform/theme/common/themeService'; ...@@ -42,7 +42,7 @@ import { IThemeService } from 'vs/platform/theme/common/themeService';
import { inputForeground, inputBackground, inputBorder } from 'vs/platform/theme/common/colorRegistry'; import { inputForeground, inputBackground, inputBorder } from 'vs/platform/theme/common/colorRegistry';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { ViewsRegistry, IViewDescriptor } from 'vs/workbench/common/views'; import { ViewsRegistry, IViewDescriptor } from 'vs/workbench/common/views';
import { ViewContainerViewlet } from 'vs/workbench/browser/parts/views/viewsViewlet'; import { ViewContainerViewlet, IViewletViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet';
import { IStorageService } from 'vs/platform/storage/common/storage'; import { IStorageService } from 'vs/platform/storage/common/storage';
import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace';
import { IContextKeyService, ContextKeyExpr, RawContextKey, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IContextKeyService, ContextKeyExpr, RawContextKey, IContextKey } from 'vs/platform/contextkey/common/contextkey';
...@@ -54,6 +54,10 @@ import { IWindowService } from 'vs/platform/windows/common/windows'; ...@@ -54,6 +54,10 @@ import { IWindowService } from 'vs/platform/windows/common/windows';
import { IPartService } from 'vs/workbench/services/part/common/partService'; import { IPartService } from 'vs/workbench/services/part/common/partService';
import { IAddedViewDescriptorRef } from 'vs/workbench/browser/parts/views/views'; import { IAddedViewDescriptorRef } from 'vs/workbench/browser/parts/views/views';
import { ViewletPanel } from 'vs/workbench/browser/parts/views/panelViewlet'; import { ViewletPanel } from 'vs/workbench/browser/parts/views/panelViewlet';
import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection';
import { ExtensionsWorkbenchService } from 'vs/workbench/parts/extensions/node/extensionsWorkbenchService';
import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors';
import { SingleServerExtensionManagementServerService } from 'vs/workbench/services/extensions/node/extensionManagementServerService';
interface SearchInputEvent extends Event { interface SearchInputEvent extends Event {
target: HTMLInputElement; target: HTMLInputElement;
...@@ -66,10 +70,12 @@ const SearchInstalledExtensionsContext = new RawContextKey<boolean>('searchInsta ...@@ -66,10 +70,12 @@ const SearchInstalledExtensionsContext = new RawContextKey<boolean>('searchInsta
const SearchBuiltInExtensionsContext = new RawContextKey<boolean>('searchBuiltInExtensions', false); const SearchBuiltInExtensionsContext = new RawContextKey<boolean>('searchBuiltInExtensions', false);
const RecommendedExtensionsContext = new RawContextKey<boolean>('recommendedExtensions', false); const RecommendedExtensionsContext = new RawContextKey<boolean>('recommendedExtensions', false);
const DefaultRecommendedExtensionsContext = new RawContextKey<boolean>('defaultRecommendedExtensions', false); const DefaultRecommendedExtensionsContext = new RawContextKey<boolean>('defaultRecommendedExtensions', false);
const GroupByServersContext = new RawContextKey<boolean>('groupByServersContext', false);
export class ExtensionsViewletViewsContribution implements IWorkbenchContribution { export class ExtensionsViewletViewsContribution implements IWorkbenchContribution {
constructor( constructor(
@IExtensionManagementServerService private extensionManagementServerService: IExtensionManagementServerService
) { ) {
this.registerViews(); this.registerViews();
} }
...@@ -87,6 +93,13 @@ export class ExtensionsViewletViewsContribution implements IWorkbenchContributio ...@@ -87,6 +93,13 @@ export class ExtensionsViewletViewsContribution implements IWorkbenchContributio
viewDescriptors.push(this.createDefaultRecommendedExtensionsListViewDescriptor()); viewDescriptors.push(this.createDefaultRecommendedExtensionsListViewDescriptor());
viewDescriptors.push(this.createOtherRecommendedExtensionsListViewDescriptor()); viewDescriptors.push(this.createOtherRecommendedExtensionsListViewDescriptor());
viewDescriptors.push(this.createWorkspaceRecommendedExtensionsListViewDescriptor()); viewDescriptors.push(this.createWorkspaceRecommendedExtensionsListViewDescriptor());
if (this.extensionManagementServerService.extensionManagementServers.length > 1) {
for (const extensionManagementServer of this.extensionManagementServerService.extensionManagementServers) {
viewDescriptors.push(...this.createExtensionsViewDescriptorsForServer(extensionManagementServer));
}
}
ViewsRegistry.registerViews(viewDescriptors); ViewsRegistry.registerViews(viewDescriptors);
} }
...@@ -96,7 +109,7 @@ export class ExtensionsViewletViewsContribution implements IWorkbenchContributio ...@@ -96,7 +109,7 @@ export class ExtensionsViewletViewsContribution implements IWorkbenchContributio
name: localize('marketPlace', "Marketplace"), name: localize('marketPlace', "Marketplace"),
container: VIEW_CONTAINER, container: VIEW_CONTAINER,
ctor: ExtensionsListView, ctor: ExtensionsListView,
when: ContextKeyExpr.and(ContextKeyExpr.has('searchExtensions'), ContextKeyExpr.not('searchInstalledExtensions'), ContextKeyExpr.not('searchBuiltInExtensions'), ContextKeyExpr.not('recommendedExtensions')), when: ContextKeyExpr.and(ContextKeyExpr.has('searchExtensions'), ContextKeyExpr.not('searchInstalledExtensions'), ContextKeyExpr.not('searchBuiltInExtensions'), ContextKeyExpr.not('recommendedExtensions'), ContextKeyExpr.not('groupByServersContext')),
weight: 100 weight: 100
}; };
} }
...@@ -107,7 +120,7 @@ export class ExtensionsViewletViewsContribution implements IWorkbenchContributio ...@@ -107,7 +120,7 @@ export class ExtensionsViewletViewsContribution implements IWorkbenchContributio
name: localize('installedExtensions', "Installed"), name: localize('installedExtensions', "Installed"),
container: VIEW_CONTAINER, container: VIEW_CONTAINER,
ctor: InstalledExtensionsView, ctor: InstalledExtensionsView,
when: ContextKeyExpr.and(ContextKeyExpr.not('searchExtensions')), when: ContextKeyExpr.not('searchExtensions'),
order: 1, order: 1,
weight: 30, weight: 30,
canToggleVisibility: true, canToggleVisibility: true,
...@@ -121,7 +134,7 @@ export class ExtensionsViewletViewsContribution implements IWorkbenchContributio ...@@ -121,7 +134,7 @@ export class ExtensionsViewletViewsContribution implements IWorkbenchContributio
name: localize('enabledExtensions', "Enabled"), name: localize('enabledExtensions', "Enabled"),
container: VIEW_CONTAINER, container: VIEW_CONTAINER,
ctor: EnabledExtensionsView, ctor: EnabledExtensionsView,
when: ContextKeyExpr.and(ContextKeyExpr.not('searchExtensions')), when: ContextKeyExpr.not('searchExtensions'),
weight: 30, weight: 30,
canToggleVisibility: true, canToggleVisibility: true,
order: 1 order: 1
...@@ -134,10 +147,10 @@ export class ExtensionsViewletViewsContribution implements IWorkbenchContributio ...@@ -134,10 +147,10 @@ export class ExtensionsViewletViewsContribution implements IWorkbenchContributio
name: localize('disabledExtensions', "Disabled"), name: localize('disabledExtensions', "Disabled"),
container: VIEW_CONTAINER, container: VIEW_CONTAINER,
ctor: DisabledExtensionsView, ctor: DisabledExtensionsView,
when: ContextKeyExpr.and(ContextKeyExpr.not('searchExtensions')), when: ContextKeyExpr.not('searchExtensions'),
weight: 1, weight: 30,
canToggleVisibility: true, canToggleVisibility: true,
order: 30, order: 1,
hideByDefault: true hideByDefault: true
}; };
} }
...@@ -148,11 +161,22 @@ export class ExtensionsViewletViewsContribution implements IWorkbenchContributio ...@@ -148,11 +161,22 @@ export class ExtensionsViewletViewsContribution implements IWorkbenchContributio
name: localize('searchInstalledExtensions', "Installed"), name: localize('searchInstalledExtensions', "Installed"),
container: VIEW_CONTAINER, container: VIEW_CONTAINER,
ctor: InstalledExtensionsView, ctor: InstalledExtensionsView,
when: ContextKeyExpr.and(ContextKeyExpr.has('searchInstalledExtensions')), when: ContextKeyExpr.and(ContextKeyExpr.has('searchInstalledExtensions'), ContextKeyExpr.not('groupByServersContext')),
weight: 100 weight: 100
}; };
} }
private createExtensionsViewDescriptorsForServer(server: IExtensionManagementServer): IViewDescriptor[] {
return [{
id: `server.extensionsList.${server.location.toString()}`,
name: server.location.authority,
container: VIEW_CONTAINER,
ctor: GroupByServerExtensionsView,
when: ContextKeyExpr.has('groupByServersContext'),
weight: 100
}];
}
private createDefaultRecommendedExtensionsListViewDescriptor(): IViewDescriptor { private createDefaultRecommendedExtensionsListViewDescriptor(): IViewDescriptor {
return { return {
id: 'extensions.recommendedList', id: 'extensions.recommendedList',
...@@ -172,7 +196,7 @@ export class ExtensionsViewletViewsContribution implements IWorkbenchContributio ...@@ -172,7 +196,7 @@ export class ExtensionsViewletViewsContribution implements IWorkbenchContributio
name: localize('otherRecommendedExtensions', "Other Recommendations"), name: localize('otherRecommendedExtensions', "Other Recommendations"),
container: VIEW_CONTAINER, container: VIEW_CONTAINER,
ctor: RecommendedExtensionsView, ctor: RecommendedExtensionsView,
when: ContextKeyExpr.and(ContextKeyExpr.has('recommendedExtensions')), when: ContextKeyExpr.has('recommendedExtensions'),
weight: 50, weight: 50,
canToggleVisibility: true, canToggleVisibility: true,
order: 2 order: 2
...@@ -198,7 +222,7 @@ export class ExtensionsViewletViewsContribution implements IWorkbenchContributio ...@@ -198,7 +222,7 @@ export class ExtensionsViewletViewsContribution implements IWorkbenchContributio
name: localize('builtInExtensions', "Features"), name: localize('builtInExtensions', "Features"),
container: VIEW_CONTAINER, container: VIEW_CONTAINER,
ctor: BuiltInExtensionsView, ctor: BuiltInExtensionsView,
when: ContextKeyExpr.and(ContextKeyExpr.has('searchBuiltInExtensions')), when: ContextKeyExpr.has('searchBuiltInExtensions'),
weight: 100, weight: 100,
canToggleVisibility: true canToggleVisibility: true
}; };
...@@ -210,7 +234,7 @@ export class ExtensionsViewletViewsContribution implements IWorkbenchContributio ...@@ -210,7 +234,7 @@ export class ExtensionsViewletViewsContribution implements IWorkbenchContributio
name: localize('builtInThemesExtensions', "Themes"), name: localize('builtInThemesExtensions', "Themes"),
container: VIEW_CONTAINER, container: VIEW_CONTAINER,
ctor: BuiltInThemesExtensionsView, ctor: BuiltInThemesExtensionsView,
when: ContextKeyExpr.and(ContextKeyExpr.has('searchBuiltInExtensions')), when: ContextKeyExpr.has('searchBuiltInExtensions'),
weight: 100, weight: 100,
canToggleVisibility: true canToggleVisibility: true
}; };
...@@ -222,7 +246,7 @@ export class ExtensionsViewletViewsContribution implements IWorkbenchContributio ...@@ -222,7 +246,7 @@ export class ExtensionsViewletViewsContribution implements IWorkbenchContributio
name: localize('builtInBasicsExtensions', "Programming Languages"), name: localize('builtInBasicsExtensions', "Programming Languages"),
container: VIEW_CONTAINER, container: VIEW_CONTAINER,
ctor: BuiltInBasicsExtensionsView, ctor: BuiltInBasicsExtensionsView,
when: ContextKeyExpr.and(ContextKeyExpr.has('searchBuiltInExtensions')), when: ContextKeyExpr.has('searchBuiltInExtensions'),
weight: 100, weight: 100,
canToggleVisibility: true canToggleVisibility: true
}; };
...@@ -236,6 +260,7 @@ export class ExtensionsViewlet extends ViewContainerViewlet implements IExtensio ...@@ -236,6 +260,7 @@ export class ExtensionsViewlet extends ViewContainerViewlet implements IExtensio
private searchExtensionsContextKey: IContextKey<boolean>; private searchExtensionsContextKey: IContextKey<boolean>;
private searchInstalledExtensionsContextKey: IContextKey<boolean>; private searchInstalledExtensionsContextKey: IContextKey<boolean>;
private searchBuiltInExtensionsContextKey: IContextKey<boolean>; private searchBuiltInExtensionsContextKey: IContextKey<boolean>;
private groupByServersContextKey: IContextKey<boolean>;
private recommendedExtensionsContextKey: IContextKey<boolean>; private recommendedExtensionsContextKey: IContextKey<boolean>;
private defaultRecommendedExtensionsContextKey: IContextKey<boolean>; private defaultRecommendedExtensionsContextKey: IContextKey<boolean>;
...@@ -246,6 +271,7 @@ export class ExtensionsViewlet extends ViewContainerViewlet implements IExtensio ...@@ -246,6 +271,7 @@ export class ExtensionsViewlet extends ViewContainerViewlet implements IExtensio
private extensionsBox: HTMLElement; private extensionsBox: HTMLElement;
private primaryActions: IAction[]; private primaryActions: IAction[];
private secondaryActions: IAction[]; private secondaryActions: IAction[];
private groupByServerAction: IAction;
private disposables: IDisposable[] = []; private disposables: IDisposable[] = [];
constructor( constructor(
...@@ -263,7 +289,8 @@ export class ExtensionsViewlet extends ViewContainerViewlet implements IExtensio ...@@ -263,7 +289,8 @@ export class ExtensionsViewlet extends ViewContainerViewlet implements IExtensio
@IWorkspaceContextService contextService: IWorkspaceContextService, @IWorkspaceContextService contextService: IWorkspaceContextService,
@IContextKeyService contextKeyService: IContextKeyService, @IContextKeyService contextKeyService: IContextKeyService,
@IContextMenuService contextMenuService: IContextMenuService, @IContextMenuService contextMenuService: IContextMenuService,
@IExtensionService extensionService: IExtensionService @IExtensionService extensionService: IExtensionService,
@IExtensionManagementServerService private extensionManagementServerService: IExtensionManagementServerService
) { ) {
super(VIEWLET_ID, `${VIEWLET_ID}.state`, true, partService, telemetryService, storageService, instantiationService, themeService, contextMenuService, extensionService, contextService); super(VIEWLET_ID, `${VIEWLET_ID}.state`, true, partService, telemetryService, storageService, instantiationService, themeService, contextMenuService, extensionService, contextService);
...@@ -273,6 +300,7 @@ export class ExtensionsViewlet extends ViewContainerViewlet implements IExtensio ...@@ -273,6 +300,7 @@ export class ExtensionsViewlet extends ViewContainerViewlet implements IExtensio
this.searchInstalledExtensionsContextKey = SearchInstalledExtensionsContext.bindTo(contextKeyService); this.searchInstalledExtensionsContextKey = SearchInstalledExtensionsContext.bindTo(contextKeyService);
this.searchBuiltInExtensionsContextKey = SearchBuiltInExtensionsContext.bindTo(contextKeyService); this.searchBuiltInExtensionsContextKey = SearchBuiltInExtensionsContext.bindTo(contextKeyService);
this.recommendedExtensionsContextKey = RecommendedExtensionsContext.bindTo(contextKeyService); this.recommendedExtensionsContextKey = RecommendedExtensionsContext.bindTo(contextKeyService);
this.groupByServersContextKey = GroupByServersContext.bindTo(contextKeyService);
this.defaultRecommendedExtensionsContextKey = DefaultRecommendedExtensionsContext.bindTo(contextKeyService); this.defaultRecommendedExtensionsContextKey = DefaultRecommendedExtensionsContext.bindTo(contextKeyService);
this.defaultRecommendedExtensionsContextKey.set(!this.configurationService.getValue<boolean>(ShowRecommendationsOnlyOnDemandKey)); this.defaultRecommendedExtensionsContextKey.set(!this.configurationService.getValue<boolean>(ShowRecommendationsOnlyOnDemandKey));
this.disposables.push(this.viewletService.onDidViewletOpen(this.onViewletOpen, this, this.disposables)); this.disposables.push(this.viewletService.onDidViewletOpen(this.onViewletOpen, this, this.disposables));
...@@ -371,6 +399,12 @@ export class ExtensionsViewlet extends ViewContainerViewlet implements IExtensio ...@@ -371,6 +399,12 @@ export class ExtensionsViewlet extends ViewContainerViewlet implements IExtensio
getSecondaryActions(): IAction[] { getSecondaryActions(): IAction[] {
if (!this.secondaryActions) { if (!this.secondaryActions) {
if (!this.groupByServerAction) {
this.groupByServerAction = this.instantiationService.createInstance(ChangeGroupAction, 'extensions.group.servers', localize('group by servers', "Group By: Server"), this.onSearchChange, 'server');
this.disposables.push(this.onSearchChange(value => {
this.groupByServerAction.enabled = !value || InstalledExtensionsView.isInstalledExtensionsQuery(value) || ExtensionsListView.isBuiltInExtensionsQuery(value);
}));
}
this.secondaryActions = [ this.secondaryActions = [
this.instantiationService.createInstance(ShowInstalledExtensionsAction, ShowInstalledExtensionsAction.ID, ShowInstalledExtensionsAction.LABEL), this.instantiationService.createInstance(ShowInstalledExtensionsAction, ShowInstalledExtensionsAction.ID, ShowInstalledExtensionsAction.LABEL),
this.instantiationService.createInstance(ShowOutdatedExtensionsAction, ShowOutdatedExtensionsAction.ID, ShowOutdatedExtensionsAction.LABEL), this.instantiationService.createInstance(ShowOutdatedExtensionsAction, ShowOutdatedExtensionsAction.ID, ShowOutdatedExtensionsAction.LABEL),
...@@ -384,6 +418,7 @@ export class ExtensionsViewlet extends ViewContainerViewlet implements IExtensio ...@@ -384,6 +418,7 @@ export class ExtensionsViewlet extends ViewContainerViewlet implements IExtensio
this.instantiationService.createInstance(ChangeSortAction, 'extensions.sort.rating', localize('sort by rating', "Sort By: Rating"), this.onSearchChange, 'rating'), this.instantiationService.createInstance(ChangeSortAction, 'extensions.sort.rating', localize('sort by rating', "Sort By: Rating"), this.onSearchChange, 'rating'),
this.instantiationService.createInstance(ChangeSortAction, 'extensions.sort.name', localize('sort by name', "Sort By: Name"), this.onSearchChange, 'name'), this.instantiationService.createInstance(ChangeSortAction, 'extensions.sort.name', localize('sort by name', "Sort By: Name"), this.onSearchChange, 'name'),
new Separator(), new Separator(),
...(this.extensionManagementServerService.extensionManagementServers.length > 1 ? [this.groupByServerAction, new Separator()] : []),
this.instantiationService.createInstance(CheckForUpdatesAction, CheckForUpdatesAction.ID, CheckForUpdatesAction.LABEL), this.instantiationService.createInstance(CheckForUpdatesAction, CheckForUpdatesAction.ID, CheckForUpdatesAction.LABEL),
...(this.configurationService.getValue(AutoUpdateConfigurationKey) ? [this.instantiationService.createInstance(DisableAutoUpdateAction, DisableAutoUpdateAction.ID, DisableAutoUpdateAction.LABEL)] : [this.instantiationService.createInstance(UpdateAllAction, UpdateAllAction.ID, UpdateAllAction.LABEL), this.instantiationService.createInstance(EnableAutoUpdateAction, EnableAutoUpdateAction.ID, EnableAutoUpdateAction.LABEL)]), ...(this.configurationService.getValue(AutoUpdateConfigurationKey) ? [this.instantiationService.createInstance(DisableAutoUpdateAction, DisableAutoUpdateAction.ID, DisableAutoUpdateAction.LABEL)] : [this.instantiationService.createInstance(UpdateAllAction, UpdateAllAction.ID, UpdateAllAction.LABEL), this.instantiationService.createInstance(EnableAutoUpdateAction, EnableAutoUpdateAction.ID, EnableAutoUpdateAction.LABEL)]),
this.instantiationService.createInstance(InstallVSIXAction, InstallVSIXAction.ID, InstallVSIXAction.LABEL), this.instantiationService.createInstance(InstallVSIXAction, InstallVSIXAction.ID, InstallVSIXAction.LABEL),
...@@ -414,6 +449,7 @@ export class ExtensionsViewlet extends ViewContainerViewlet implements IExtensio ...@@ -414,6 +449,7 @@ export class ExtensionsViewlet extends ViewContainerViewlet implements IExtensio
this.searchExtensionsContextKey.set(!!value); this.searchExtensionsContextKey.set(!!value);
this.searchInstalledExtensionsContextKey.set(InstalledExtensionsView.isInstalledExtensionsQuery(value)); this.searchInstalledExtensionsContextKey.set(InstalledExtensionsView.isInstalledExtensionsQuery(value));
this.searchBuiltInExtensionsContextKey.set(ExtensionsListView.isBuiltInExtensionsQuery(value)); this.searchBuiltInExtensionsContextKey.set(ExtensionsListView.isBuiltInExtensionsQuery(value));
this.groupByServersContextKey.set(ExtensionsListView.isGroupByServersExtensionsQuery(value));
this.recommendedExtensionsContextKey.set(ExtensionsListView.isRecommendedExtensionsQuery(value)); this.recommendedExtensionsContextKey.set(ExtensionsListView.isRecommendedExtensionsQuery(value));
this.nonEmptyWorkspaceContextKey.set(this.contextService.getWorkbenchState() !== WorkbenchState.EMPTY); this.nonEmptyWorkspaceContextKey.set(this.contextService.getWorkbenchState() !== WorkbenchState.EMPTY);
...@@ -428,6 +464,20 @@ export class ExtensionsViewlet extends ViewContainerViewlet implements IExtensio ...@@ -428,6 +464,20 @@ export class ExtensionsViewlet extends ViewContainerViewlet implements IExtensio
return addedViews; return addedViews;
} }
protected createView(viewDescriptor: IViewDescriptor, options: IViewletViewOptions): ViewletPanel {
for (const extensionManagementServer of this.extensionManagementServerService.extensionManagementServers) {
if (viewDescriptor.id === `server.extensionsList.${extensionManagementServer.location.toString()}`) {
const servicesCollection: ServiceCollection = new ServiceCollection();
servicesCollection.set(IExtensionManagementServerService, new SingleServerExtensionManagementServerService(extensionManagementServer));
servicesCollection.set(IExtensionManagementService, extensionManagementServer.extensionManagementService);
servicesCollection.set(IExtensionsWorkbenchService, new SyncDescriptor(ExtensionsWorkbenchService));
const instantiationService = this.instantiationService.createChild(servicesCollection);
return instantiationService.createInstance(viewDescriptor.ctor, options, [extensionManagementServer]) as ViewletPanel;
}
}
return this.instantiationService.createInstance(viewDescriptor.ctor, options) as ViewletPanel;
}
private count(): number { private count(): number {
return this.panels.reduce((count, view) => (<ExtensionsListView>view).count() + count, 0); return this.panels.reduce((count, view) => (<ExtensionsListView>view).count() + count, 0);
} }
......
...@@ -18,7 +18,7 @@ import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; ...@@ -18,7 +18,7 @@ import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView';
import { append, $, toggleClass } from 'vs/base/browser/dom'; import { append, $, toggleClass } from 'vs/base/browser/dom';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { Delegate, Renderer } from 'vs/workbench/parts/extensions/browser/extensionsList'; import { Delegate, Renderer } from 'vs/workbench/parts/extensions/electron-browser/extensionsList';
import { IExtension, IExtensionsWorkbenchService } from '../common/extensions'; import { IExtension, IExtensionsWorkbenchService } from '../common/extensions';
import { Query } from '../common/extensionQuery'; import { Query } from '../common/extensionQuery';
import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions';
...@@ -31,7 +31,7 @@ import { IModeService } from 'vs/editor/common/services/modeService'; ...@@ -31,7 +31,7 @@ import { IModeService } from 'vs/editor/common/services/modeService';
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
import { CountBadge } from 'vs/base/browser/ui/countBadge/countBadge'; import { CountBadge } from 'vs/base/browser/ui/countBadge/countBadge';
import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar';
import { InstallWorkspaceRecommendedExtensionsAction, ConfigureWorkspaceFolderRecommendedExtensionsAction } from 'vs/workbench/parts/extensions/browser/extensionsActions'; import { InstallWorkspaceRecommendedExtensionsAction, ConfigureWorkspaceFolderRecommendedExtensionsAction } from 'vs/workbench/parts/extensions/electron-browser/extensionsActions';
import { WorkbenchPagedList } from 'vs/platform/list/browser/listService'; import { WorkbenchPagedList } from 'vs/platform/list/browser/listService';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { INotificationService } from 'vs/platform/notification/common/notification'; import { INotificationService } from 'vs/platform/notification/common/notification';
...@@ -545,6 +545,10 @@ export class ExtensionsListView extends ViewletPanel { ...@@ -545,6 +545,10 @@ export class ExtensionsListView extends ViewletPanel {
return /@installed/i.test(query); return /@installed/i.test(query);
} }
static isGroupByServersExtensionsQuery(query: string): boolean {
return !!Query.parse(query).groupBy;
}
static isOutdatedExtensionsQuery(query: string): boolean { static isOutdatedExtensionsQuery(query: string): boolean {
return /@outdated/i.test(query); return /@outdated/i.test(query);
} }
...@@ -593,6 +597,18 @@ export class InstalledExtensionsView extends ExtensionsListView { ...@@ -593,6 +597,18 @@ export class InstalledExtensionsView extends ExtensionsListView {
} }
} }
export class GroupByServerExtensionsView extends ExtensionsListView {
async show(query: string): TPromise<IPagedModel<IExtension>> {
query = query.replace(/@group:server/g, '').trim();
query = query ? query : '@installed';
if (!InstalledExtensionsView.isInstalledExtensionsQuery(query) && !ExtensionsListView.isBuiltInExtensionsQuery(query)) {
query = query += ' @installed';
}
return super.show(query.trim());
}
}
export class EnabledExtensionsView extends ExtensionsListView { export class EnabledExtensionsView extends ExtensionsListView {
async show(query: string): TPromise<IPagedModel<IExtension>> { async show(query: string): TPromise<IPagedModel<IExtension>> {
......
...@@ -19,6 +19,8 @@ ...@@ -19,6 +19,8 @@
background: url('clear-inverse.svg') center center no-repeat; background: url('clear-inverse.svg') center center no-repeat;
} }
.monaco-action-bar .action-item .action-label.extension-action.multiserver.install:after,
.monaco-action-bar .action-item .action-label.extension-action.multiserver.update:after,
.monaco-action-bar .action-item .action-label.extension-action.enable:after, .monaco-action-bar .action-item .action-label.extension-action.enable:after,
.monaco-action-bar .action-item .action-label.extension-action.disable:after { .monaco-action-bar .action-item .action-label.extension-action.disable:after {
content: '▼'; content: '▼';
......
...@@ -36,7 +36,7 @@ import { IEnvironmentService } from 'vs/platform/environment/common/environment' ...@@ -36,7 +36,7 @@ import { IEnvironmentService } from 'vs/platform/environment/common/environment'
import { memoize } from 'vs/base/common/decorators'; import { memoize } from 'vs/base/common/decorators';
import { isFalsyOrEmpty } from 'vs/base/common/arrays'; import { isFalsyOrEmpty } from 'vs/base/common/arrays';
import { Event } from 'vs/base/common/event'; import { Event } from 'vs/base/common/event';
import { DisableForWorkspaceAction, DisableGloballyAction } from 'vs/workbench/parts/extensions/browser/extensionsActions'; import { DisableForWorkspaceAction, DisableGloballyAction } from 'vs/workbench/parts/extensions/electron-browser/extensionsActions';
import { INotificationService } from 'vs/platform/notification/common/notification'; import { INotificationService } from 'vs/platform/notification/common/notification';
export const IExtensionHostProfileService = createDecorator<IExtensionHostProfileService>('extensionHostProfileService'); export const IExtensionHostProfileService = createDecorator<IExtensionHostProfileService>('extensionHostProfileService');
......
...@@ -155,14 +155,14 @@ class Extension implements IExtension { ...@@ -155,14 +155,14 @@ class Extension implements IExtension {
if (this.type === LocalExtensionType.System) { if (this.type === LocalExtensionType.System) {
if (this.local.manifest && this.local.manifest.contributes) { if (this.local.manifest && this.local.manifest.contributes) {
if (Array.isArray(this.local.manifest.contributes.themes) && this.local.manifest.contributes.themes.length) { if (Array.isArray(this.local.manifest.contributes.themes) && this.local.manifest.contributes.themes.length) {
return require.toUrl('../browser/media/theme-icon.png'); return require.toUrl('../electron-browser/media/theme-icon.png');
} }
if (Array.isArray(this.local.manifest.contributes.languages) && this.local.manifest.contributes.languages.length) { if (Array.isArray(this.local.manifest.contributes.languages) && this.local.manifest.contributes.languages.length) {
return require.toUrl('../browser/media/language-icon.png'); return require.toUrl('../electron-browser/media/language-icon.png');
} }
} }
} }
return require.toUrl('../browser/media/defaultIcon.png'); return require.toUrl('../electron-browser/media/defaultIcon.png');
} }
get repository(): string { get repository(): string {
...@@ -241,7 +241,6 @@ class Extension implements IExtension { ...@@ -241,7 +241,6 @@ class Extension implements IExtension {
if (this.type === LocalExtensionType.System) { if (this.type === LocalExtensionType.System) {
return TPromise.as(`# ${this.displayName || this.name} return TPromise.as(`# ${this.displayName || this.name}
**Notice** This is a an extension that is bundled with Visual Studio Code. **Notice** This is a an extension that is bundled with Visual Studio Code.
${this.description} ${this.description}
`); `);
} }
...@@ -331,7 +330,6 @@ class ExtensionDependencies implements IExtensionDependencies { ...@@ -331,7 +330,6 @@ class ExtensionDependencies implements IExtensionDependencies {
export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService, IURLHandler { export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService, IURLHandler {
private static readonly SyncPeriod = 1000 * 60 * 60 * 12; // 12 hours private static readonly SyncPeriod = 1000 * 60 * 60 * 12; // 12 hours
_serviceBrand: any; _serviceBrand: any;
private stateProvider: IExtensionStateProvider<ExtensionState>; private stateProvider: IExtensionStateProvider<ExtensionState>;
private installing: Extension[] = []; private installing: Extension[] = [];
...@@ -1009,4 +1007,4 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService, ...@@ -1009,4 +1007,4 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService,
this.syncDelayer.cancel(); this.syncDelayer.cancel();
this.disposables = dispose(this.disposables); this.disposables = dispose(this.disposables);
} }
} }
\ No newline at end of file
...@@ -72,72 +72,72 @@ suite('Extension query', () => { ...@@ -72,72 +72,72 @@ suite('Extension query', () => {
}); });
test('toString', () => { test('toString', () => {
let query = new Query('hello', ''); let query = new Query('hello', '', '');
assert.equal(query.toString(), 'hello'); assert.equal(query.toString(), 'hello');
query = new Query('hello world', ''); query = new Query('hello world', '', '');
assert.equal(query.toString(), 'hello world'); assert.equal(query.toString(), 'hello world');
query = new Query(' hello ', ''); query = new Query(' hello ', '', '');
assert.equal(query.toString(), 'hello'); assert.equal(query.toString(), 'hello');
query = new Query('', 'installs'); query = new Query('', 'installs', '');
assert.equal(query.toString(), '@sort:installs'); assert.equal(query.toString(), '@sort:installs');
query = new Query('', 'installs'); query = new Query('', 'installs', '');
assert.equal(query.toString(), '@sort:installs'); assert.equal(query.toString(), '@sort:installs');
query = new Query('', 'installs'); query = new Query('', 'installs', '');
assert.equal(query.toString(), '@sort:installs'); assert.equal(query.toString(), '@sort:installs');
query = new Query('hello', 'installs'); query = new Query('hello', 'installs', '');
assert.equal(query.toString(), 'hello @sort:installs'); assert.equal(query.toString(), 'hello @sort:installs');
query = new Query(' hello ', 'installs'); query = new Query(' hello ', 'installs', '');
assert.equal(query.toString(), 'hello @sort:installs'); assert.equal(query.toString(), 'hello @sort:installs');
}); });
test('isValid', () => { test('isValid', () => {
let query = new Query('hello', ''); let query = new Query('hello', '', '');
assert(query.isValid()); assert(query.isValid());
query = new Query('hello world', ''); query = new Query('hello world', '', '');
assert(query.isValid()); assert(query.isValid());
query = new Query(' hello ', ''); query = new Query(' hello ', '', '');
assert(query.isValid()); assert(query.isValid());
query = new Query('', 'installs'); query = new Query('', 'installs', '');
assert(query.isValid()); assert(query.isValid());
query = new Query('', 'installs'); query = new Query('', 'installs', '');
assert(query.isValid()); assert(query.isValid());
query = new Query('', 'installs'); query = new Query('', 'installs', '');
assert(query.isValid()); assert(query.isValid());
query = new Query('', 'installs'); query = new Query('', 'installs', '');
assert(query.isValid()); assert(query.isValid());
query = new Query('hello', 'installs'); query = new Query('hello', 'installs', '');
assert(query.isValid()); assert(query.isValid());
query = new Query(' hello ', 'installs'); query = new Query(' hello ', 'installs', '');
assert(query.isValid()); assert(query.isValid());
}); });
test('equals', () => { test('equals', () => {
let query1 = new Query('hello', ''); let query1 = new Query('hello', '', '');
let query2 = new Query('hello', ''); let query2 = new Query('hello', '', '');
assert(query1.equals(query2)); assert(query1.equals(query2));
query2 = new Query('hello world', ''); query2 = new Query('hello world', '', '');
assert(!query1.equals(query2)); assert(!query1.equals(query2));
query2 = new Query('hello', 'installs'); query2 = new Query('hello', 'installs', '');
assert(!query1.equals(query2)); assert(!query1.equals(query2));
query2 = new Query('hello', 'installs'); query2 = new Query('hello', 'installs', '');
assert(!query1.equals(query2)); assert(!query1.equals(query2));
}); });
}); });
\ No newline at end of file
...@@ -10,11 +10,11 @@ import { assign } from 'vs/base/common/objects'; ...@@ -10,11 +10,11 @@ import { assign } from 'vs/base/common/objects';
import { generateUuid } from 'vs/base/common/uuid'; import { generateUuid } from 'vs/base/common/uuid';
import { TPromise } from 'vs/base/common/winjs.base'; import { TPromise } from 'vs/base/common/winjs.base';
import { IExtensionsWorkbenchService } from 'vs/workbench/parts/extensions/common/extensions'; import { IExtensionsWorkbenchService } from 'vs/workbench/parts/extensions/common/extensions';
import * as ExtensionsActions from 'vs/workbench/parts/extensions/browser/extensionsActions'; import * as ExtensionsActions from 'vs/workbench/parts/extensions/electron-browser/extensionsActions';
import { ExtensionsWorkbenchService } from 'vs/workbench/parts/extensions/node/extensionsWorkbenchService'; import { ExtensionsWorkbenchService } from 'vs/workbench/parts/extensions/node/extensionsWorkbenchService';
import { import {
IExtensionManagementService, IExtensionGalleryService, IExtensionEnablementService, IExtensionTipsService, ILocalExtension, LocalExtensionType, IGalleryExtension, IExtensionManagementService, IExtensionGalleryService, IExtensionEnablementService, IExtensionTipsService, ILocalExtension, LocalExtensionType, IGalleryExtension,
DidInstallExtensionEvent, DidUninstallExtensionEvent, InstallExtensionEvent, IExtensionIdentifier, EnablementState, InstallOperation DidInstallExtensionEvent, DidUninstallExtensionEvent, InstallExtensionEvent, IExtensionIdentifier, EnablementState, InstallOperation, IExtensionManagementServer, IExtensionManagementServerService
} from 'vs/platform/extensionManagement/common/extensionManagement'; } from 'vs/platform/extensionManagement/common/extensionManagement';
import { getGalleryExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { getGalleryExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil';
import { ExtensionManagementService, getLocalExtensionIdFromGallery, getLocalExtensionIdFromManifest } from 'vs/platform/extensionManagement/node/extensionManagementService'; import { ExtensionManagementService, getLocalExtensionIdFromGallery, getLocalExtensionIdFromManifest } from 'vs/platform/extensionManagement/node/extensionManagementService';
...@@ -34,6 +34,8 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur ...@@ -34,6 +34,8 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur
import { ILogService, NullLogService } from 'vs/platform/log/common/log'; import { ILogService, NullLogService } from 'vs/platform/log/common/log';
import { IWindowService } from 'vs/platform/windows/common/windows'; import { IWindowService } from 'vs/platform/windows/common/windows';
import { URLService } from 'vs/platform/url/common/urlService'; import { URLService } from 'vs/platform/url/common/urlService';
import URI from 'vs/base/common/uri';
import { ExtensionManagementServerService } from 'vs/workbench/services/extensions/node/extensionManagementServerService';
suite('ExtensionsActions Test', () => { suite('ExtensionsActions Test', () => {
...@@ -61,12 +63,15 @@ suite('ExtensionsActions Test', () => { ...@@ -61,12 +63,15 @@ suite('ExtensionsActions Test', () => {
instantiationService.stub(IExtensionGalleryService, ExtensionGalleryService); instantiationService.stub(IExtensionGalleryService, ExtensionGalleryService);
instantiationService.stub(IExtensionManagementService, ExtensionManagementService); instantiationService.stub(IExtensionManagementService, ExtensionManagementService);
instantiationService.stub(IExtensionManagementService, 'onInstallExtension', installEvent.event); instantiationService.stub(IExtensionManagementService, 'onInstallExtension', installEvent.event);
instantiationService.stub(IExtensionManagementService, 'onDidInstallExtension', didInstallEvent.event); instantiationService.stub(IExtensionManagementService, 'onDidInstallExtension', didInstallEvent.event);
instantiationService.stub(IExtensionManagementService, 'onUninstallExtension', uninstallEvent.event); instantiationService.stub(IExtensionManagementService, 'onUninstallExtension', uninstallEvent.event);
instantiationService.stub(IExtensionManagementService, 'onDidUninstallExtension', didUninstallEvent.event); instantiationService.stub(IExtensionManagementService, 'onDidUninstallExtension', didUninstallEvent.event);
instantiationService.stub(IExtensionManagementServerService, new ExtensionManagementServerService(instantiationService.get(IExtensionManagementService)));
instantiationService.stub(IExtensionEnablementService, new TestExtensionEnablementService(instantiationService)); instantiationService.stub(IExtensionEnablementService, new TestExtensionEnablementService(instantiationService));
instantiationService.stub(IExtensionTipsService, ExtensionTipsService); instantiationService.stub(IExtensionTipsService, ExtensionTipsService);
...@@ -89,14 +94,14 @@ suite('ExtensionsActions Test', () => { ...@@ -89,14 +94,14 @@ suite('ExtensionsActions Test', () => {
}); });
test('Install action is disabled when there is no extension', () => { test('Install action is disabled when there is no extension', () => {
const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.InstallAction); const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.InstallAction, <IExtensionManagementServer>{ extensionManagementService: null, location: URI.from({ scheme: 'vscode-local', authority: 'local' }) });
assert.ok(!testObject.enabled); assert.ok(!testObject.enabled);
}); });
test('Test Install action when state is installed', () => { test('Test Install action when state is installed', () => {
const workbenchService = instantiationService.get(IExtensionsWorkbenchService); const workbenchService = instantiationService.get(IExtensionsWorkbenchService);
const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.InstallAction); const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.InstallAction, <IExtensionManagementServer>{ extensionManagementService: null, location: URI.from({ scheme: 'vscode-local', authority: 'local' }) });
const local = aLocalExtension('a'); const local = aLocalExtension('a');
instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);
return workbenchService.queryLocal() return workbenchService.queryLocal()
...@@ -114,7 +119,7 @@ suite('ExtensionsActions Test', () => { ...@@ -114,7 +119,7 @@ suite('ExtensionsActions Test', () => {
test('Test Install action when state is installing', () => { test('Test Install action when state is installing', () => {
const workbenchService = instantiationService.get(IExtensionsWorkbenchService); const workbenchService = instantiationService.get(IExtensionsWorkbenchService);
const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.InstallAction); const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.InstallAction, <IExtensionManagementServer>{ extensionManagementService: null, location: URI.from({ scheme: 'vscode-local', authority: 'local' }) });
const gallery = aGalleryExtension('a'); const gallery = aGalleryExtension('a');
instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery)); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));
return workbenchService.queryGallery() return workbenchService.queryGallery()
...@@ -130,7 +135,7 @@ suite('ExtensionsActions Test', () => { ...@@ -130,7 +135,7 @@ suite('ExtensionsActions Test', () => {
test('Test Install action when state is uninstalled', () => { test('Test Install action when state is uninstalled', () => {
const workbenchService = instantiationService.get(IExtensionsWorkbenchService); const workbenchService = instantiationService.get(IExtensionsWorkbenchService);
const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.InstallAction); const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.InstallAction, <IExtensionManagementServer>{ extensionManagementService: null, location: URI.from({ scheme: 'vscode-local', authority: 'local' }) });
const gallery = aGalleryExtension('a'); const gallery = aGalleryExtension('a');
instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery)); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));
return workbenchService.queryGallery() return workbenchService.queryGallery()
...@@ -142,7 +147,7 @@ suite('ExtensionsActions Test', () => { ...@@ -142,7 +147,7 @@ suite('ExtensionsActions Test', () => {
}); });
test('Test Install action when extension is system action', () => { test('Test Install action when extension is system action', () => {
const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.InstallAction); const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.InstallAction, <IExtensionManagementServer>{ extensionManagementService: null, location: URI.from({ scheme: 'vscode-local', authority: 'local' }) });
const local = aLocalExtension('a', {}, { type: LocalExtensionType.System }); const local = aLocalExtension('a', {}, { type: LocalExtensionType.System });
instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);
...@@ -156,7 +161,7 @@ suite('ExtensionsActions Test', () => { ...@@ -156,7 +161,7 @@ suite('ExtensionsActions Test', () => {
}); });
test('Test Install action when extension doesnot has gallery', () => { test('Test Install action when extension doesnot has gallery', () => {
const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.InstallAction); const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.InstallAction, <IExtensionManagementServer>{ extensionManagementService: null, location: URI.from({ scheme: 'vscode-local', authority: 'local' }) });
const local = aLocalExtension('a'); const local = aLocalExtension('a');
instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);
...@@ -237,14 +242,14 @@ suite('ExtensionsActions Test', () => { ...@@ -237,14 +242,14 @@ suite('ExtensionsActions Test', () => {
}); });
test('Test CombinedInstallAction when there is no extension', () => { test('Test CombinedInstallAction when there is no extension', () => {
const testObject: ExtensionsActions.CombinedInstallAction = instantiationService.createInstance(ExtensionsActions.CombinedInstallAction); const testObject: ExtensionsActions.CombinedInstallAction = instantiationService.createInstance(ExtensionsActions.CombinedInstallAction, <IExtensionManagementServer>{ extensionManagementService: null, location: URI.from({ scheme: 'vscode-local', authority: 'local' }) });
assert.ok(!testObject.enabled); assert.ok(!testObject.enabled);
assert.equal('extension-action prominent install no-extension', testObject.class); assert.equal('extension-action prominent install no-extension', testObject.class);
}); });
test('Test CombinedInstallAction when extension is system extension', () => { test('Test CombinedInstallAction when extension is system extension', () => {
const testObject: ExtensionsActions.CombinedInstallAction = instantiationService.createInstance(ExtensionsActions.CombinedInstallAction); const testObject: ExtensionsActions.CombinedInstallAction = instantiationService.createInstance(ExtensionsActions.CombinedInstallAction, <IExtensionManagementServer>{ extensionManagementService: null, location: URI.from({ scheme: 'vscode-local', authority: 'local' }) });
const local = aLocalExtension('a', {}, { type: LocalExtensionType.System }); const local = aLocalExtension('a', {}, { type: LocalExtensionType.System });
instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);
...@@ -258,7 +263,7 @@ suite('ExtensionsActions Test', () => { ...@@ -258,7 +263,7 @@ suite('ExtensionsActions Test', () => {
test('Test CombinedInstallAction when installAction is enabled', () => { test('Test CombinedInstallAction when installAction is enabled', () => {
const workbenchService = instantiationService.get(IExtensionsWorkbenchService); const workbenchService = instantiationService.get(IExtensionsWorkbenchService);
const testObject: ExtensionsActions.CombinedInstallAction = instantiationService.createInstance(ExtensionsActions.CombinedInstallAction); const testObject: ExtensionsActions.CombinedInstallAction = instantiationService.createInstance(ExtensionsActions.CombinedInstallAction, <IExtensionManagementServer>{ extensionManagementService: null, location: URI.from({ scheme: 'vscode-local', authority: 'local' }) });
const gallery = aGalleryExtension('a'); const gallery = aGalleryExtension('a');
instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery)); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));
...@@ -272,7 +277,7 @@ suite('ExtensionsActions Test', () => { ...@@ -272,7 +277,7 @@ suite('ExtensionsActions Test', () => {
}); });
test('Test CombinedInstallAction when unInstallAction is enabled', () => { test('Test CombinedInstallAction when unInstallAction is enabled', () => {
const testObject: ExtensionsActions.CombinedInstallAction = instantiationService.createInstance(ExtensionsActions.CombinedInstallAction); const testObject: ExtensionsActions.CombinedInstallAction = instantiationService.createInstance(ExtensionsActions.CombinedInstallAction, <IExtensionManagementServer>{ extensionManagementService: null, location: URI.from({ scheme: 'vscode-local', authority: 'local' }) });
const local = aLocalExtension('a'); const local = aLocalExtension('a');
instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);
...@@ -286,7 +291,7 @@ suite('ExtensionsActions Test', () => { ...@@ -286,7 +291,7 @@ suite('ExtensionsActions Test', () => {
}); });
test('Test CombinedInstallAction when state is installing', () => { test('Test CombinedInstallAction when state is installing', () => {
const testObject: ExtensionsActions.CombinedInstallAction = instantiationService.createInstance(ExtensionsActions.CombinedInstallAction); const testObject: ExtensionsActions.CombinedInstallAction = instantiationService.createInstance(ExtensionsActions.CombinedInstallAction, <IExtensionManagementServer>{ extensionManagementService: null, location: URI.from({ scheme: 'vscode-local', authority: 'local' }) });
const workbenchService = instantiationService.get(IExtensionsWorkbenchService); const workbenchService = instantiationService.get(IExtensionsWorkbenchService);
const gallery = aGalleryExtension('a'); const gallery = aGalleryExtension('a');
instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery)); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));
...@@ -302,7 +307,7 @@ suite('ExtensionsActions Test', () => { ...@@ -302,7 +307,7 @@ suite('ExtensionsActions Test', () => {
}); });
test('Test CombinedInstallAction when state is uninstalling', () => { test('Test CombinedInstallAction when state is uninstalling', () => {
const testObject: ExtensionsActions.CombinedInstallAction = instantiationService.createInstance(ExtensionsActions.CombinedInstallAction); const testObject: ExtensionsActions.CombinedInstallAction = instantiationService.createInstance(ExtensionsActions.CombinedInstallAction, <IExtensionManagementServer>{ extensionManagementService: null, location: URI.from({ scheme: 'vscode-local', authority: 'local' }) });
const local = aLocalExtension('a'); const local = aLocalExtension('a');
instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);
...@@ -317,13 +322,13 @@ suite('ExtensionsActions Test', () => { ...@@ -317,13 +322,13 @@ suite('ExtensionsActions Test', () => {
}); });
test('Test UpdateAction when there is no extension', () => { test('Test UpdateAction when there is no extension', () => {
const testObject: ExtensionsActions.UpdateAction = instantiationService.createInstance(ExtensionsActions.UpdateAction); const testObject: ExtensionsActions.UpdateAction = instantiationService.createInstance(ExtensionsActions.UpdateAction, <IExtensionManagementServer>{ extensionManagementService: null, location: URI.from({ scheme: 'vscode-local', authority: 'local' }) });
assert.ok(!testObject.enabled); assert.ok(!testObject.enabled);
}); });
test('Test UpdateAction when extension is uninstalled', () => { test('Test UpdateAction when extension is uninstalled', () => {
const testObject: ExtensionsActions.UpdateAction = instantiationService.createInstance(ExtensionsActions.UpdateAction); const testObject: ExtensionsActions.UpdateAction = instantiationService.createInstance(ExtensionsActions.UpdateAction, <IExtensionManagementServer>{ extensionManagementService: null, location: URI.from({ scheme: 'vscode-local', authority: 'local' }) });
const gallery = aGalleryExtension('a', { version: '1.0.0' }); const gallery = aGalleryExtension('a', { version: '1.0.0' });
instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery)); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));
return instantiationService.get(IExtensionsWorkbenchService).queryGallery() return instantiationService.get(IExtensionsWorkbenchService).queryGallery()
...@@ -334,7 +339,7 @@ suite('ExtensionsActions Test', () => { ...@@ -334,7 +339,7 @@ suite('ExtensionsActions Test', () => {
}); });
test('Test UpdateAction when extension is installed and not outdated', () => { test('Test UpdateAction when extension is installed and not outdated', () => {
const testObject: ExtensionsActions.UpdateAction = instantiationService.createInstance(ExtensionsActions.UpdateAction); const testObject: ExtensionsActions.UpdateAction = instantiationService.createInstance(ExtensionsActions.UpdateAction, <IExtensionManagementServer>{ extensionManagementService: null, location: URI.from({ scheme: 'vscode-local', authority: 'local' }) });
const local = aLocalExtension('a', { version: '1.0.0' }); const local = aLocalExtension('a', { version: '1.0.0' });
instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);
...@@ -348,7 +353,7 @@ suite('ExtensionsActions Test', () => { ...@@ -348,7 +353,7 @@ suite('ExtensionsActions Test', () => {
}); });
test('Test UpdateAction when extension is installed outdated and system extension', () => { test('Test UpdateAction when extension is installed outdated and system extension', () => {
const testObject: ExtensionsActions.UpdateAction = instantiationService.createInstance(ExtensionsActions.UpdateAction); const testObject: ExtensionsActions.UpdateAction = instantiationService.createInstance(ExtensionsActions.UpdateAction, <IExtensionManagementServer>{ extensionManagementService: null, location: URI.from({ scheme: 'vscode-local', authority: 'local' }) });
const local = aLocalExtension('a', { version: '1.0.0' }, { type: LocalExtensionType.System }); const local = aLocalExtension('a', { version: '1.0.0' }, { type: LocalExtensionType.System });
instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);
...@@ -362,7 +367,7 @@ suite('ExtensionsActions Test', () => { ...@@ -362,7 +367,7 @@ suite('ExtensionsActions Test', () => {
}); });
test('Test UpdateAction when extension is installed outdated and user extension', () => { test('Test UpdateAction when extension is installed outdated and user extension', () => {
const testObject: ExtensionsActions.UpdateAction = instantiationService.createInstance(ExtensionsActions.UpdateAction); const testObject: ExtensionsActions.UpdateAction = instantiationService.createInstance(ExtensionsActions.UpdateAction, <IExtensionManagementServer>{ extensionManagementService: null, location: URI.from({ scheme: 'vscode-local', authority: 'local' }) });
const local = aLocalExtension('a', { version: '1.0.0' }); const local = aLocalExtension('a', { version: '1.0.0' });
instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);
...@@ -376,7 +381,7 @@ suite('ExtensionsActions Test', () => { ...@@ -376,7 +381,7 @@ suite('ExtensionsActions Test', () => {
}); });
test('Test UpdateAction when extension is installing and outdated and user extension', () => { test('Test UpdateAction when extension is installing and outdated and user extension', () => {
const testObject: ExtensionsActions.UpdateAction = instantiationService.createInstance(ExtensionsActions.UpdateAction); const testObject: ExtensionsActions.UpdateAction = instantiationService.createInstance(ExtensionsActions.UpdateAction, <IExtensionManagementServer>{ extensionManagementService: null, location: URI.from({ scheme: 'vscode-local', authority: 'local' }) });
const local = aLocalExtension('a', { version: '1.0.0' }); const local = aLocalExtension('a', { version: '1.0.0' });
instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);
...@@ -983,7 +988,7 @@ suite('ExtensionsActions Test', () => { ...@@ -983,7 +988,7 @@ suite('ExtensionsActions Test', () => {
}); });
test('Test ReloadAction when extension is newly installed', () => { test('Test ReloadAction when extension is newly installed', () => {
instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ id: 'pub.b' }]); instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ id: 'pub.b', extensionLocation: URI.file('pub.b') }]);
const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction); const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction);
const gallery = aGalleryExtension('a'); const gallery = aGalleryExtension('a');
instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery)); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));
...@@ -1000,7 +1005,7 @@ suite('ExtensionsActions Test', () => { ...@@ -1000,7 +1005,7 @@ suite('ExtensionsActions Test', () => {
}); });
test('Test ReloadAction when extension is installed and uninstalled', () => { test('Test ReloadAction when extension is installed and uninstalled', () => {
instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ id: 'pub.b' }]); instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ id: 'pub.b', extensionLocation: URI.file('pub.b') }]);
const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction); const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction);
const gallery = aGalleryExtension('a'); const gallery = aGalleryExtension('a');
instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery)); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));
...@@ -1018,7 +1023,7 @@ suite('ExtensionsActions Test', () => { ...@@ -1018,7 +1023,7 @@ suite('ExtensionsActions Test', () => {
}); });
test('Test ReloadAction when extension is uninstalled', () => { test('Test ReloadAction when extension is uninstalled', () => {
instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ id: 'pub.a' }]); instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ id: 'pub.a', extensionLocation: URI.file('pub.a') }]);
const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction); const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction);
const local = aLocalExtension('a'); const local = aLocalExtension('a');
instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);
...@@ -1035,7 +1040,7 @@ suite('ExtensionsActions Test', () => { ...@@ -1035,7 +1040,7 @@ suite('ExtensionsActions Test', () => {
}); });
test('Test ReloadAction when extension is uninstalled and installed', () => { test('Test ReloadAction when extension is uninstalled and installed', () => {
instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ id: 'pub.a', version: '1.0.0' }]); instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ id: 'pub.a', version: '1.0.0', extensionLocation: URI.file('pub.a') }]);
const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction); const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction);
const local = aLocalExtension('a'); const local = aLocalExtension('a');
instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]);
...@@ -1055,7 +1060,7 @@ suite('ExtensionsActions Test', () => { ...@@ -1055,7 +1060,7 @@ suite('ExtensionsActions Test', () => {
}); });
test('Test ReloadAction when extension is updated while running', () => { test('Test ReloadAction when extension is updated while running', () => {
instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ id: 'pub.a', version: '1.0.1' }]); instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ id: 'pub.a', version: '1.0.1', extensionLocation: URI.file('pub.a') }]);
const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction); const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction);
const local = aLocalExtension('a', { version: '1.0.1' }); const local = aLocalExtension('a', { version: '1.0.1' });
const workbenchService = instantiationService.get(IExtensionsWorkbenchService); const workbenchService = instantiationService.get(IExtensionsWorkbenchService);
...@@ -1075,7 +1080,7 @@ suite('ExtensionsActions Test', () => { ...@@ -1075,7 +1080,7 @@ suite('ExtensionsActions Test', () => {
}); });
test('Test ReloadAction when extension is updated when not running', () => { test('Test ReloadAction when extension is updated when not running', () => {
instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ id: 'pub.b' }]); instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ id: 'pub.b', extensionLocation: URI.file('pub.b') }]);
const local = aLocalExtension('a', { version: '1.0.1' }); const local = aLocalExtension('a', { version: '1.0.1' });
return instantiationService.get(IExtensionEnablementService).setEnablement(local, EnablementState.Disabled) return instantiationService.get(IExtensionEnablementService).setEnablement(local, EnablementState.Disabled)
.then(() => { .then(() => {
...@@ -1096,7 +1101,7 @@ suite('ExtensionsActions Test', () => { ...@@ -1096,7 +1101,7 @@ suite('ExtensionsActions Test', () => {
}); });
test('Test ReloadAction when extension is disabled when running', () => { test('Test ReloadAction when extension is disabled when running', () => {
instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ id: 'pub.a' }]); instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ id: 'pub.a', extensionLocation: URI.file('pub.a') }]);
const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction); const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction);
const local = aLocalExtension('a'); const local = aLocalExtension('a');
const workbenchService = instantiationService.get(IExtensionsWorkbenchService); const workbenchService = instantiationService.get(IExtensionsWorkbenchService);
...@@ -1113,7 +1118,7 @@ suite('ExtensionsActions Test', () => { ...@@ -1113,7 +1118,7 @@ suite('ExtensionsActions Test', () => {
}); });
test('Test ReloadAction when extension enablement is toggled when running', () => { test('Test ReloadAction when extension enablement is toggled when running', () => {
instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ id: 'pub.a', version: '1.0.0' }]); instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ id: 'pub.a', version: '1.0.0', extensionLocation: URI.file('pub.a') }]);
const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction); const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction);
const local = aLocalExtension('a'); const local = aLocalExtension('a');
const workbenchService = instantiationService.get(IExtensionsWorkbenchService); const workbenchService = instantiationService.get(IExtensionsWorkbenchService);
...@@ -1128,7 +1133,7 @@ suite('ExtensionsActions Test', () => { ...@@ -1128,7 +1133,7 @@ suite('ExtensionsActions Test', () => {
}); });
test('Test ReloadAction when extension is enabled when not running', () => { test('Test ReloadAction when extension is enabled when not running', () => {
instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ id: 'pub.b' }]); instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ id: 'pub.b', extensionLocation: URI.file('pub.b') }]);
const local = aLocalExtension('a'); const local = aLocalExtension('a');
return instantiationService.get(IExtensionEnablementService).setEnablement(local, EnablementState.Disabled) return instantiationService.get(IExtensionEnablementService).setEnablement(local, EnablementState.Disabled)
.then(() => { .then(() => {
...@@ -1149,7 +1154,7 @@ suite('ExtensionsActions Test', () => { ...@@ -1149,7 +1154,7 @@ suite('ExtensionsActions Test', () => {
}); });
test('Test ReloadAction when extension enablement is toggled when not running', () => { test('Test ReloadAction when extension enablement is toggled when not running', () => {
instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ id: 'pub.b' }]); instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ id: 'pub.b', extensionLocation: URI.file('pub.b') }]);
const local = aLocalExtension('a'); const local = aLocalExtension('a');
return instantiationService.get(IExtensionEnablementService).setEnablement(local, EnablementState.Disabled) return instantiationService.get(IExtensionEnablementService).setEnablement(local, EnablementState.Disabled)
.then(() => { .then(() => {
...@@ -1167,7 +1172,7 @@ suite('ExtensionsActions Test', () => { ...@@ -1167,7 +1172,7 @@ suite('ExtensionsActions Test', () => {
}); });
test('Test ReloadAction when extension is updated when not running and enabled', () => { test('Test ReloadAction when extension is updated when not running and enabled', () => {
instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ id: 'pub.b' }]); instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ id: 'pub.b', extensionLocation: URI.file('pub.b') }]);
const local = aLocalExtension('a', { version: '1.0.1' }); const local = aLocalExtension('a', { version: '1.0.1' });
return instantiationService.get(IExtensionEnablementService).setEnablement(local, EnablementState.Disabled) return instantiationService.get(IExtensionEnablementService).setEnablement(local, EnablementState.Disabled)
.then(() => { .then(() => {
...@@ -1194,7 +1199,7 @@ suite('ExtensionsActions Test', () => { ...@@ -1194,7 +1199,7 @@ suite('ExtensionsActions Test', () => {
function aLocalExtension(name: string = 'someext', manifest: any = {}, properties: any = {}): ILocalExtension { function aLocalExtension(name: string = 'someext', manifest: any = {}, properties: any = {}): ILocalExtension {
const localExtension = <ILocalExtension>Object.create({ manifest: {} }); const localExtension = <ILocalExtension>Object.create({ manifest: {} });
assign(localExtension, { type: LocalExtensionType.User, manifest: {} }, properties); assign(localExtension, { type: LocalExtensionType.User, manifest: {}, location: URI.file(`pub.${name}`) }, properties);
assign(localExtension.manifest, { name, publisher: 'pub', version: '1.0.0' }, manifest); assign(localExtension.manifest, { name, publisher: 'pub', version: '1.0.0' }, manifest);
localExtension.identifier = { id: getLocalExtensionIdFromManifest(localExtension.manifest) }; localExtension.identifier = { id: getLocalExtensionIdFromManifest(localExtension.manifest) };
localExtension.metadata = { id: localExtension.identifier.id, publisherId: localExtension.manifest.publisher, publisherDisplayName: 'somename' }; localExtension.metadata = { id: localExtension.identifier.id, publisherId: localExtension.manifest.publisher, publisherDisplayName: 'somename' };
......
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { IExtensionManagementService, IExtensionManagementServerService, IExtensionManagementServer } from 'vs/platform/extensionManagement/common/extensionManagement';
import URI from 'vs/base/common/uri';
import { Schemas } from 'vs/base/common/network';
export class ExtensionManagementServerService implements IExtensionManagementServerService {
_serviceBrand: any;
readonly extensionManagementServers: IExtensionManagementServer[];
constructor(
localExtensionManagementService: IExtensionManagementService
) {
this.extensionManagementServers = [{ extensionManagementService: localExtensionManagementService, location: URI.from({ scheme: 'vscode-local', authority: 'local' }) }];
}
getExtensionManagementServer(location: URI): IExtensionManagementServer {
return this.extensionManagementServers[0];
}
}
export class SingleServerExtensionManagementServerService implements IExtensionManagementServerService {
_serviceBrand: any;
readonly extensionManagementServers: IExtensionManagementServer[];
constructor(
extensionManagementServer: IExtensionManagementServer
) {
this.extensionManagementServers = [extensionManagementServer];
}
getExtensionManagementServer(location: URI): IExtensionManagementServer {
location = location.scheme === Schemas.file ? URI.from({ scheme: 'vscode-local', authority: 'local' }) : location;
return this.extensionManagementServers.filter(server => location.authority === server.location.authority)[0];
}
}
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册