From a38c0facac06ebc7a3efe8023aeb4e72c33eee62 Mon Sep 17 00:00:00 2001 From: Sergey Pak Date: Fri, 18 Aug 2023 17:57:37 +0200 Subject: [PATCH] IDEA-305325: handle case when plugin is incompatible with other IDE GitOrigin-RevId: 5fd7858970fc6eadd64067f4536a441186668a42 --- .../plugins/SettingsSyncPluginManager.kt | 21 ++++++++++++++-- .../SettingsSyncPluginManagerTest.kt | 25 ++++++++++++++++++- 2 files changed, 43 insertions(+), 3 deletions(-) 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 3e0ebec616d1..5b787d1f3672 100644 --- a/plugins/settings-sync/src/com/intellij/settingsSync/plugins/SettingsSyncPluginManager.kt +++ b/plugins/settings-sync/src/com/intellij/settingsSync/plugins/SettingsSyncPluginManager.kt @@ -44,13 +44,30 @@ internal class SettingsSyncPluginManager(private val cs: CoroutineScope) : Dispo val oldPlugins = lastSavedPluginsState?.plugins ?: emptyMap() val newPlugins = oldPlugins.toMutableMap() val removedPluginIds = newPlugins.keys - currentIdePluginIds + val removed2disable = arrayListOf() + val removed2ignore = arrayListOf() if (removedPluginIds.isNotEmpty()) { - LOG.info("Plugins ${removedPluginIds.joinToString()} have been deleted from disk. Will mark them as disabled in setting sync") + LOG.info("Plugins ${removedPluginIds.joinToString()} have been deleted from disk") for (pluginId in removedPluginIds) { - newPlugins.computeIfPresent(pluginId) { _, data -> PluginData(enabled = false, data.category, data.dependencies) } + val pluginData = newPlugins[pluginId] ?: continue + if (checkDependencies(pluginId, pluginData)) { + newPlugins.computeIfPresent(pluginId) { _, data -> PluginData(enabled = false, data.category, data.dependencies) } + removed2disable.add(pluginId) + } else { + removed2ignore.add(pluginId) + + } + } + if (removed2disable.isNotEmpty()) { + LOG.info("Will mark compatible plugin(s) ${removed2disable.joinToString()} as disabled in setting sync") + } + if (removed2ignore.isNotEmpty()) { + LOG.info("Plugins ${removed2ignore.joinToString()} are incompatible with current IDE/version. " + + "Won't change their sync status in plugins.json") } } + for (plugin in currentIdePlugins) { val id = plugin.pluginId if (PluginManagerProxy.getInstance().isEssential(id) diff --git a/plugins/settings-sync/tests/com/intellij/settingsSync/SettingsSyncPluginManagerTest.kt b/plugins/settings-sync/tests/com/intellij/settingsSync/SettingsSyncPluginManagerTest.kt index 3244ae1aef22..8212286f7245 100644 --- a/plugins/settings-sync/tests/com/intellij/settingsSync/SettingsSyncPluginManagerTest.kt +++ b/plugins/settings-sync/tests/com/intellij/settingsSync/SettingsSyncPluginManagerTest.kt @@ -315,7 +315,7 @@ class SettingsSyncPluginManagerTest : BasePluginManagerTest() { @Test @TestFor(issues = ["IDEA-305325"]) - fun `don't disable incompatible on start`() { + fun `don't disable incompatible existing on start`() { testPluginManager.addPluginDescriptors(git4idea, cvsOutdated.withEnabled(false)) pluginManager.updateStateFromIdeOnStart(state { cvsOutdated(enabled = true) @@ -330,6 +330,29 @@ class SettingsSyncPluginManagerTest : BasePluginManagerTest() { } } + @Test + @TestFor(issues = ["IDEA-305325"]) + fun `don't disable incompatible absent on start`() { + val weirdPlugin = TestPluginDescriptor( + "org.intellij.weird", + listOf(TestPluginDependency("com.intellij.ephemeral", isOptional = false)), + isDynamic = false + ) + testPluginManager.addPluginDescriptors( git4idea) + pluginManager.updateStateFromIdeOnStart(state { + git4idea (enabled = true) + weirdPlugin (enabled = true) + }) + + assertIdeState { + git4idea (enabled = true) + } + assertPluginManagerState { + weirdPlugin(enabled = true) + //git4idea (enabled = true) + } + } + @Test @TestFor(issues = ["IDEA-303622"]) fun `show restart required after install` (){