diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/PluginProcessor.java b/scm-webapp/src/main/java/sonia/scm/plugin/PluginProcessor.java index 7acf7b0546..2de00a0f58 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/PluginProcessor.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/PluginProcessor.java @@ -77,6 +77,9 @@ import javax.xml.bind.JAXBException; public final class PluginProcessor { + /** Field description */ + private static final String INSTALLEDNAME_FORMAT = "%s.%03d"; + /** Field description */ private static final String DIRECTORY_CLASSES = "classes"; @@ -640,7 +643,23 @@ public final class PluginProcessor Files.createDirectories(installedDirectory); } - Files.move(archive, installedDirectory.resolve(archive.getFileName())); + Path installed = null; + + for (int i = 0; i < 1000; i++) + { + String name = String.format(INSTALLEDNAME_FORMAT, archive.getFileName(), i); + + installed = installedDirectory.resolve(name); + + if (!Files.exists(installed)) + { + break; + } + } + + logger.debug("move installed archive to {}", installed); + + Files.move(archive, installed); } //~--- inner classes -------------------------------------------------------- diff --git a/scm-webapp/src/test/java/sonia/scm/plugin/PluginProcessorTest.java b/scm-webapp/src/test/java/sonia/scm/plugin/PluginProcessorTest.java index eaf6963e9c..694b07e54f 100644 --- a/scm-webapp/src/test/java/sonia/scm/plugin/PluginProcessorTest.java +++ b/scm-webapp/src/test/java/sonia/scm/plugin/PluginProcessorTest.java @@ -92,6 +92,16 @@ public class PluginProcessorTest new PluginResource("sonia/scm/plugin/scm-e-plugin.smp", "scm-e-plugin.smp", "sonia.scm.plugins:scm-e-plugin:1.0.0-SNAPSHOT"); + /** Field description */ + private static final PluginResource PLUGIN_F_1_0_0 = + new PluginResource("sonia/scm/plugin/scm-f-plugin-1.0.0.smp", + "scm-f-plugin.smp", "sonia.scm.plugins:scm-f-plugin:1.0.0"); + + /** Field description */ + private static final PluginResource PLUGIN_F_1_0_1 = + new PluginResource("sonia/scm/plugin/scm-f-plugin-1.0.1.smp", + "scm-f-plugin.smp", "sonia.scm.plugins:scm-f-plugin:1.0.1"); + //~--- methods -------------------------------------------------------------- /** @@ -247,6 +257,25 @@ public class PluginProcessorTest assertThat(Resources.toString(url, Charsets.UTF_8), is("hello")); } + /** + * Method description + * + * + * @throws IOException + */ + @Test + public void testUpdate() throws IOException + { + copySmp(PLUGIN_F_1_0_0); + + PluginWrapper plugin = collectAndGetFirst(); + + assertThat(plugin.getId(), is(PLUGIN_F_1_0_0.id)); + copySmp(PLUGIN_F_1_0_1); + plugin = collectAndGetFirst(); + assertThat(plugin.getId(), is(PLUGIN_F_1_0_1.id)); + } + //~--- set methods ---------------------------------------------------------- /** diff --git a/scm-webapp/src/test/resources/sonia/scm/plugin/scm-f-plugin-1.0.0.smp b/scm-webapp/src/test/resources/sonia/scm/plugin/scm-f-plugin-1.0.0.smp new file mode 100644 index 0000000000..cfcaae8427 Binary files /dev/null and b/scm-webapp/src/test/resources/sonia/scm/plugin/scm-f-plugin-1.0.0.smp differ diff --git a/scm-webapp/src/test/resources/sonia/scm/plugin/scm-f-plugin-1.0.1.smp b/scm-webapp/src/test/resources/sonia/scm/plugin/scm-f-plugin-1.0.1.smp new file mode 100644 index 0000000000..7132f78277 Binary files /dev/null and b/scm-webapp/src/test/resources/sonia/scm/plugin/scm-f-plugin-1.0.1.smp differ