diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java b/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java index 9334f87822..56850758a2 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java @@ -178,22 +178,18 @@ public class DefaultPluginManager implements PluginManager { private List collectPluginsToInstall(String name) { List plugins = new ArrayList<>(); - collectPluginsToInstall(plugins, name); + collectPluginsToInstall(plugins, name, true); return plugins; } - private boolean isInstalledOrPending(String name) { - return getInstalled(name).isPresent() || getPending(name).isPresent(); - } - - private void collectPluginsToInstall(List plugins, String name) { - if (!isInstalledOrPending(name)) { + private void collectPluginsToInstall(List plugins, String name, boolean isUpdate) { + if (!isInstalledOrPending(name) || isUpdate && isUpdatable(name)) { AvailablePlugin plugin = getAvailable(name).orElseThrow(() -> NotFoundException.notFound(entity(AvailablePlugin.class, name))); Set dependencies = plugin.getDescriptor().getDependencies(); if (dependencies != null) { for (String dependency: dependencies){ - collectPluginsToInstall(plugins, dependency); + collectPluginsToInstall(plugins, dependency, false); } } @@ -202,4 +198,12 @@ public class DefaultPluginManager implements PluginManager { LOG.info("plugin {} is already installed or installation is pending, skipping installation", name); } } + + private boolean isInstalledOrPending(String name) { + return getInstalled(name).isPresent() || getPending(name).isPresent(); + } + + private boolean isUpdatable(String name) { + return getAvailable(name).isPresent() && !getPending(name).isPresent(); + } }