From 3ff68f64935e8a1622bc6db90047db72f1bdf300 Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Fri, 2 Sep 2022 20:19:19 +0200 Subject: [PATCH] settings-sync: fix enabling/disabling of dynamic plugins: IDEA-301159 Use correct API. The previously used API only updates the disabled_plugins.txt which is processed only after restart, which is fine for non-dynamic plugins, but not for dynamic ones. GitOrigin-RevId: 2355b742eb0bccd1bc0953aa9451f9600b90c61a --- .../plugins/CorePluginManagerProxy.kt | 9 ++-- .../plugins/PluginManagerProxy.kt | 4 +- .../plugins/SettingsSyncPluginManager.kt | 19 ++++--- .../SettingsSyncPluginManagerTest.kt | 7 ++- .../settingsSync/TestPluginManager.kt | 54 ++++++++++++------- 5 files changed, 55 insertions(+), 38 deletions(-) diff --git a/plugins/settings-sync/src/com/intellij/settingsSync/plugins/CorePluginManagerProxy.kt b/plugins/settings-sync/src/com/intellij/settingsSync/plugins/CorePluginManagerProxy.kt index 2850db045f10..835abb56a4c6 100644 --- a/plugins/settings-sync/src/com/intellij/settingsSync/plugins/CorePluginManagerProxy.kt +++ b/plugins/settings-sync/src/com/intellij/settingsSync/plugins/CorePluginManagerProxy.kt @@ -1,6 +1,7 @@ package com.intellij.settingsSync.plugins import com.intellij.ide.plugins.DisabledPluginsState +import com.intellij.ide.plugins.PluginEnabler import com.intellij.ide.plugins.PluginManagerCore import com.intellij.openapi.Disposable import com.intellij.openapi.extensions.PluginId @@ -10,12 +11,12 @@ class CorePluginManagerProxy : PluginManagerProxy { override fun getPlugins() = PluginManagerCore.getPlugins() - override fun enablePlugin(pluginId: PluginId) { - PluginManagerCore.enablePlugin(pluginId) + override fun enablePlugins(plugins: Set) { + PluginEnabler.getInstance().enableById(plugins) } - override fun disablePlugin(pluginId: PluginId) { - PluginManagerCore.disablePlugin(pluginId) + override fun disablePlugins(plugins: Set) { + PluginEnabler.getInstance().disableById(plugins) } override fun addDisablePluginListener(disabledListener: Runnable, parentDisposable: Disposable) { diff --git a/plugins/settings-sync/src/com/intellij/settingsSync/plugins/PluginManagerProxy.kt b/plugins/settings-sync/src/com/intellij/settingsSync/plugins/PluginManagerProxy.kt index 449f3e577757..3a49d0c129a5 100644 --- a/plugins/settings-sync/src/com/intellij/settingsSync/plugins/PluginManagerProxy.kt +++ b/plugins/settings-sync/src/com/intellij/settingsSync/plugins/PluginManagerProxy.kt @@ -11,8 +11,8 @@ interface PluginManagerProxy { } fun getPlugins(): Array - fun enablePlugin(pluginId: PluginId) - fun disablePlugin(pluginId: PluginId) + fun enablePlugins(plugins: Set) + fun disablePlugins(plugins: Set) fun findPlugin(pluginId: PluginId): IdeaPluginDescriptor? fun createInstaller(): SettingsSyncPluginInstaller diff --git a/plugins/settings-sync/src/com/intellij/settingsSync/plugins/SettingsSyncPluginManager.kt b/plugins/settings-sync/src/com/intellij/settingsSync/plugins/SettingsSyncPluginManager.kt index e3b6c6347031..2e8119a9676d 100644 --- a/plugins/settings-sync/src/com/intellij/settingsSync/plugins/SettingsSyncPluginManager.kt +++ b/plugins/settings-sync/src/com/intellij/settingsSync/plugins/SettingsSyncPluginManager.kt @@ -6,6 +6,7 @@ import com.intellij.ide.plugins.PluginStateListener import com.intellij.ide.plugins.PluginStateManager import com.intellij.openapi.Disposable import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.application.runInEdt import com.intellij.openapi.components.* import com.intellij.openapi.diagnostic.logger import com.intellij.openapi.extensions.PluginId @@ -88,8 +89,8 @@ internal class SettingsSyncPluginManager : PersistentStateComponent() - val pluginsToEnable = mutableListOf() + val pluginsToDisable = mutableSetOf() + val pluginsToEnable = mutableSetOf() val pluginsToInstall = mutableListOf() synchronized(LOCK) { @@ -118,14 +119,16 @@ internal class SettingsSyncPluginManager : PersistentStateComponent @@ -183,8 +183,7 @@ class SettingsSyncPluginManagerTest : LightPlatformTestCase() { "codeflections.typengo", listOf(TestPluginDependency("com.intellij.modules.platform", false)) ) - testPluginManager.addPluginDescriptor(pluginManager, quickJump) - testPluginManager.addPluginDescriptor(pluginManager, typengo) + testPluginManager.addPluginDescriptors(pluginManager, quickJump, typengo) loadPluginManagerState(incomingPluginData) pluginManager.state.plugins["codeflections.typengo"] = SettingsSyncPluginManager.PluginData().apply { diff --git a/plugins/settings-sync/tests/com/intellij/settingsSync/TestPluginManager.kt b/plugins/settings-sync/tests/com/intellij/settingsSync/TestPluginManager.kt index b69f45f96bac..2fecc557143e 100644 --- a/plugins/settings-sync/tests/com/intellij/settingsSync/TestPluginManager.kt +++ b/plugins/settings-sync/tests/com/intellij/settingsSync/TestPluginManager.kt @@ -13,27 +13,31 @@ import java.util.concurrent.CopyOnWriteArrayList internal class TestPluginManager : PluginManagerProxy { val installer = TestPluginInstaller() private val ownPluginDescriptors = HashMap() - private val disabledPluginListeners = CopyOnWriteArrayList() + private val pluginEnabledStateListeners = CopyOnWriteArrayList() override fun getPlugins(): Array { - val descriptors = arrayListOf() - descriptors.addAll(PluginManagerCore.getPlugins()) - descriptors.addAll(ownPluginDescriptors.values) - return descriptors.toTypedArray() + return ownPluginDescriptors.values.toTypedArray() } - override fun enablePlugin(pluginId: PluginId) { - val descriptor = findPlugin(pluginId) - assert(descriptor is TestPluginDescriptor) - descriptor?.isEnabled = true + override fun enablePlugins(plugins: Set) { + for (plugin in plugins) { + val descriptor = findPlugin(plugin) + assert(descriptor is TestPluginDescriptor) + descriptor?.isEnabled = true + } + for (pluginListener in pluginEnabledStateListeners) { + pluginListener.run() + } } - override fun disablePlugin(pluginId: PluginId) { - val descriptor = findPlugin(pluginId) - assert(descriptor is TestPluginDescriptor) - descriptor?.isEnabled = false - for (disabledPluginListener in disabledPluginListeners) { - disabledPluginListener.run() + override fun disablePlugins(plugins: Set) { + for (plugin in plugins) { + val descriptor = findPlugin(plugin) + assert(descriptor is TestPluginDescriptor) + descriptor?.isEnabled = false + } + for (pluginListener in pluginEnabledStateListeners) { + pluginListener.run() } } @@ -42,9 +46,9 @@ internal class TestPluginManager : PluginManagerProxy { } override fun addDisablePluginListener(disabledListener: Runnable, parentDisposable: Disposable) { - disabledPluginListeners.add(disabledListener) + pluginEnabledStateListeners.add(disabledListener) Disposer.register(parentDisposable, Disposable { - disabledPluginListeners.remove(disabledListener) + pluginEnabledStateListeners.remove(disabledListener) }) } @@ -59,8 +63,18 @@ internal class TestPluginManager : PluginManagerProxy { return installer } - fun addPluginDescriptor(pluginManager: SettingsSyncPluginManager, descriptor: IdeaPluginDescriptor) { - ownPluginDescriptors[descriptor.pluginId] = descriptor - pluginManager.getPluginStateListener().install(descriptor) + fun addPluginDescriptors(pluginManager: SettingsSyncPluginManager, vararg descriptors: IdeaPluginDescriptor) { + for (descriptor in descriptors) { + ownPluginDescriptors[descriptor.pluginId] = descriptor + pluginManager.getPluginStateListener().install(descriptor) + } + } + + fun disablePlugin(pluginId: PluginId) { + disablePlugins(setOf(pluginId)) + } + + fun enablePlugin(pluginId: PluginId) { + enablePlugins(setOf(pluginId)) } } \ No newline at end of file