提交 fa9e584f 编写于 作者: S Sandeep Somavarapu

Fix #54041

上级 4d492484
......@@ -5,8 +5,9 @@
'use strict';
import { ILocalExtension, IGalleryExtension, EXTENSION_IDENTIFIER_REGEX, IExtensionIdentifier, IReportedExtension, IExtensionManifest } from 'vs/platform/extensionManagement/common/extensionManagement';
import { ILocalExtension, IGalleryExtension, IExtensionIdentifier, IReportedExtension, IExtensionManifest } from 'vs/platform/extensionManagement/common/extensionManagement';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { compareIgnoreCase } from 'vs/base/common/strings';
export function areSameExtensions(a: IExtensionIdentifier, b: IExtensionIdentifier): boolean {
if (a.uuid && b.uuid) {
......@@ -15,7 +16,11 @@ export function areSameExtensions(a: IExtensionIdentifier, b: IExtensionIdentifi
if (a.id === b.id) {
return true;
}
return adoptToGalleryExtensionId(a.id) === adoptToGalleryExtensionId(b.id);
return compareIgnoreCase(a.id, b.id) === 0;
}
export function adoptToGalleryExtensionId(id: string): string {
return id.toLocaleLowerCase();
}
export function getGalleryExtensionId(publisher: string, name: string): string {
......@@ -36,10 +41,6 @@ export function getIdFromLocalExtensionId(localExtensionId: string): string {
return adoptToGalleryExtensionId(localExtensionId);
}
export function adoptToGalleryExtensionId(id: string): string {
return id.replace(EXTENSION_IDENTIFIER_REGEX, (match, publisher: string, name: string) => getGalleryExtensionId(publisher, name));
}
export function getLocalExtensionId(id: string, version: string): string {
return `${id}-${version}`;
}
......
......@@ -77,7 +77,7 @@ export const IExtensionsWorkbenchService = createDecorator<IExtensionsWorkbenchS
export interface IExtensionsWorkbenchService {
_serviceBrand: any;
onChange: Event<void>;
onChange: Event<IExtension | undefined>;
local: IExtension[];
queryLocal(): TPromise<IExtension[]>;
queryGallery(options?: IQueryOptions): TPromise<IPager<IExtension>>;
......
......@@ -100,11 +100,11 @@ export class InstallAction extends Action {
) {
super(`extensions.install`, InstallAction.INSTALL_LABEL, InstallAction.Class, false);
this.disposables.push(this.extensionsWorkbenchService.onChange(() => this.update()));
this.disposables.push(this.extensionsWorkbenchService.onChange(extension => this.update(extension)));
this.update();
}
private update(): void {
private update(extension?: IExtension): void {
if (!this.extension || this.extension.type === LocalExtensionType.System) {
this.enabled = false;
this.class = InstallAction.Class;
......@@ -112,6 +112,10 @@ export class InstallAction extends Action {
return;
}
if (extension && !areSameExtensions(this.extension, extension)) {
return;
}
this.enabled = this.extensionsWorkbenchService.canInstall(this.extension) && this.extension.state === ExtensionState.Uninstalled;
if (this.extension.state === ExtensionState.Installing) {
......@@ -167,16 +171,20 @@ export class UninstallAction extends Action {
) {
super('extensions.uninstall', UninstallAction.UninstallLabel, UninstallAction.UninstallClass, false);
this.disposables.push(this.extensionsWorkbenchService.onChange(() => this.update()));
this.disposables.push(this.extensionsWorkbenchService.onChange(extension => this.update(extension)));
this.update();
}
private update(): void {
private update(extension?: IExtension): void {
if (!this.extension) {
this.enabled = false;
return;
}
if (extension && !areSameExtensions(this.extension, extension)) {
return;
}
const state = this.extension.state;
if (state === ExtensionState.Uninstalling) {
......@@ -307,11 +315,11 @@ export class UpdateAction extends Action {
@IOpenerService private openerService: IOpenerService
) {
super(`extensions.update`, '', UpdateAction.DisabledClass, false);
this.disposables.push(this.extensionsWorkbenchService.onChange(() => this.update()));
this.disposables.push(this.extensionsWorkbenchService.onChange(extension => this.update(extension)));
this.update();
}
private update(): void {
private update(extension?: IExtension): void {
if (!this.extension) {
this.enabled = false;
this.class = UpdateAction.DisabledClass;
......@@ -319,6 +327,10 @@ export class UpdateAction extends Action {
return;
}
if (extension && !areSameExtensions(this.extension, extension)) {
return;
}
if (this.extension.type !== LocalExtensionType.User) {
this.enabled = false;
this.class = UpdateAction.DisabledClass;
......@@ -915,11 +927,14 @@ export class ReloadAction extends Action {
super('extensions.reload', localize('reloadAction', "Reload"), ReloadAction.DisabledClass, false);
this.throttler = new Throttler();
this.disposables.push(this.extensionsWorkbenchService.onChange(() => this.update()));
this.disposables.push(this.extensionsWorkbenchService.onChange(extension => this.update(extension)));
this.update();
}
private update(): void {
private update(extension?: IExtension): void {
if (extension && this.extension && !areSameExtensions(this.extension, extension)) {
return;
}
this.throttler.queue(() => {
this.enabled = false;
this.tooltip = '';
......@@ -2057,11 +2072,14 @@ export class DisabledStatusLabelAction extends Action {
@IExtensionService private extensionService: IExtensionService
) {
super('extensions.install', localize('disabled', "Disabled"), `${DisabledStatusLabelAction.Class} hide`, false);
this.disposables.push(this.extensionsWorkbenchService.onChange(() => this.update()));
this.disposables.push(this.extensionsWorkbenchService.onChange((extension) => this.update(extension)));
this.update();
}
private update(): void {
private update(extension?: IExtension): void {
if (extension && this.extension && !areSameExtensions(this.extension, extension)) {
return;
}
this.throttler.queue(() => this.extensionService.getExtensions()
.then(runningExtensions => {
this.class = `${DisabledStatusLabelAction.Class} hide`;
......
......@@ -373,8 +373,8 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService,
private autoUpdateDelayer: ThrottledDelayer<void>;
private disposables: IDisposable[] = [];
private readonly _onChange: Emitter<void> = new Emitter<void>();
get onChange(): Event<void> { return this._onChange.event; }
private readonly _onChange: Emitter<IExtension | undefined> = new Emitter<IExtension | undefined>();
get onChange(): Event<IExtension | undefined> { return this._onChange.event; }
private _extensionAllowedBadgeProviders: string[];
......@@ -592,7 +592,7 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService,
.then(locals => {
extension.locals = locals;
extension.gallery = gallery;
this._onChange.fire();
this._onChange.fire(extension);
this.eventuallyAutoUpdateExtensions();
});
}
......@@ -909,18 +909,19 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService,
this.installing.push(extension);
this._onChange.fire();
this._onChange.fire(extension);
}
private onDidInstallExtension(event: DidInstallExtensionEvent): void {
const { local, zipPath, error, gallery } = event;
const installingExtension = gallery ? this.installing.filter(e => areSameExtensions(e, gallery.identifier))[0] : null;
const extension: Extension = installingExtension ? installingExtension : zipPath ? new Extension(this.galleryService, this.stateProvider, [local], null, this.telemetryService, this.logService) : null;
let extension: Extension = installingExtension ? installingExtension : zipPath ? new Extension(this.galleryService, this.stateProvider, [local], null, this.telemetryService, this.logService) : null;
if (extension) {
this.installing = installingExtension ? this.installing.filter(e => e !== installingExtension) : this.installing;
if (!error) {
const installed = this.installed.filter(e => e.id === extension.id)[0];
if (installed) {
extension = installed;
const server = this.extensionManagementServerService.getExtensionManagementServer(local.location);
const existingLocal = installed.locals.filter(l => this.extensionManagementServerService.getExtensionManagementServer(l.location).authority === server.authority)[0];
if (existingLocal) {
......@@ -936,7 +937,7 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService,
}
}
}
this._onChange.fire();
this._onChange.fire(extension);
}
private onUninstallExtension({ id }: IExtensionIdentifier): void {
......@@ -975,7 +976,7 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService,
const enablementState = this.extensionEnablementService.getEnablementState(extension.local);
if (enablementState !== extension.enablementState) {
extension.enablementState = enablementState;
this._onChange.fire();
this._onChange.fire(extension);
}
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册