void (@NotNull ObsoleteVcs vcs) { new Task.Backgroundable(myProject, VcsBundle.message("impl.progress.title.installing.plugin")) { @RequiresBackgroundThread @Override public void run(@NotNull ProgressIndicator indicator) { try { PluginNode descriptor = MarketplaceRequests.getInstance().getLastCompatiblePluginUpdate(vcs.pluginId, null, indicator); if (descriptor != null) { PluginDownloader downloader = PluginDownloader.createDownloader(descriptor); if (downloader.prepareToInstall(indicator)) { downloader.install(); PluginEnabler.HEADLESS.enable(List.of(descriptor)); PluginManagerMain.notifyPluginsUpdated(myProject); } } else { showErrorNotification(vcs, VcsBundle.message("impl.notification.content.could.not.find.plugin", vcs.pluginId)); } } catch (IOException e) { LOG.warn(e); showErrorNotification(vcs, e.getMessage()); } } private void showErrorNotification(@NotNull ObsoleteVcs vcs, @NotNull @NlsContexts.NotificationContent String message) { String title = VcsBundle.message("impl.notification.title.failed.to.install.plugin"); Notification notification = IMPORTANT_ERROR_NOTIFICATION .createNotification(title, message, NotificationType.ERROR) .setDisplayId(VcsNotificationIdsHolder.SUGGESTED_PLUGIN_INSTALL_FAILED) .addAction( NotificationAction.createSimple(VcsBundle.messagePointer("action.NotificationAction.AllVcses.text.open.plugin.page"), () -> { BrowserUtil.browse(vcs.pluginUrl); })); VcsNotifier.getInstance(myProject).notify(notification); } }.queue(); }