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 c01d06887b..9f48d0c5f3 100644 --- a/scm-webapp/src/main/java/sonia/scm/importexport/FromBundleImporter.java +++ b/scm-webapp/src/main/java/sonia/scm/importexport/FromBundleImporter.java @@ -40,6 +40,7 @@ import sonia.scm.repository.RepositoryPermission; import sonia.scm.repository.api.Command; import sonia.scm.repository.api.RepositoryService; import sonia.scm.repository.api.RepositoryServiceFactory; +import sonia.scm.repository.work.WorkdirProvider; import sonia.scm.util.IOUtil; import javax.inject.Inject; @@ -59,12 +60,16 @@ public class FromBundleImporter { private final RepositoryManager manager; private final RepositoryServiceFactory serviceFactory; private final ScmEventBus eventBus; + private final WorkdirProvider workdirProvider; + private final RepositoryImportLoggerFactory loggerFactory; @Inject - public FromBundleImporter(RepositoryManager manager, RepositoryServiceFactory serviceFactory, ScmEventBus eventBus) { + public FromBundleImporter(RepositoryManager manager, RepositoryServiceFactory serviceFactory, ScmEventBus eventBus, WorkdirProvider workdirProvider, RepositoryImportLoggerFactory loggerFactory) { this.manager = manager; this.serviceFactory = serviceFactory; this.eventBus = eventBus; + this.workdirProvider = workdirProvider; + this.loggerFactory = loggerFactory; } public Repository importFromBundle(boolean compressed, InputStream inputStream, Repository repository) { @@ -89,17 +94,23 @@ public class FromBundleImporter { @VisibleForTesting Consumer unbundleImport(InputStream inputStream, boolean compressed) { return repository -> { - File file = null; + RepositoryImportLogger logger = loggerFactory.createLogger(); + logger.start(RepositoryImportLog.ImportType.DUMP, repository); + File workdir = workdirProvider.createNewWorkdir(repository.getId()); try (RepositoryService service = serviceFactory.create(repository)) { - file = File.createTempFile("scm-import-", ".bundle"); + logger.step("writing temporary dump file"); + File file = File.createTempFile("scm-import-", ".bundle", workdir); long length = Files.asByteSink(file).writeFrom(inputStream); LOG.info("copied {} bytes to temp, start bundle import", length); + logger.step("importing repository data from dump file"); service.getUnbundleCommand().setCompressed(compressed).unbundle(file); + logger.finished(); } catch (IOException e) { + logger.failed(e); throw new InternalRepositoryException(repository, "Failed to import from bundle", e); } finally { try { - IOUtil.delete(file); + IOUtil.delete(workdir); } catch (IOException ex) { LOG.warn("could not delete temporary file", ex); } 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 2377124731..c96f4a18f5 100644 --- a/scm-webapp/src/main/java/sonia/scm/importexport/FromUrlImporter.java +++ b/scm-webapp/src/main/java/sonia/scm/importexport/FromUrlImporter.java @@ -60,12 +60,14 @@ public class FromUrlImporter { private final RepositoryManager manager; private final RepositoryServiceFactory serviceFactory; private final ScmEventBus eventBus; + private final RepositoryImportLoggerFactory loggerFactory; @Inject - public FromUrlImporter(RepositoryManager manager, RepositoryServiceFactory serviceFactory, ScmEventBus eventBus) { + public FromUrlImporter(RepositoryManager manager, RepositoryServiceFactory serviceFactory, ScmEventBus eventBus, RepositoryImportLoggerFactory loggerFactory) { this.manager = manager; this.serviceFactory = serviceFactory; this.eventBus = eventBus; + this.loggerFactory = loggerFactory; } public Repository importFromUrl(RepositoryImportParameters parameters, Repository repository) { @@ -93,16 +95,22 @@ public class FromUrlImporter { @VisibleForTesting Consumer pullChangesFromRemoteUrl(RepositoryImportParameters parameters) { return repository -> { + RepositoryImportLogger logger = loggerFactory.createLogger(); + 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())) { + logger.step("setting username and password for pull"); pullCommand .withUsername(parameters.getUsername()) .withPassword(parameters.getPassword()); } + logger.step("pulling repository from " + parameters.getImportUrl()); pullCommand.pull(parameters.getImportUrl()); + logger.finished(); } catch (IOException e) { + logger.failed(e); throw new InternalRepositoryException(repository, "Failed to import from remote url", e); } };