diff options
Diffstat (limited to 'platform/core-impl/src/com/intellij/ide/plugins/PluginManagerCore.java')
-rw-r--r-- | platform/core-impl/src/com/intellij/ide/plugins/PluginManagerCore.java | 55 |
1 files changed, 35 insertions, 20 deletions
diff --git a/platform/core-impl/src/com/intellij/ide/plugins/PluginManagerCore.java b/platform/core-impl/src/com/intellij/ide/plugins/PluginManagerCore.java index cf2d45ad4945..8f4fd771ebdd 100644 --- a/platform/core-impl/src/com/intellij/ide/plugins/PluginManagerCore.java +++ b/platform/core-impl/src/com/intellij/ide/plugins/PluginManagerCore.java @@ -25,10 +25,7 @@ import com.intellij.openapi.application.PathManager; import com.intellij.openapi.components.ExtensionAreas; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.extensions.*; -import com.intellij.openapi.util.BuildNumber; -import com.intellij.openapi.util.Comparing; -import com.intellij.openapi.util.Condition; -import com.intellij.openapi.util.JDOMUtil; +import com.intellij.openapi.util.*; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.io.StreamUtil; import com.intellij.openapi.util.io.ZipFileCache; @@ -479,8 +476,10 @@ public class PluginManagerCore { } static void prepareLoadingPluginsErrorMessage(final String errorMessage) { - if (errorMessage != null) { - if (!ApplicationManager.getApplication().isHeadlessEnvironment() && !ApplicationManager.getApplication().isUnitTestMode()) { + if (!StringUtil.isEmptyOrSpaces(errorMessage)) { + if (ApplicationManager.getApplication() != null + && !ApplicationManager.getApplication().isHeadlessEnvironment() + && !ApplicationManager.getApplication().isUnitTestMode()) { if (myPluginError == null) { myPluginError = errorMessage; } @@ -499,6 +498,7 @@ public class PluginManagerCore { } } + @Deprecated static Comparator<IdeaPluginDescriptor> getPluginDescriptorComparator(Map<PluginId, IdeaPluginDescriptorImpl> idToDescriptorMap) { final Graph<PluginId> graph = createPluginIdGraph(idToDescriptorMap); final DFSTBuilder<PluginId> builder = new DFSTBuilder<PluginId>(graph); @@ -549,6 +549,7 @@ public class PluginManagerCore { })); } + @Deprecated static IdeaPluginDescriptorImpl[] findCorePlugin(IdeaPluginDescriptorImpl[] pluginDescriptors) { for (IdeaPluginDescriptorImpl descriptor : pluginDescriptors) { if (CORE_PLUGIN_ID.equals(descriptor.getPluginId().getIdString())) { @@ -820,7 +821,7 @@ public class PluginManagerCore { message.insert(0, IdeBundle.message("error.problems.found.loading.plugins")); return message.toString(); } - return null; + return ""; } static void loadDescriptorsFromClassPath(@NotNull List<IdeaPluginDescriptorImpl> result, @Nullable StartupProgress progress) { @@ -900,14 +901,7 @@ public class PluginManagerCore { loadDescriptorsFromClassPath(result, fromSources ? progress : null); IdeaPluginDescriptorImpl[] pluginDescriptors = result.toArray(new IdeaPluginDescriptorImpl[result.size()]); - try { - Arrays.sort(pluginDescriptors, new PluginDescriptorComparator(pluginDescriptors)); - } - catch (Exception e) { - prepareLoadingPluginsErrorMessage(IdeBundle.message("error.plugins.were.not.loaded", e.getMessage())); - getLogger().info(e); - return findCorePlugin(pluginDescriptors); - } + Arrays.sort(pluginDescriptors, new PluginDescriptorComparator(pluginDescriptors)); return pluginDescriptors; } @@ -1090,12 +1084,13 @@ public class PluginManagerCore { String errorMessage = filterBadPlugins(result, disabledPluginNames); if (!brokenPluginsList.isEmpty()) { - errorMessage = "Following plugins are incompatible with current IDE build: " + StringUtil.join(brokenPluginsList, ", ") - + "<br>\n" + StringUtil.notNullize(errorMessage); + if (!StringUtil.isEmptyOrSpaces(errorMessage)) { + errorMessage += "<br>"; + } + errorMessage += "Following plugins are incompatible with current IDE build: " + StringUtil.join(brokenPluginsList, ", ") + + "<br>\n" + StringUtil.notNullize(errorMessage); } - prepareLoadingPluginsErrorMessage(errorMessage); - final Map<PluginId, IdeaPluginDescriptorImpl> idToDescriptorMap = new HashMap<PluginId, IdeaPluginDescriptorImpl>(); for (final IdeaPluginDescriptorImpl descriptor : result) { idToDescriptorMap.put(descriptor.getPluginId(), descriptor); @@ -1112,8 +1107,28 @@ public class PluginManagerCore { mergeOptionalConfigs(idToDescriptorMap); addModulesAsDependents(idToDescriptorMap); + final Graph<PluginId> graph = createPluginIdGraph(idToDescriptorMap); + final DFSTBuilder<PluginId> builder = new DFSTBuilder<PluginId>(graph); + if (!builder.isAcyclic()) { + final Couple<PluginId> circularDependency = builder.getCircularDependency(); + final PluginId id = circularDependency.getFirst(); + final PluginId parentId = circularDependency.getSecond(); + if (!StringUtil.isEmptyOrSpaces(errorMessage)) { + errorMessage += "<br>"; + } + errorMessage += IdeBundle.message("error.plugins.should.not.have.cyclic.dependencies") + id + "->" + parentId + "->...->" + id; + } + + prepareLoadingPluginsErrorMessage(errorMessage); + + final Comparator<PluginId> idComparator = builder.comparator(); // sort descriptors according to plugin dependencies - Collections.sort(result, getPluginDescriptorComparator(idToDescriptorMap)); + Collections.sort(result, new Comparator<IdeaPluginDescriptor>() { + @Override + public int compare(IdeaPluginDescriptor o1, IdeaPluginDescriptor o2) { + return idComparator.compare(o1.getPluginId(), o2.getPluginId()); + } + }); for (int i = 0; i < result.size(); i++) { ourId2Index.put(result.get(i).getPluginId(), i); |