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 17eb329c9e..219af9763c 100644 --- a/scm-core/src/main/java/sonia/scm/plugin/InstalledPlugin.java +++ b/scm-core/src/main/java/sonia/scm/plugin/InstalledPlugin.java @@ -127,6 +127,14 @@ public final class InstalledPlugin implements Plugin return core; } + public boolean isMarkedForUninstall() { + return markedForUninstall; + } + + public void setMarkedForUninstall(boolean markedForUninstall) { + this.markedForUninstall = markedForUninstall; + } + //~--- fields --------------------------------------------------------------- /** plugin class loader */ @@ -142,4 +150,6 @@ public final class InstalledPlugin implements Plugin private final WebResourceLoader webResourceLoader; private final boolean core; + + private boolean markedForUninstall; } 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 b550c1c00a..dd85764bc2 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java @@ -190,6 +190,7 @@ public class DefaultPluginManager implements PluginManager { doThrow().violation("plugin is a core plugin and cannot be uninstalled").when(installed.isCore()); dependencyTracker.removeInstalled(installed.getDescriptor()); + installed.setMarkedForUninstall(true); try { Files.createFile(installed.getDirectory().resolve(InstalledPlugin.UNINSTALL_MARKER_FILENAME)); diff --git a/scm-webapp/src/test/java/sonia/scm/plugin/DefaultPluginManagerTest.java b/scm-webapp/src/test/java/sonia/scm/plugin/DefaultPluginManagerTest.java index 6e2bb29dba..7e16e0fa94 100644 --- a/scm-webapp/src/test/java/sonia/scm/plugin/DefaultPluginManagerTest.java +++ b/scm-webapp/src/test/java/sonia/scm/plugin/DefaultPluginManagerTest.java @@ -345,6 +345,18 @@ class DefaultPluginManagerTest { assertThat(temp.resolve("uninstall")).exists(); } + @Test + void shouldMarkPluginForUninstall(@TempDirectory.TempDir Path temp) { + InstalledPlugin mailPlugin = createInstalled("scm-mail-plugin"); + when(mailPlugin.getDirectory()).thenReturn(temp); + + when(loader.getInstalledPlugins()).thenReturn(singletonList(mailPlugin)); + + manager.uninstall("scm-mail-plugin", false); + + verify(mailPlugin).setMarkedForUninstall(true); + } + @Test void shouldThrowExceptionWhenUninstallingCorePlugin(@TempDirectory.TempDir Path temp) { InstalledPlugin mailPlugin = createInstalled("scm-mail-plugin");