From 7ec2b0c31d4cbed7928663f8d4c7fcbabcc99edd Mon Sep 17 00:00:00 2001 From: Rene Pfeuffer Date: Mon, 16 Sep 2019 14:27:56 +0200 Subject: [PATCH] Delete plugins marked for uninstall --- .../sonia/scm/plugin/InstalledPlugin.java | 2 ++ .../sonia/scm/lifecycle/PluginBootstrap.java | 27 ++++++++++++++++++- .../scm/plugin/DefaultPluginManager.java | 3 +-- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/scm-core/src/main/java/sonia/scm/plugin/InstalledPlugin.java b/scm-core/src/main/java/sonia/scm/plugin/InstalledPlugin.java index 80ad1da7b8..17eb329c9e 100644 --- a/scm-core/src/main/java/sonia/scm/plugin/InstalledPlugin.java +++ b/scm-core/src/main/java/sonia/scm/plugin/InstalledPlugin.java @@ -45,6 +45,8 @@ import java.nio.file.Path; public final class InstalledPlugin implements Plugin { + public static final String UNINSTALL_MARKER_FILENAME = "uninstall"; + /** * Constructs a new plugin wrapper. * @param descriptor wrapped plugin diff --git a/scm-webapp/src/main/java/sonia/scm/lifecycle/PluginBootstrap.java b/scm-webapp/src/main/java/sonia/scm/lifecycle/PluginBootstrap.java index ff8c28f51d..549c50f96d 100644 --- a/scm-webapp/src/main/java/sonia/scm/lifecycle/PluginBootstrap.java +++ b/scm-webapp/src/main/java/sonia/scm/lifecycle/PluginBootstrap.java @@ -29,6 +29,7 @@ import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; +import java.nio.file.Path; import java.util.Iterator; import java.util.List; import java.util.Set; @@ -78,12 +79,37 @@ public final class PluginBootstrap { LOG.info("core plugin extraction is disabled"); } + uninstallMarkedPlugins(pluginDirectory.toPath()); return PluginsInternal.collectPlugins(classLoaderLifeCycle, pluginDirectory.toPath()); } catch (IOException ex) { throw new PluginLoadException("could not load plugins", ex); } } + private void uninstallMarkedPlugins(Path pluginDirectory) { + try { + java.nio.file.Files.list(pluginDirectory) + .filter(java.nio.file.Files::isDirectory) + .filter(this::isMarkedForUninstall) + .forEach(this::uninstall); + } catch (IOException e) { + LOG.warn("error occurred while checking for plugins that should be uninstalled", e); + } + } + + private boolean isMarkedForUninstall(Path path) { + return java.nio.file.Files.exists(path.resolve(InstalledPlugin.UNINSTALL_MARKER_FILENAME)); + } + + private void uninstall(Path path) { + try { + LOG.info("deleting plugin directory {}", path); + IOUtil.delete(path.toFile()); + } catch (IOException e) { + LOG.warn("could not delete plugin directory {}", path, e); + } + } + private void renameOldPluginsFolder(File pluginDirectory) { if (new File(pluginDirectory, "classpath.xml").exists()) { File backupDirectory = new File(pluginDirectory.getParentFile(), "plugins.v1"); @@ -96,7 +122,6 @@ public final class PluginBootstrap { } } - private boolean isCorePluginExtractionDisabled() { return Boolean.getBoolean("sonia.scm.boot.disable-core-plugin-extraction"); } 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 e646bf6372..b550c1c00a 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java @@ -39,7 +39,6 @@ import com.google.inject.Singleton; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import sonia.scm.NotFoundException; -import sonia.scm.ScmConstraintViolationException; import sonia.scm.event.ScmEventBus; import sonia.scm.lifecycle.RestartEvent; import sonia.scm.version.Version; @@ -193,7 +192,7 @@ public class DefaultPluginManager implements PluginManager { dependencyTracker.removeInstalled(installed.getDescriptor()); try { - Files.createFile(installed.getDirectory().resolve("uninstall")); + Files.createFile(installed.getDirectory().resolve(InstalledPlugin.UNINSTALL_MARKER_FILENAME)); } catch (IOException e) { throw new PluginException("could not mark plugin " + name + " in path " + installed.getDirectory() + " for uninstall", e); }