From 3f6337b101ecd4577f2bba60088016105dbe13b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Till-Andr=C3=A9=20Diegeler?= Date: Mon, 23 Sep 2024 15:22:26 +0200 Subject: [PATCH] Fix repository sorting order for namespaces MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously, we only compared a concatenated string in XMLRepositoryDAO.java. This caused a wrong ordering in the back-end repository list and eventually falsely displayed elements in the front-end. Example: "banana/red" (namespace "banana", name "red") "banana.venezuela/red" (namespace "banana.venezuela", name "red") On the back-end service, these were sorted as a string and thus in a wrong order "banana.venezuela/red" < "banana/red" (since '." is smaller than "/" in string comparison). Co-authored-by: Till-André Diegeler Pushed-by: Rene Pfeuffer Committed-by: Till-André Diegeler Co-authored-by: René Pfeuffer Pushed-by: Till-André Diegeler --- build.gradle | 5 +++++ gradle/changelog/pagination-sorting.yml | 2 ++ .../scm/repository/xml/XmlRepositoryDAO.java | 2 +- .../repository/xml/XmlRepositoryDAOTest.java | 18 +++++++++++++++++- 4 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 gradle/changelog/pagination-sorting.yml diff --git a/build.gradle b/build.gradle index 1a35cb6009..a3909f51eb 100644 --- a/build.gradle +++ b/build.gradle @@ -28,6 +28,7 @@ plugins { id "org.sonarqube" version "3.0" id "org.scm-manager.changelog" version "0.2.0" id 'org.scm-manager.license' version "0.7.1" + id "com.github.hierynomus.license-report" version"0.16.1" } changelog { @@ -139,6 +140,10 @@ license { } } +downloadLicenses { + dependencyConfiguration = "runtimeClasspath" +} + import org.gradle.util.VersionNumber // set build props diff --git a/gradle/changelog/pagination-sorting.yml b/gradle/changelog/pagination-sorting.yml new file mode 100644 index 0000000000..ab7aa72a03 --- /dev/null +++ b/gradle/changelog/pagination-sorting.yml @@ -0,0 +1,2 @@ +- type: fixed + description: Fix sorting error caused by some namespace/name constellations diff --git a/scm-dao-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryDAO.java b/scm-dao-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryDAO.java index 5e6f0c944e..bef3c6bcd8 100644 --- a/scm-dao-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryDAO.java +++ b/scm-dao-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryDAO.java @@ -178,7 +178,7 @@ public class XmlRepositoryDAO implements RepositoryDAO { @Override public Collection getAll() { - return withReadLockedMaps(() -> ImmutableList.copyOf(byNamespaceAndName.values().stream().sorted(Comparator.comparing(v -> v.getNamespaceAndName().toString().toLowerCase())).collect(Collectors.toList()))); + return withReadLockedMaps(() -> ImmutableList.copyOf(byNamespaceAndName.values())); } @Override diff --git a/scm-dao-xml/src/test/java/sonia/scm/repository/xml/XmlRepositoryDAOTest.java b/scm-dao-xml/src/test/java/sonia/scm/repository/xml/XmlRepositoryDAOTest.java index 657bf4b3d8..7fc74468c3 100644 --- a/scm-dao-xml/src/test/java/sonia/scm/repository/xml/XmlRepositoryDAOTest.java +++ b/scm-dao-xml/src/test/java/sonia/scm/repository/xml/XmlRepositoryDAOTest.java @@ -360,6 +360,18 @@ class XmlRepositoryDAOTest { verify(locationResolver).updateModificationDate(); } + @Test + void shouldGetAllWithCorrectSorting() { + dao.add(createRepository("banana1", "banana", "red")); + dao.add(createRepository("banana2", "banana.venezuela", "red")); + + Collection repositories = dao.getAll(); + + assertThat(repositories) + .hasSize(2) + .extracting("id").containsExactly("banana1", "banana2"); + } + private String getXmlFileContent(String id) { Path storePath = metadataFile(id); @@ -484,7 +496,11 @@ class XmlRepositoryDAOTest { Files.copy(metadataUrl.openStream(), repositoryPath.resolve("metadata.xml")); } + private Repository createRepository(String id, String namespace, String name) { + return new Repository(id, "xml", namespace, name); + } + private Repository createRepository(String id) { - return new Repository(id, "xml", "space", id); + return createRepository(id, "space", id); } }