From e3eb8a99d0af377752d029f79c03101a57b76aae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Thu, 2 Jul 2020 12:08:23 +0200 Subject: [PATCH 1/5] Update required plugins if available When plugins are updated, we should update required plugins, too, so that we do not get errors when new plugins use features not available in the old versions of required plugins. --- CHANGELOG.md | 1 + scm-ui/ui-webapp/public/locales/de/admin.json | 2 +- scm-ui/ui-webapp/public/locales/en/admin.json | 2 +- .../sonia/scm/plugin/DefaultPluginManager.java | 8 ++++---- .../scm/plugin/DefaultPluginManagerTest.java | 18 +++++++++++++++++- .../sonia/scm/plugin/PluginTestHelper.java | 13 +++++++------ 6 files changed, 31 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 507c488740..13daae0847 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Checkboxes can now be 'indeterminate' ([#1215](https://github.com/scm-manager/scm-manager/pull/1215)) - The old frontend extension point `changeset.description` is deprecated and should be replaced with `changeset.description.tokens` ([#1231](https://github.com/scm-manager/scm-manager/pull/1231)) +- Required plugins will be updated, too, when a plugin is updated ([#1233](https://github.com/scm-manager/scm-manager/pull/1233)) ### Fixed - Fixed installation of debian packages on distros without preinstalled `at` ([#1216](https://github.com/scm-manager/scm-manager/issues/1216) and [#1217](https://github.com/scm-manager/scm-manager/pull/1217)) diff --git a/scm-ui/ui-webapp/public/locales/de/admin.json b/scm-ui/ui-webapp/public/locales/de/admin.json index 62ba36bd69..db096832eb 100644 --- a/scm-ui/ui-webapp/public/locales/de/admin.json +++ b/scm-ui/ui-webapp/public/locales/de/admin.json @@ -61,7 +61,7 @@ "version": "Version", "currentVersion": "Installierte Version", "newVersion": "Neue Version", - "dependencyNotification": "Mit diesem Plugin werden folgende Abhängigkeiten mit installiert, wenn sie noch nicht vorhanden sind!", + "dependencyNotification": "Mit diesem Plugin werden folgende Abhängigkeiten mit installiert bzw. aktualisiert, wenn sie noch nicht in der aktuellen Version vorhanden sind!", "dependencies": "Abhängigkeiten", "installedNotification": "Das Plugin wurde erfolgreich installiert. Um Änderungen an der UI zu sehen, muss die Seite neu geladen werden:", "updatedNotification": "Das Plugin wurde erfolgreich aktualisiert. Um Änderungen an der UI zu sehen, muss die Seite neu geladen werden:", diff --git a/scm-ui/ui-webapp/public/locales/en/admin.json b/scm-ui/ui-webapp/public/locales/en/admin.json index 7afad7829e..829aecf3d4 100644 --- a/scm-ui/ui-webapp/public/locales/en/admin.json +++ b/scm-ui/ui-webapp/public/locales/en/admin.json @@ -61,7 +61,7 @@ "version": "Version", "currentVersion": "Installed version", "newVersion": "New version", - "dependencyNotification": "With this plugin, the following dependencies will be installed if they are not available yet!", + "dependencyNotification": "With this plugin, the following dependencies will be installed/updated if their latest versions are not installed yet!", "dependencies": "Dependencies", "installedNotification": "Successfully installed plugin. You have to reload the page, to see ui changes:", "updatedNotification": "Successfully updated plugin. You have to reload the page, to see ui changes:", 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 9acd07641e..ef1f4e6873 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java @@ -247,18 +247,18 @@ public class DefaultPluginManager implements PluginManager { private List collectPluginsToInstall(String name) { List plugins = new ArrayList<>(); - collectPluginsToInstall(plugins, name, true); + collectPluginsToInstallOrUpdate(plugins, name); return plugins; } - private void collectPluginsToInstall(List plugins, String name, boolean isUpdate) { - if (!isInstalledOrPending(name) || isUpdate && isUpdatable(name)) { + private void collectPluginsToInstallOrUpdate(List plugins, String name) { + if (!isInstalledOrPending(name) || isUpdatable(name)) { AvailablePlugin plugin = getAvailable(name).orElseThrow(() -> NotFoundException.notFound(entity(AvailablePlugin.class, name))); Set dependencies = plugin.getDescriptor().getDependencies(); if (dependencies != null) { for (String dependency : dependencies) { - collectPluginsToInstall(plugins, dependency, false); + collectPluginsToInstallOrUpdate(plugins, dependency); } } 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 afb7c4eea1..b1b1db9efe 100644 --- a/scm-webapp/src/test/java/sonia/scm/plugin/DefaultPluginManagerTest.java +++ b/scm-webapp/src/test/java/sonia/scm/plugin/DefaultPluginManagerTest.java @@ -227,7 +227,7 @@ class DefaultPluginManagerTest { } @Test - void shouldNotInstallAlreadyInstalledDependencies() { + void shouldNotInstallAlreadyInstalledDependenciesWhenUpToDate() { AvailablePlugin review = createAvailable("scm-review-plugin"); when(review.getDescriptor().getDependencies()).thenReturn(ImmutableSet.of("scm-mail-plugin")); AvailablePlugin mail = createAvailable("scm-mail-plugin"); @@ -244,6 +244,22 @@ class DefaultPluginManagerTest { assertThat(captor.getValue().getDescriptor().getInformation().getName()).isEqualTo("scm-review-plugin"); } + @Test + void shouldUpdateAlreadyInstalledDependenciesWhenNewerVersionIsAvailable() { + AvailablePlugin review = createAvailable("scm-review-plugin"); + when(review.getDescriptor().getDependencies()).thenReturn(ImmutableSet.of("scm-mail-plugin")); + AvailablePlugin mail = createAvailable("scm-mail-plugin", "1.1.0"); + when(center.getAvailable()).thenReturn(ImmutableSet.of(review, mail)); + + InstalledPlugin installedMail = createInstalled("scm-mail-plugin", "1.0.0"); + when(loader.getInstalledPlugins()).thenReturn(ImmutableList.of(installedMail)); + + manager.install("scm-review-plugin", false); + + verify(installer).install(mail); + verify(installer).install(review); + } + @Test void shouldRollbackOnFailedInstallation() { AvailablePlugin review = createAvailable("scm-review-plugin"); diff --git a/scm-webapp/src/test/java/sonia/scm/plugin/PluginTestHelper.java b/scm-webapp/src/test/java/sonia/scm/plugin/PluginTestHelper.java index 1b19c4ef15..548888d6df 100644 --- a/scm-webapp/src/test/java/sonia/scm/plugin/PluginTestHelper.java +++ b/scm-webapp/src/test/java/sonia/scm/plugin/PluginTestHelper.java @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.plugin; import org.mockito.Answers; @@ -32,10 +32,7 @@ import static org.mockito.Mockito.when; public class PluginTestHelper { public static AvailablePlugin createAvailable(String name) { - PluginInformation information = new PluginInformation(); - information.setName(name); - information.setVersion("1.0"); - return createAvailable(information); + return createAvailable(name, "1.0"); } public static AvailablePlugin createAvailable(String name, String version) { @@ -46,9 +43,13 @@ public class PluginTestHelper { } public static InstalledPlugin createInstalled(String name) { + return createInstalled(name, "1.0"); + } + + public static InstalledPlugin createInstalled(String name, String version) { PluginInformation information = new PluginInformation(); information.setName(name); - information.setVersion("1.0"); + information.setVersion(version); return createInstalled(information); } From b8d2ecfb49df1c057368a0c6ec6e513456f6ea34 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Fri, 3 Jul 2020 09:08:49 +0200 Subject: [PATCH 2/5] fixes missing content type on migration wizard --- CHANGELOG.md | 1 + .../src/main/java/sonia/scm/update/MigrationWizardServlet.java | 3 +++ 2 files changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 507c488740..a6cec18a7a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added missing architecture to debian installation documentation ([#1230](https://github.com/scm-manager/scm-manager/pull/1230)) - Mercurial on Python 3 ([#1232](https://github.com/scm-manager/scm-manager/pull/1232)) - Fixed wrong package information for deb and rpm packages ([#1229](https://github.com/scm-manager/scm-manager/pull/1229)) +- Fixed missing content type on migration wizard ## [2.1.1] - 2020-06-23 ### Fixed diff --git a/scm-webapp/src/main/java/sonia/scm/update/MigrationWizardServlet.java b/scm-webapp/src/main/java/sonia/scm/update/MigrationWizardServlet.java index 99833c57cc..f999d34c2c 100644 --- a/scm-webapp/src/main/java/sonia/scm/update/MigrationWizardServlet.java +++ b/scm-webapp/src/main/java/sonia/scm/update/MigrationWizardServlet.java @@ -173,6 +173,9 @@ class MigrationWizardServlet extends HttpServlet { MustacheFactory mf = new DefaultMustacheFactory(); Mustache template = mf.compile(templateName); + resp.setContentType("text/html"); + resp.setCharacterEncoding("UTF-8"); + PrintWriter writer; try { writer = resp.getWriter(); From aaba45c8d4c3bf8ee0e9a490cfcce2ed55ca87a1 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Fri, 3 Jul 2020 09:09:39 +0200 Subject: [PATCH 3/5] removes unused imports --- .../src/main/java/sonia/scm/update/MigrationWizardServlet.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/scm-webapp/src/main/java/sonia/scm/update/MigrationWizardServlet.java b/scm-webapp/src/main/java/sonia/scm/update/MigrationWizardServlet.java index f999d34c2c..0504a62c59 100644 --- a/scm-webapp/src/main/java/sonia/scm/update/MigrationWizardServlet.java +++ b/scm-webapp/src/main/java/sonia/scm/update/MigrationWizardServlet.java @@ -34,8 +34,6 @@ import org.apache.shiro.subject.Subject; import org.apache.shiro.util.ThreadContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import sonia.scm.event.ScmEventBus; -import sonia.scm.lifecycle.RestartEvent; import sonia.scm.lifecycle.Restarter; import sonia.scm.update.repository.DefaultMigrationStrategyDAO; import sonia.scm.update.repository.MigrationStrategy; From 59a68982a5ea231b8c380a805ebfdb0f72b96d1b Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Fri, 3 Jul 2020 09:12:51 +0200 Subject: [PATCH 4/5] adds pr link to changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a6cec18a7a..0f1ff1f982 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,7 +23,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added missing architecture to debian installation documentation ([#1230](https://github.com/scm-manager/scm-manager/pull/1230)) - Mercurial on Python 3 ([#1232](https://github.com/scm-manager/scm-manager/pull/1232)) - Fixed wrong package information for deb and rpm packages ([#1229](https://github.com/scm-manager/scm-manager/pull/1229)) -- Fixed missing content type on migration wizard +- Fixed missing content type on migration wizard ([#1234](https://github.com/scm-manager/scm-manager/pull/1234)) ## [2.1.1] - 2020-06-23 ### Fixed From 48a3bfd41610c8d5c363356a1f0c4c7114e0f786 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Fri, 3 Jul 2020 10:18:25 +0200 Subject: [PATCH 5/5] Fix assumption Sonar says: AssertJ assertions allMatch and doesNotContains on an empty list always returns true whatever the content of the predicate. Despite being correct, you should make explicit if you expect an empty list or not, by adding isEmpty()/isNotEmpty() before calling the assertion. It will justify the useless predicate to improve clarity or increase the reliability of the test. --- .../java/sonia/scm/api/v2/resources/IndexResourceTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/IndexResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/IndexResourceTest.java index e7b654e7ee..a0876db37a 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/IndexResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/IndexResourceTest.java @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.api.v2.resources; import com.github.sdorra.shiro.ShiroRule; @@ -166,7 +166,7 @@ public class IndexResourceTest { Assertions.assertThat(index.getLinks().getLinksBy("autocomplete")) .extracting("name") - .doesNotContainSequence("users", "groups"); + .isEmpty(); } @Test