From 75ed038084ae55f66fa988d16832c944407f2e3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Wed, 24 Feb 2021 14:32:56 +0100 Subject: [PATCH] Use repository id as id for import log --- .../scm/repository/RepositoryImportEvent.java | 4 +--- .../scm/importexport/FromBundleImporter.java | 6 +++--- .../sonia/scm/importexport/FromUrlImporter.java | 8 +++----- .../importexport/FullScmRepositoryImporter.java | 15 ++++++++------- .../scm/importexport/RepositoryImportLogger.java | 11 ++++------- .../FullScmRepositoryImporterTest.java | 15 ++++++++++----- 6 files changed, 29 insertions(+), 30 deletions(-) diff --git a/scm-core/src/main/java/sonia/scm/repository/RepositoryImportEvent.java b/scm-core/src/main/java/sonia/scm/repository/RepositoryImportEvent.java index 737d95ff1f..a8fefefef0 100644 --- a/scm-core/src/main/java/sonia/scm/repository/RepositoryImportEvent.java +++ b/scm-core/src/main/java/sonia/scm/repository/RepositoryImportEvent.java @@ -39,12 +39,10 @@ import sonia.scm.event.Event; @EqualsAndHashCode(callSuper = true) public class RepositoryImportEvent extends RepositoryEvent { - private final String logId; private final boolean failed; - public RepositoryImportEvent(HandlerEventType eventType, Repository repository, String logId, boolean failed) { + public RepositoryImportEvent(HandlerEventType eventType, Repository repository, boolean failed) { super(eventType, repository); - this.logId = logId; this.failed = failed; } } diff --git a/scm-webapp/src/main/java/sonia/scm/importexport/FromBundleImporter.java b/scm-webapp/src/main/java/sonia/scm/importexport/FromBundleImporter.java index be9533763d..e988c16102 100644 --- a/scm-webapp/src/main/java/sonia/scm/importexport/FromBundleImporter.java +++ b/scm-webapp/src/main/java/sonia/scm/importexport/FromBundleImporter.java @@ -86,21 +86,21 @@ public class FromBundleImporter { RepositoryImportLogger logger = loggerFactory.createLogger(); try { - logger.start(DUMP, repository); repository = manager.create(repository, unbundleImport(inputStream, compressed, logger)); logger.finished(); } catch (Exception e) { logger.failed(e); - eventBus.post(new RepositoryImportEvent(HandlerEventType.CREATE, repository, logger.getLogId(), true)); + eventBus.post(new RepositoryImportEvent(HandlerEventType.CREATE, repository, true)); throw e; } - eventBus.post(new RepositoryImportEvent(HandlerEventType.CREATE, repository, logger.getLogId(), false)); + eventBus.post(new RepositoryImportEvent(HandlerEventType.CREATE, repository, false)); return repository; } private Consumer unbundleImport(InputStream inputStream, boolean compressed, RepositoryImportLogger logger) { return repository -> { + logger.start(DUMP, repository); File workdir = workdirProvider.createNewWorkdir(repository.getId()); try (RepositoryService service = serviceFactory.create(repository)) { logger.step("writing temporary dump file"); diff --git a/scm-webapp/src/main/java/sonia/scm/importexport/FromUrlImporter.java b/scm-webapp/src/main/java/sonia/scm/importexport/FromUrlImporter.java index 09d7c7c7e4..4a6990c9db 100644 --- a/scm-webapp/src/main/java/sonia/scm/importexport/FromUrlImporter.java +++ b/scm-webapp/src/main/java/sonia/scm/importexport/FromUrlImporter.java @@ -81,25 +81,24 @@ public class FromUrlImporter { repository.setPermissions(singletonList(new RepositoryPermission(SecurityUtils.getSubject().getPrincipal().toString(), "OWNER", false))); RepositoryImportLogger logger = loggerFactory.createLogger(); - logger.start(RepositoryImportLog.ImportType.URL, repository); Repository createdRepository; try { - logger.step("creating repository"); createdRepository = manager.create( repository, pullChangesFromRemoteUrl(parameters, logger) ); } catch (Exception e) { logger.failed(e); - eventBus.post(new RepositoryImportEvent(HandlerEventType.CREATE, repository, logger.getLogId(), true)); + eventBus.post(new RepositoryImportEvent(HandlerEventType.CREATE, repository, true)); throw new ImportFailedException(noContext(), "Could not import repository from url " + parameters.getImportUrl(), e); } - eventBus.post(new RepositoryImportEvent(HandlerEventType.CREATE, createdRepository, logger.getLogId(), false)); + eventBus.post(new RepositoryImportEvent(HandlerEventType.CREATE, createdRepository, false)); return createdRepository; } private Consumer pullChangesFromRemoteUrl(RepositoryImportParameters parameters, RepositoryImportLogger logger) { return repository -> { + logger.start(RepositoryImportLog.ImportType.URL, repository); try (RepositoryService service = serviceFactory.create(repository)) { PullCommandBuilder pullCommand = service.getPullCommand(); if (!Strings.isNullOrEmpty(parameters.getUsername()) && !Strings.isNullOrEmpty(parameters.getPassword())) { @@ -124,6 +123,5 @@ public class FromUrlImporter { private String importUrl; private String username; private String password; - } } 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 a225ee964f..1c988c2e6d 100644 --- a/scm-webapp/src/main/java/sonia/scm/importexport/FullScmRepositoryImporter.java +++ b/scm-webapp/src/main/java/sonia/scm/importexport/FullScmRepositoryImporter.java @@ -77,7 +77,6 @@ public class FullScmRepositoryImporter { public Repository importFromStream(Repository repository, InputStream inputStream, String password) { RepositoryPermissions.create().check(); - RepositoryImportLogger logger = startLogger(repository); try { if (inputStream.available() > 0) { try ( @@ -86,7 +85,7 @@ public class FullScmRepositoryImporter { GzipCompressorInputStream gcis = new GzipCompressorInputStream(cif); TarArchiveInputStream tais = createTarInputStream(gcis) ) { - return run(repository, tais, logger); + return run(repository, tais); } } else { throw new ImportFailedException( @@ -117,8 +116,10 @@ public class FullScmRepositoryImporter { return logger; } - private Repository run(Repository repository, TarArchiveInputStream tais, RepositoryImportLogger logger) throws IOException { - ImportState state = new ImportState(repositoryManager.create(repository), logger); + private Repository run(Repository repository, TarArchiveInputStream tais) throws IOException { + Repository createdRepository = repositoryManager.create(repository); + RepositoryImportLogger logger = startLogger(repository); + ImportState state = new ImportState(createdRepository, logger); logger.repositoryCreated(state.getRepository()); try { TarArchiveEntry tarArchiveEntry; @@ -127,10 +128,10 @@ public class FullScmRepositoryImporter { handle(tais, state, tarArchiveEntry); } stream(importSteps).forEach(step -> step.finish(state)); - logger.finished(); + state.getLogger().finished(); return state.getRepository(); } catch (RuntimeException | IOException e) { - logger.failed(e); + state.getLogger().failed(e); throw e; } finally { stream(importSteps).forEach(step -> step.cleanup(state)); @@ -140,7 +141,7 @@ public class FullScmRepositoryImporter { } else { // Delete the repository if any error occurs during the import repositoryManager.delete(state.getRepository()); - eventBus.post(new RepositoryImportEvent(HandlerEventType.CREATE, repository, logger.getLogId(), true)); + eventBus.post(new RepositoryImportEvent(HandlerEventType.CREATE, repository, true)); } } diff --git a/scm-webapp/src/main/java/sonia/scm/importexport/RepositoryImportLogger.java b/scm-webapp/src/main/java/sonia/scm/importexport/RepositoryImportLogger.java index 7e72d70611..3cf895a9aa 100644 --- a/scm-webapp/src/main/java/sonia/scm/importexport/RepositoryImportLogger.java +++ b/scm-webapp/src/main/java/sonia/scm/importexport/RepositoryImportLogger.java @@ -34,7 +34,7 @@ class RepositoryImportLogger { private final DataStore logStore; private RepositoryImportLog log; - private String logId; + private String repositoryId; RepositoryImportLogger(DataStore logStore) { this.logStore = logStore; @@ -42,6 +42,7 @@ class RepositoryImportLogger { void start(ImportType importType, Repository repository) { User user = SecurityUtils.getSubject().getPrincipals().oneByType(User.class); + repositoryId = repository.getId(); log = new RepositoryImportLog(); log.setType(importType); log.setUserId(user.getId()); @@ -50,14 +51,10 @@ class RepositoryImportLogger { log.setNamespace(repository.getNamespace()); log.setName(repository.getName()); log.setRepositoryType(repository.getType()); - logId = logStore.put(log); + logStore.put(repositoryId, log); addLogEntry(new RepositoryImportLog.Entry("import started")); } - public String getLogId() { - return logId; - } - public void finished() { log.setSuccess(true); step("import finished successfully"); @@ -83,7 +80,7 @@ class RepositoryImportLogger { } private void writeLog() { - logStore.put(logId, log); + logStore.put(repositoryId, log); } private void addLogEntry(RepositoryImportLog.Entry entry) { 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 b83a114626..34ae6ecf20 100644 --- a/scm-webapp/src/test/java/sonia/scm/importexport/FullScmRepositoryImporterTest.java +++ b/scm-webapp/src/test/java/sonia/scm/importexport/FullScmRepositoryImporterTest.java @@ -28,7 +28,6 @@ import com.google.common.io.Resources; import org.apache.shiro.authz.AuthorizationException; import org.apache.shiro.subject.Subject; import org.apache.shiro.util.ThreadContext; -import org.assertj.core.api.InstanceOfAssertFactories; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -62,6 +61,7 @@ import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; import java.util.Collection; +import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; import static org.assertj.core.api.Assertions.assertThat; @@ -239,15 +239,20 @@ class FullScmRepositoryImporterTest { @Test void shouldSendImportedEventForImportedRepository() throws IOException { InputStream stream = Resources.getResource("sonia/scm/repository/import/scm-import.tar.gz").openStream(); + when(unbundleCommandBuilder.setPostEventSink(any())).thenAnswer( + invocation -> { + invocation.getArgument(0, Consumer.class).accept(new RepositoryHookEvent(null, REPOSITORY, null)); + return null; + } + ); fullImporter.importFromStream(REPOSITORY, stream, null); verify(eventBus).post(argThat( event -> { - assertThat(event).isInstanceOf(RepositoryImportEvent.class); - RepositoryImportEvent repositoryImportEvent = (RepositoryImportEvent) event; - assertThat(repositoryImportEvent.getItem()).isEqualTo(REPOSITORY); - assertThat(repositoryImportEvent.isFailed()).isFalse(); + assertThat(event).isInstanceOf(ImportRepositoryHookEvent.class); + ImportRepositoryHookEvent repositoryImportEvent = (ImportRepositoryHookEvent) event; + assertThat(repositoryImportEvent.getRepository()).isEqualTo(REPOSITORY); return true; } ));