From 8d96c5fdd2dc0c98115ebac4df31e0ce47ec83ab Mon Sep 17 00:00:00 2001 From: Eduard Heimbuch Date: Fri, 27 Nov 2020 15:00:35 +0100 Subject: [PATCH] fix event handling on repository import --- .../resources/RepositoryImportResource.java | 38 +++------------- .../resources/RepositoryRootResourceTest.java | 44 +++++++++---------- 2 files changed, 27 insertions(+), 55 deletions(-) diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryImportResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryImportResource.java index f8e91066f7..8cc0e500ba 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryImportResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryImportResource.java @@ -235,10 +235,14 @@ public class RepositoryImportResource { } pullCommand.pull(request.getUrl()); - eventBus.post(new RepositoryImportEvent(HandlerEventType.CREATE, repository, false)); } catch (IOException e) { + eventBus.post(new RepositoryImportEvent(HandlerEventType.MODIFY, repository, true)); throw new InternalRepositoryException(repository, "Failed to import from remote url", e); + } catch (Exception e) { + eventBus.post(new RepositoryImportEvent(HandlerEventType.MODIFY, repository, true)); + throw e; } + eventBus.post(new RepositoryImportEvent(HandlerEventType.MODIFY, repository, false)); }; } @@ -471,38 +475,6 @@ public class RepositoryImportResource { // // return types; // } - - /** - * Handle creation failures. - * - * @param ex exception - * @param type repository type - * @param name name of the repository - */ - private void handleGenericCreationFailure(Exception ex, String type, - String name) { - logger.error(String.format("could not create repository %s with type %s", - type, name), ex); - - throw new WebApplicationException(ex); - } - - /** - * Handle import failures. - * - * @param ex exception - * @param repository repository - */ - private void handleImportFailure(Exception ex, Repository repository) { - logger.error("import for repository failed, delete repository", ex); - - try { - eventBus.post(new RepositoryImportEvent(HandlerEventType.BEFORE_DELETE, repository, true)); - } catch (InternalRepositoryException | NotFoundException e) { - logger.error("can not delete repository after import failure", e); - } - } - // /** // * Import repositories from a specific type. // * 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 ea8288bc97..8b7dee5eab 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 @@ -83,10 +83,12 @@ import static javax.servlet.http.HttpServletResponse.SC_OK; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyMap; import static org.mockito.ArgumentMatchers.anyObject; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.RETURNS_SELF; import static org.mockito.Mockito.doReturn; @@ -482,26 +484,6 @@ public class RepositoryRootResourceTest extends RepositoryTestBase { assertEquals(SC_CREATED, response.getStatus()); } - @Test - public void shouldImportRepositoryFromUrlWithCredentials() throws URISyntaxException, IOException { - when(manager.getHandler("git")).thenReturn(repositoryHandler); - when(repositoryHandler.getType()).thenReturn(new RepositoryType("git", "git", ImmutableSet.of(Command.PULL))); - when(manager.create(any(Repository.class), any())).thenReturn(RepositoryTestData.create42Puzzle()); - - URL url = Resources.getResource("sonia/scm/api/v2/import-repo-with-credentials.json"); - byte[] importRequest = Resources.toByteArray(url); - - MockHttpRequest request = MockHttpRequest - .post("/" + RepositoryRootResource.REPOSITORIES_PATH_V2 + "import/git/url") - .contentType(VndMediaType.REPOSITORY) - .content(importRequest); - MockHttpResponse response = new MockHttpResponse(); - - dispatcher.invoke(request, response); - - assertEquals(SC_CREATED, response.getStatus()); - } - @Test public void shouldFailOnImportRepositoryFromUrl() throws URISyntaxException, IOException { when(manager.getHandler("git")).thenReturn(repositoryHandler); @@ -536,7 +518,7 @@ public class RepositoryRootResourceTest extends RepositoryTestBase { Consumer repositoryConsumer = repositoryImportResource.pullChangesFromRemoteUrl(repositoryImportDto); repositoryConsumer.accept(repository); - verify(eventBus).post(new RepositoryImportEvent(HandlerEventType.CREATE, repository, false)); + verify(eventBus).post(new RepositoryImportEvent(HandlerEventType.MODIFY, repository, false)); } @Test @@ -557,7 +539,25 @@ public class RepositoryRootResourceTest extends RepositoryTestBase { verify(pullCommandBuilder).withUsername("trillian"); verify(pullCommandBuilder).withPassword("secret"); - verify(eventBus).post(new RepositoryImportEvent(HandlerEventType.CREATE, repository, false)); + verify(eventBus).post(new RepositoryImportEvent(HandlerEventType.MODIFY, repository, false)); + } + + @Test + public void shouldThrowImportFailedEvent() throws IOException { + PullCommandBuilder pullCommandBuilder = mock(PullCommandBuilder.class, RETURNS_SELF); + when(service.getPullCommand()).thenReturn(pullCommandBuilder); + doThrow(ImportFailedException.class).when(pullCommandBuilder).pull(anyString()); + + Repository repository = RepositoryTestData.createHeartOfGold(); + RepositoryImportResource.RepositoryImportDto repositoryImportDto = new RepositoryImportResource.RepositoryImportDto(); + repositoryImportDto.setUrl("https://scm-manager.org/scm/repo/scmadmin/scm-manager.git"); + repositoryImportDto.setNamespace("scmadmin"); + repositoryImportDto.setName("scm-manager"); + + Consumer repositoryConsumer = repositoryImportResource.pullChangesFromRemoteUrl(repositoryImportDto); + assertThrows(ImportFailedException.class, () -> repositoryConsumer.accept(repository)); + + verify(eventBus).post(new RepositoryImportEvent(HandlerEventType.MODIFY, repository, true)); } private PageResult createSingletonPageResult(Repository repository) {