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

fixes #4104

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