]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-9333 Web service api/plugins/uninstall fails when plugin is already being unins...
authorDuarte Meneses <duarte.meneses@sonarsource.com>
Fri, 20 Oct 2017 08:32:27 +0000 (10:32 +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 f8760d3358b38a67a8335031b71576e660894463..7fb654172f904b95e2d8050631ac017ba9795a4f 100644 (file)
@@ -316,10 +316,16 @@ public class ServerPluginRepository implements PluginRepository, Startable {
 
     for (String uninstallKey : uninstallKeys) {
       PluginInfo info = getPluginInfo(uninstallKey);
+
       try {
+        if (!getPluginFile(info).exists()) {
+          LOG.info("Plugin already uninstalled: {} [{}]", info.getName(), info.getKey());
+          continue;
+        }
+
         LOG.info("Uninstalling plugin {} [{}]", info.getName(), info.getKey());
 
-        File masterFile = pluginFile(info);
+        File masterFile = getPluginFile(info);
         moveFileToDirectory(masterFile, uninstallDir, true);
       } catch (IOException e) {
         throw new IllegalStateException(format("Fail to uninstall plugin %s [%s]", info.getName(), info.getKey()), e);
@@ -344,7 +350,7 @@ public class ServerPluginRepository implements PluginRepository, Startable {
     for (PluginInfo otherPlugin : getPluginInfos()) {
       if (!otherPlugin.getKey().equals(pluginKey)) {
         for (PluginInfo.RequiredPlugin requirement : otherPlugin.getRequiredPlugins()) {
-          if (requirement.getKey().equals(pluginKey) && pluginFile(otherPlugin).exists()) {
+          if (requirement.getKey().equals(pluginKey)) {
             appendTo.add(otherPlugin.getKey());
             appendDependentPluginKeys(otherPlugin.getKey(), appendTo);
           }
@@ -353,7 +359,7 @@ public class ServerPluginRepository implements PluginRepository, Startable {
     }
   }
 
-  private File pluginFile(PluginInfo info) {
+  private File getPluginFile(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());
   }
index 1040c6813a9c92ce097f5af473463062e2b17c3f..df94b6e5d5d3e4dd5e9a40674094b077ea822c95 100644 (file)
@@ -269,6 +269,23 @@ public class ServerPluginRepositoryTest {
     assertThat(uninstallDir.list()).containsOnly(base.getName(), extension.getName());
   }
 
+  @Test
+  public void dont_uninstall_non_existing_files() 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("testbase", 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());