]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-9996 Don't uninstall dependent plugins if they no longer exist in the FS
authorDuarte Meneses <duarte.meneses@sonarsource.com>
Thu, 19 Oct 2017 15:37:54 +0000 (17:37 +0200)
committerGrégoire Aubert <gregoire.aubert@sonarsource.com>
Mon, 23 Oct 2017 15:01:13 +0000 (08:01 -0700)
server/sonar-server/src/main/java/org/sonar/server/plugins/ServerPluginRepository.java
server/sonar-server/src/test/java/org/sonar/server/plugins/ServerPluginRepositoryTest.java

index bd2834c84dcbe6af6b4a3a02bb8c7a142edd7fd8..f8760d3358b38a67a8335031b71576e660894463 100644 (file)
@@ -318,8 +318,8 @@ public class ServerPluginRepository implements PluginRepository, Startable {
       PluginInfo info = getPluginInfo(uninstallKey);
       try {
         LOG.info("Uninstalling plugin {} [{}]", info.getName(), info.getKey());
-        // we don't reuse info.getFile() just to be sure that file is located in from extensions/plugins
-        File masterFile = new File(fs.getInstalledPluginsDir(), info.getNonNullJarFile().getName());
+
+        File masterFile = pluginFile(info);
         moveFileToDirectory(masterFile, uninstallDir, true);
       } catch (IOException e) {
         throw new IllegalStateException(format("Fail to uninstall plugin %s [%s]", info.getName(), info.getKey()), e);
@@ -337,11 +337,14 @@ public class ServerPluginRepository implements PluginRepository, Startable {
     }
   }
 
+  /**
+   * Appends dependent plugins, only the ones that still exist in the plugins folder.
+   */
   private void appendDependentPluginKeys(String pluginKey, Set<String> appendTo) {
     for (PluginInfo otherPlugin : getPluginInfos()) {
       if (!otherPlugin.getKey().equals(pluginKey)) {
         for (PluginInfo.RequiredPlugin requirement : otherPlugin.getRequiredPlugins()) {
-          if (requirement.getKey().equals(pluginKey)) {
+          if (requirement.getKey().equals(pluginKey) && pluginFile(otherPlugin).exists()) {
             appendTo.add(otherPlugin.getKey());
             appendDependentPluginKeys(otherPlugin.getKey(), appendTo);
           }
@@ -350,6 +353,11 @@ public class ServerPluginRepository implements PluginRepository, Startable {
     }
   }
 
+  private File pluginFile(PluginInfo info) {
+    // we don't reuse info.getFile() just to be sure that file is located in from extensions/plugins
+    return new File(fs.getInstalledPluginsDir(), info.getNonNullJarFile().getName());
+  }
+
   public Map<String, PluginInfo> getPluginInfosByKeys() {
     return pluginInfosByKeys;
   }
index b77b9dc40460373df251dd56f9c159b9896a750c..1040c6813a9c92ce097f5af473463062e2b17c3f 100644 (file)
@@ -227,7 +227,7 @@ public class ServerPluginRepositoryTest {
   public void uninstall() throws Exception {
     File installedJar = copyTestPluginTo("test-base-plugin", fs.getInstalledPluginsDir());
     File uninstallDir = temp.newFolder("uninstallDir");
-    
+
     underTest.start();
     assertThat(underTest.getPluginInfosByKeys()).containsOnlyKeys("testbase");
     underTest.uninstall("testbase", uninstallDir);
@@ -252,6 +252,23 @@ public class ServerPluginRepositoryTest {
     assertThat(uninstallDir.list()).containsOnly(base.getName(), extension.getName());
   }
 
+  @Test
+  public void dont_uninstall_non_existing_dependents() throws IOException {
+    File base = copyTestPluginTo("test-base-plugin", fs.getInstalledPluginsDir());
+    File extension = copyTestPluginTo("test-require-plugin", fs.getInstalledPluginsDir());
+    File uninstallDir = temp.newFolder("uninstallDir");
+
+    underTest.start();
+    assertThat(underTest.getPluginInfos()).hasSize(2);
+    underTest.uninstall("testrequire", uninstallDir);
+    assertThat(underTest.getPluginInfos()).hasSize(2);
+
+    underTest.uninstall("testbase", uninstallDir);
+    assertThat(base).doesNotExist();
+    assertThat(extension).doesNotExist();
+    assertThat(uninstallDir.list()).containsOnly(base.getName(), extension.getName());
+  }
+
   @Test
   public void install_plugin_and_its_extension_plugins_at_startup() throws Exception {
     copyTestPluginTo("test-base-plugin", fs.getInstalledPluginsDir());