diff --git a/src/commons.ts b/src/commons.ts index 7f5ab4ce..0c13dacc 100644 --- a/src/commons.ts +++ b/src/commons.ts @@ -441,6 +441,7 @@ export default class Commons { files: File[], removedExtensions: ExtensionInformation[], addedExtensions: ExtensionInformation[], + failedToAddExtensions: ExtensionInformation[], ignoredExtensions: ExtensionInformation[], syncSettings: LocalConfig ) { @@ -524,6 +525,19 @@ export default class Commons { }); } + if (failedToAddExtensions) { + outputChannel.appendLine(``); + outputChannel.appendLine(`Extensions Failed to be Added:`); + + if (addedExtensions.length === 0) { + outputChannel.appendLine(` No extensions failed to add.`); + } + + failedToAddExtensions.forEach(extn => { + outputChannel.appendLine(` ${extn.name} v${extn.version}`); + }); + } + outputChannel.appendLine(`--------------------`); outputChannel.append(`Done.`); outputChannel.show(true); diff --git a/src/service/plugin.service.ts b/src/service/plugin.service.ts index 12abe312..eedc36a2 100644 --- a/src/service/plugin.service.ts +++ b/src/service/plugin.service.ts @@ -75,6 +75,16 @@ export class ExtensionMetadata { ) {} } +export interface ExtensionsInstallInfo { + addedExtensions: ExtensionInformation[]; + failedToAddExtensions: ExtensionInformation[]; +} + +export const getDefaultExtensionsInstallInfo = (): ExtensionsInstallInfo => ({ + addedExtensions: [], + failedToAddExtensions: [], +}); + export class PluginService { public static GetMissingExtensions( remoteExt: string, @@ -190,28 +200,28 @@ export class PluginService { extensions: string, ignoredExtensions: string[], notificationCallBack: (...data: any[]) => void - ): Promise { - let addedExtensions: ExtensionInformation[] = []; + ): Promise { const missingExtensions = PluginService.GetMissingExtensions( extensions, ignoredExtensions ); if (missingExtensions.length === 0) { notificationCallBack("Sync : No Extensions needs to be installed."); - return []; + return getDefaultExtensionsInstallInfo(); } - addedExtensions = await PluginService.InstallWithAPI( + const installInfo: ExtensionsInstallInfo = await PluginService.InstallWithAPI( missingExtensions, notificationCallBack ); - return addedExtensions; + return installInfo; } public static async InstallWithAPI( missingExtensions: ExtensionInformation[], notificationCallBack: (...data: any[]) => void - ): Promise { + ): Promise { const addedExtensions: ExtensionInformation[] = []; + const failedToAddExtensions: ExtensionInformation[] = []; const missingExtensionsCount = missingExtensions.length; notificationCallBack("TOTAL EXTENSIONS : " + missingExtensionsCount); notificationCallBack(""); @@ -221,23 +231,37 @@ export class PluginService { try { notificationCallBack(""); notificationCallBack(`[x] - EXTENSION: ${ext.name} - INSTALLING`); - await vscode.commands.executeCommand( - "workbench.extensions.installExtension", - name - ); - notificationCallBack(""); - notificationCallBack(`[x] - EXTENSION: ${ext.name} INSTALLED.`); - notificationCallBack( - ` ${missingExtensions.indexOf(ext) + - 1} OF ${missingExtensionsCount} INSTALLED`, - true - ); - notificationCallBack(""); - addedExtensions.push(ext); + + let success = true; + try { + await vscode.commands.executeCommand( + "workbench.extensions.installExtension", + name + ); + } catch (err) { + notificationCallBack(""); + notificationCallBack(`[x] - EXTENSION: ${ext.name} FAILED TO INSTALL:`); + notificationCallBack(err); + + success = false; + failedToAddExtensions.push(ext); + } + + if (success) { + notificationCallBack(""); + notificationCallBack(`[x] - EXTENSION: ${ext.name} INSTALLED.`); + notificationCallBack( + ` ${missingExtensions.indexOf(ext) + + 1} OF ${missingExtensionsCount} INSTALLED`, + true + ); + notificationCallBack(""); + addedExtensions.push(ext); + } } catch (err) { throw new Error(err); } } - return addedExtensions; + return { addedExtensions, failedToAddExtensions }; } } diff --git a/src/sync.ts b/src/sync.ts index 3e926481..96f982f4 100644 --- a/src/sync.ts +++ b/src/sync.ts @@ -399,6 +399,7 @@ export class Sync { allSettingFiles, null, uploadedExtensions, + null, ignoredExtensions, localConfig ); @@ -466,6 +467,7 @@ export class Sync { } let addedExtensions: ExtensionInformation[] = []; + let failedToAddExtensions: ExtensionInformation[] = []; let deletedExtensions: ExtensionInformation[] = []; const ignoredExtensions: string[] = customSettings.ignoreExtensions || new Array(); @@ -603,7 +605,7 @@ export class Sync { Commons.outputChannel.show(); } - addedExtensions = await PluginService.InstallExtensions( + ({ addedExtensions, failedToAddExtensions } = await PluginService.InstallExtensions( content, ignoredExtensions, (message: string, dispose: boolean) => { @@ -619,7 +621,7 @@ export class Sync { } } } - ); + )); } catch (err) { throw new Error(err); } @@ -702,6 +704,7 @@ export class Sync { updatedFiles, deletedExtensions, addedExtensions, + failedToAddExtensions, null, localSettings );