diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryExportResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryExportResource.java index c4d897db18..2ffec2cd60 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryExportResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryExportResource.java @@ -89,7 +89,7 @@ public class RepositoryExportResource { * @since 2.13.0 */ @GET - @Path("{type}") + @Path("{type: ^(?!full$)[^/]+$}") @Consumes(VndMediaType.REPOSITORY) @Operation(summary = "Exports the repository", description = "Exports the repository.", tags = "Repository") @ApiResponse( @@ -129,12 +129,11 @@ public class RepositoryExportResource { * @param uriInfo uri info * @param namespace namespace of the repository * @param name name of the repository - * @param type type of the repository * @return response with readable stream of repository dump * @since 2.13.0 */ @GET - @Path("{type}/full") + @Path("full") @Consumes(VndMediaType.REPOSITORY) @Operation(summary = "Exports the repository", description = "Exports the repository with metadata and environment information.", tags = "Repository") @ApiResponse( @@ -159,10 +158,9 @@ public class RepositoryExportResource { ) public Response exportFullRepository(@Context UriInfo uriInfo, @PathParam("namespace") String namespace, - @PathParam("name") String name, - @Pattern(regexp = "\\w{1,10}") @PathParam("type") String type + @PathParam("name") String name ) { - Repository repository = getVerifiedRepository(namespace, name, type); + Repository repository = getVerifiedRepository(namespace, name); StreamingOutput output = os -> fullScmRepositoryExporter.export(repository, os); return Response @@ -171,9 +169,14 @@ public class RepositoryExportResource { .build(); } - private Repository getVerifiedRepository(@PathParam("namespace") String namespace, @PathParam("name") String name, @PathParam("type") @Pattern(regexp = "\\w{1,10}") String type) { + private Repository getVerifiedRepository(String namespace, String name) { Repository repository = manager.get(new NamespaceAndName(namespace, name)); RepositoryPermissions.read().check(repository); + return repository; + } + + private Repository getVerifiedRepository(String namespace, String name, String type) { + Repository repository = getVerifiedRepository(namespace, name); if (!type.equals(repository.getType())) { throw new WrongTypeException(repository); diff --git a/scm-webapp/src/main/java/sonia/scm/importexport/FullScmRepositoryImporter.java b/scm-webapp/src/main/java/sonia/scm/importexport/FullScmRepositoryImporter.java index 392a0308f9..3e1870a945 100644 --- a/scm-webapp/src/main/java/sonia/scm/importexport/FullScmRepositoryImporter.java +++ b/scm-webapp/src/main/java/sonia/scm/importexport/FullScmRepositoryImporter.java @@ -109,8 +109,7 @@ public class FullScmRepositoryImporter { private Repository importRepositoryFromFile(Repository repository, TarArchiveInputStream tais) throws IOException { ArchiveEntry repositoryEntry = tais.getNextEntry(); - String repositoryEntryFileExtension = resolveFileExtensionForRepository(repository); - if (repositoryEntry.getName().endsWith(repositoryEntryFileExtension) && !repositoryEntry.isDirectory()) { + if (!repositoryEntry.isDirectory()) { return repositoryManager.create(repository, repo -> { try (RepositoryService service = serviceFactory.create(repo)) { service.getUnbundleCommand().unbundle(new NoneClosingInputStream(tais)); @@ -130,12 +129,6 @@ public class FullScmRepositoryImporter { } } - private String resolveFileExtensionForRepository(Repository repository) { - try (RepositoryService repoService = serviceFactory.create(repository)) { - return "." + repoService.getBundleCommand().getFileExtension(); - } - } - private void checkScmEnvironment(Repository repository, TarArchiveInputStream tais) throws IOException { ArchiveEntry environmentEntry = tais.getNextEntry(); if (environmentEntry.getName().equals(SCM_ENVIRONMENT_FILE_NAME) && !environmentEntry.isDirectory() && environmentEntry.getSize() < _1_MB) { diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryRootResourceTest.java index 070e852e5d..a69581e7fa 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryRootResourceTest.java @@ -775,7 +775,7 @@ public class RepositoryRootResourceTest extends RepositoryTestBase { when(service.getBundleCommand()).thenReturn(bundleCommandBuilder); MockHttpRequest request = MockHttpRequest - .get("/" + RepositoryRootResource.REPOSITORIES_PATH_V2 + "space/repo/export/svn/full"); + .get("/" + RepositoryRootResource.REPOSITORIES_PATH_V2 + "space/repo/export/full"); MockHttpResponse response = new MockHttpResponse(); dispatcher.invoke(request, response); diff --git a/scm-webapp/src/test/java/sonia/scm/importexport/FullScmRepositoryImporterTest.java b/scm-webapp/src/test/java/sonia/scm/importexport/FullScmRepositoryImporterTest.java index 97f9dd7ce1..07ef563127 100644 --- a/scm-webapp/src/test/java/sonia/scm/importexport/FullScmRepositoryImporterTest.java +++ b/scm-webapp/src/test/java/sonia/scm/importexport/FullScmRepositoryImporterTest.java @@ -60,7 +60,7 @@ import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class FullScmRepositoryImporterTest { - private static final Repository REPOSITORY = RepositoryTestData.createHeartOfGold(); + private static final Repository REPOSITORY = RepositoryTestData.createHeartOfGold("svn"); @Mock private RepositoryServiceFactory serviceFactory; @@ -105,6 +105,7 @@ class FullScmRepositoryImporterTest { void shouldImportScmRepositoryArchive() throws IOException { when(compatibilityChecker.check(any())).thenReturn(true); when(repositoryManager.create(eq(REPOSITORY), any())).thenReturn(REPOSITORY); + when(service.getBundleCommand().getFileExtension()).thenReturn("dump"); Repository repository = fullImporter.importFromStream(REPOSITORY, Resources.getResource("sonia/scm/repository/import/scm-import.tar.gz").openStream()); assertThat(repository).isEqualTo(REPOSITORY);