diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/InstallFromDiskAction.java b/platform/platform-impl/src/com/intellij/ide/plugins/InstallFromDiskAction.java index 0f5b4d407555..8303899fda69 100644 --- a/platform/platform-impl/src/com/intellij/ide/plugins/InstallFromDiskAction.java +++ b/platform/platform-impl/src/com/intellij/ide/plugins/InstallFromDiskAction.java @@ -11,11 +11,13 @@ import com.intellij.openapi.actionSystem.ActionUpdateThread; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.CommonDataKeys; import com.intellij.openapi.actionSystem.Presentation; +import com.intellij.openapi.extensions.PluginId; import com.intellij.openapi.fileChooser.FileChooser; import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.updateSettings.impl.PluginUpdateSourceId; import com.intellij.openapi.vfs.StandardFileSystems; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.concurrency.annotations.RequiresEdt; @@ -28,6 +30,7 @@ import java.nio.file.Path; import java.util.Locale; import java.util.Set; import java.util.UUID; +import java.util.function.BiConsumer; import java.util.function.Consumer; @ApiStatus.Internal @@ -79,6 +82,8 @@ public class InstallFromDiskAction extends DumbAwareAction { if (myTableModel != null) { installPluginFromDisk(file, project, myTableModel, myPluginEnabler, myParentComponent, callbackData -> { onPluginInstalledFromDisk(callbackData, project); + }, (pluginId, updateSourceId) -> { + onPluginWithUpdateSourceInstalledFromDisk(pluginId, updateSourceId); }); return; } @@ -101,6 +106,8 @@ public class InstallFromDiskAction extends DumbAwareAction { try { installPluginFromDisk(chosenFile.toNioPath(), project, tableModel, myPluginEnabler, myParentComponent, callbackData -> { onPluginInstalledFromDisk(callbackData, project); + }, (pluginId, updateSourceId) -> { + onPluginWithUpdateSourceInstalledFromDisk(pluginId, updateSourceId); }); } finally { @@ -113,8 +120,9 @@ public class InstallFromDiskAction extends DumbAwareAction { @NotNull InstalledPluginsTableModel tableModel, @NotNull PluginEnabler pluginEnabler, @Nullable JComponent parentComponent, - @NotNull Consumer callback) { - doInstall(fileToSelect, project, tableModel, pluginEnabler, parentComponent, callback); + @NotNull Consumer callback, + @NotNull BiConsumer pluginUpdateSourceCallback) { + doInstall(fileToSelect, project, tableModel, pluginEnabler, parentComponent, callback, pluginUpdateSourceCallback); } private static void doInstall(@Nullable VirtualFile fileToSelect, @@ -122,7 +130,8 @@ public class InstallFromDiskAction extends DumbAwareAction { @NotNull InstalledPluginsTableModel tableModel, @NotNull PluginEnabler pluginEnabler, @Nullable JComponent parentComponent, - @NotNull Consumer callback) { + @NotNull Consumer callback, + @NotNull BiConsumer pluginUpdateSourceCallback) { if (!PluginManagementPolicy.getInstance().isInstallFromDiskAllowed()) { var message = IdeBundle.message("action.InstallFromDiskAction.not.allowed.description"); Messages.showErrorDialog(project, message, IdeBundle.message("action.InstallFromDiskAction.text")); @@ -131,7 +140,8 @@ public class InstallFromDiskAction extends DumbAwareAction { var chosenFile = chooseFile(fileToSelect, project, parentComponent); if (chosenFile != null) { - installPluginFromDisk(chosenFile.toNioPath(), project, tableModel, pluginEnabler, parentComponent, callback); + installPluginFromDisk(chosenFile.toNioPath(), project, tableModel, pluginEnabler, parentComponent, + callback, pluginUpdateSourceCallback); } } @@ -142,12 +152,13 @@ public class InstallFromDiskAction extends DumbAwareAction { @RequiresEdt private static void installPluginFromDisk(Path file, - @Nullable Project project, - @NotNull InstalledPluginsTableModel tableModel, - @NotNull PluginEnabler pluginEnabler, - @Nullable JComponent parentComponent, - @NotNull Consumer callback) { - PluginInstaller.installFromDisk(tableModel, pluginEnabler, file, project, parentComponent, callback); + @Nullable Project project, + @NotNull InstalledPluginsTableModel tableModel, + @NotNull PluginEnabler pluginEnabler, + @Nullable JComponent parentComponent, + @NotNull Consumer callback, + @NotNull BiConsumer pluginUpdateSourceCallback) { + PluginInstaller.installFromDisk(tableModel, pluginEnabler, file, project, parentComponent, callback, pluginUpdateSourceCallback); } @RequiresEdt @@ -155,6 +166,9 @@ public class InstallFromDiskAction extends DumbAwareAction { PluginInstaller.installPluginFromCallbackData(callbackData); } + protected void onPluginWithUpdateSourceInstalledFromDisk(@NotNull PluginId pluginId, @NotNull PluginUpdateSourceId updateSourceId) { + } + @RequiresEdt private static @Nullable VirtualFile chooseFile(@Nullable VirtualFile fileToSelect, @Nullable Project project, diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/PluginInstaller.kt b/platform/platform-impl/src/com/intellij/ide/plugins/PluginInstaller.kt index 6c4a34956f9f..4ce61f93177c 100644 --- a/platform/platform-impl/src/com/intellij/ide/plugins/PluginInstaller.kt +++ b/platform/platform-impl/src/com/intellij/ide/plugins/PluginInstaller.kt @@ -27,6 +27,7 @@ import com.intellij.openapi.progress.ProgressManager import com.intellij.openapi.progress.Task import com.intellij.openapi.project.Project import com.intellij.openapi.ui.ex.MessagesEx +import com.intellij.openapi.updateSettings.impl.PluginUpdateSourceId import com.intellij.openapi.util.Pair import com.intellij.openapi.util.ThrowableComputable import com.intellij.openapi.util.io.NioFiles @@ -47,6 +48,7 @@ import java.io.IOException import java.nio.file.Files import java.nio.file.Path import java.nio.file.StandardCopyOption +import java.util.function.BiConsumer import java.util.function.Consumer import javax.swing.JComponent @@ -274,6 +276,7 @@ object PluginInstaller { project: Project?, parent: JComponent?, callback: Consumer, + pluginUpdateSourceCallback: BiConsumer, ) { try { val pluginDescriptor = ProgressManager.getInstance().runProcessWithProgressSynchronously( @@ -420,6 +423,9 @@ object PluginInstaller { callback.accept(callbackData) } } + for ((pluginId, pluginUpdateSourceId) in operation.dependentPluginUpdateSourceIds) { + pluginUpdateSourceCallback.accept(pluginId, pluginUpdateSourceId) + } if (file.toString().endsWith(".zip") && keepArchive()) { val tempFile = MarketplacePluginDownloadService.getPluginTempFile() diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/PluginManagerConfigurablePanel.kt b/platform/platform-impl/src/com/intellij/ide/plugins/PluginManagerConfigurablePanel.kt index 4516546ef0c6..be97ebc4efd1 100644 --- a/platform/platform-impl/src/com/intellij/ide/plugins/PluginManagerConfigurablePanel.kt +++ b/platform/platform-impl/src/com/intellij/ide/plugins/PluginManagerConfigurablePanel.kt @@ -52,6 +52,8 @@ import com.intellij.openapi.ui.popup.JBPopup import com.intellij.openapi.ui.popup.JBPopupListener import com.intellij.openapi.ui.popup.LightweightWindowEvent import com.intellij.openapi.updateSettings.impl.PluginAutoUpdateListener +import com.intellij.openapi.updateSettings.impl.PluginUpdateSourceId +import com.intellij.openapi.updateSettings.impl.PluginUpdateSourceService import com.intellij.openapi.updateSettings.impl.UpdateOptions import com.intellij.openapi.updateSettings.impl.UpdateSettings import com.intellij.openapi.updateSettings.impl.pluginsAdvertisement.FUSEventSource @@ -651,6 +653,10 @@ class PluginManagerConfigurablePanel @RequiresEdt constructor(searchQuery: Strin } this@PluginManagerConfigurablePanel.onPluginInstalledFromDisk(callbackData) } + + override fun onPluginWithUpdateSourceInstalledFromDisk(pluginId: PluginId, updateSourceId: PluginUpdateSourceId) { + PluginUpdateSourceService.getInstance().setPluginUpdateSourceId(pluginId, updateSourceId) + } } private inner class ResetConfigurableAction : DumbAwareAction(IdeBundle.message("plugin.manager.refresh")) { diff --git a/platform/pluginManager/backend/src/com/intellij/platform/pluginManager/backend/rpc/BackendPluginInstallerApi.kt b/platform/pluginManager/backend/src/com/intellij/platform/pluginManager/backend/rpc/BackendPluginInstallerApi.kt index 1a594e69f930..a44c095eb463 100644 --- a/platform/pluginManager/backend/src/com/intellij/platform/pluginManager/backend/rpc/BackendPluginInstallerApi.kt +++ b/platform/pluginManager/backend/src/com/intellij/platform/pluginManager/backend/rpc/BackendPluginInstallerApi.kt @@ -55,9 +55,9 @@ internal class BackendPluginInstallerApi : PluginInstallerApi { return channelFlow { withContext(Dispatchers.EDT) { val project = projectId?.findProjectOrNull() - InstallFromDiskAction.installPluginFromDisk(null, project, InstalledPluginsTableModel(project), PluginEnabler.HEADLESS, null) { + InstallFromDiskAction.installPluginFromDisk(null, project, InstalledPluginsTableModel(project), PluginEnabler.HEADLESS, null, { trySend(PluginInstalledFromDiskResult(PluginDescriptorConverter.toPluginDto(it.pluginDescriptor), it.restartNeeded)) - } + }, { _, _ -> }) } } }