提交 278ee8b0 编写于 作者: J Joao Moreno

fixes #4104

上级 4bb904c6
......@@ -12,6 +12,7 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
import { IMessageService } from 'vs/platform/message/common/message';
import { ReloadWindowAction } from 'vs/workbench/electron-browser/actions';
import { IExtensionsService, IExtension } from 'vs/workbench/parts/extensions/common/extensions';
import { extensionEquals } from 'vs/workbench/parts/extensions/common/extensionsUtil';
import { IQuickOpenService } from 'vs/workbench/services/quickopen/common/quickOpenService';
export class ListExtensionsAction extends Action {
......@@ -122,15 +123,19 @@ export class InstallAction extends Action {
public run(extension: IExtension): TPromise<any> {
this.enabled = false;
return this.extensionsService
.install(extension)
.then(() => this.onSuccess(extension), err => this.onError(err, extension))
.then(() => this.enabled = true)
.then(() => null);
return this.extensionsService.getInstalled()
.then(installed => installed.some(e => extensionEquals(e, extension)))
.then(isUpdate => {
return this.extensionsService
.install(extension)
.then(() => this.onSuccess(extension, isUpdate), err => this.onError(err, extension, isUpdate))
.then(() => this.enabled = true)
.then(() => null);
});
}
private onSuccess(extension: IExtension) {
this.reportTelemetry(extension, true);
private onSuccess(extension: IExtension, isUpdate: boolean) {
this.reportTelemetry(extension, isUpdate, true);
this.messageService.show(
Severity.Info,
{
......@@ -140,20 +145,23 @@ export class InstallAction extends Action {
);
}
private onError(err: Error, extension: IExtension) {
this.reportTelemetry(extension, false);
private onError(err: Error, extension: IExtension, isUpdate: boolean) {
this.reportTelemetry(extension, isUpdate, false);
this.messageService.show(Severity.Error, err);
}
private reportTelemetry(extension: IExtension, success: boolean) {
this.telemetryService.publicLog('extensionGallery:install', {
private reportTelemetry(extension: IExtension, isUpdate: boolean, success: boolean) {
const event = isUpdate ? 'extensionGallery:update' : 'extensionGallery:install';
const data = {
success,
id: extension.galleryInformation ? extension.galleryInformation.id : null,
name: extension.name,
publisherId: extension.galleryInformation ? extension.galleryInformation.publisherId : null,
publisherName: extension.publisher,
publisherDisplayName: extension.galleryInformation ? extension.galleryInformation.publisherDisplayName : null
});
};
this.telemetryService.publicLog(event, data);
}
}
......
......@@ -85,7 +85,7 @@ function getExtensionId(extension: IExtensionManifest, version = extension.versi
export class ExtensionsService implements IExtensionsService {
public serviceId = IExtensionsService;
serviceId = IExtensionsService;
private extensionsPath: string;
private obsoletePath: string;
......@@ -112,9 +112,9 @@ export class ExtensionsService implements IExtensionsService {
this.obsoleteFileLimiter = new Limiter(1);
}
public install(extension: IExtension): TPromise<IExtension>;
public install(zipPath: string): TPromise<IExtension>;
public install(arg: any): TPromise<IExtension> {
install(extension: IExtension): TPromise<IExtension>;
install(zipPath: string): TPromise<IExtension>;
install(arg: any): TPromise<IExtension> {
if (types.isString(arg)) {
return this.installFromZip(arg);
}
......@@ -184,7 +184,7 @@ export class ExtensionsService implements IExtensionsService {
});
}
public uninstall(extension: IExtension): TPromise<void> {
uninstall(extension: IExtension): TPromise<void> {
const extensionPath = extension.path || path.join(this.extensionsPath, getExtensionId(extension));
return pfs.exists(extensionPath)
......@@ -196,7 +196,7 @@ export class ExtensionsService implements IExtensionsService {
.then(() => this._onDidUninstallExtension.fire(extension));
}
public getInstalled(includeDuplicateVersions: boolean = false): TPromise<IExtension[]> {
getInstalled(includeDuplicateVersions: boolean = false): TPromise<IExtension[]> {
const all = this.getAllInstalled();
if (includeDuplicateVersions) {
......@@ -230,16 +230,9 @@ export class ExtensionsService implements IExtensionsService {
});
}
public removeDeprecatedExtensions(): TPromise<void> {
const outdated = this.getAllInstalled()
.then(plugins => {
const byId = values(groupBy(plugins, p => `${ p.publisher }.${ p.name }`));
const extensions = flatten(byId.map(p => p.sort((a, b) => semver.rcompare(a.version, b.version)).slice(1)));
return extensions
.filter(e => !!e.path)
.map(e => getExtensionId(e));
});
removeDeprecatedExtensions(): TPromise<void> {
const outdated = this.getOutdatedExtensions()
.then(extensions => extensions.map(e => getExtensionId(e)));
const obsolete = this.getObsoleteExtensions()
.then(obsolete => Object.keys(obsolete));
......@@ -249,26 +242,36 @@ export class ExtensionsService implements IExtensionsService {
.then<void>(extensionsIds => {
return TPromise.join(extensionsIds.map(id => {
return pfs.rimraf(path.join(this.extensionsPath, id))
.then(() => this.doUpdateObsoleteExtensions(obsolete => delete obsolete[id]));
.then(() => this.withObsoleteExtensions(obsolete => delete obsolete[id]));
}));
});
}
private getOutdatedExtensions(): TPromise<IExtension[]> {
return this.getAllInstalled().then(plugins => {
const byId = values(groupBy(plugins, p => `${ p.publisher }.${ p.name }`));
const extensions = flatten(byId.map(p => p.sort((a, b) => semver.rcompare(a.version, b.version)).slice(1)));
return extensions
.filter(e => !!e.path);
});
}
private setObsolete(extension: IExtension): TPromise<void> {
const id = getExtensionId(extension);
return this.doUpdateObsoleteExtensions(obsolete => assign(obsolete, { [id]: true }));
return this.withObsoleteExtensions(obsolete => assign(obsolete, { [id]: true }));
}
private unsetObsolete(extension: IExtension): TPromise<void> {
const id = getExtensionId(extension);
return this.doUpdateObsoleteExtensions<void>(obsolete => delete obsolete[id]);
return this.withObsoleteExtensions<void>(obsolete => delete obsolete[id]);
}
private getObsoleteExtensions(): TPromise<{ [id:string]: boolean; }> {
return this.doUpdateObsoleteExtensions(obsolete => obsolete);
return this.withObsoleteExtensions(obsolete => obsolete);
}
private doUpdateObsoleteExtensions<T>(fn: (obsolete: { [id:string]: boolean; }) => T): TPromise<T> {
private withObsoleteExtensions<T>(fn: (obsolete: { [id:string]: boolean; }) => T): TPromise<T> {
return this.obsoleteFileLimiter.queue(() => {
let result: T = null;
return pfs.readFile(this.obsoletePath, 'utf8')
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册