diff --git a/scm-core/src/main/java/sonia/scm/repository/util/SimpleWorkdirFactory.java b/scm-core/src/main/java/sonia/scm/repository/util/SimpleWorkdirFactory.java index 37ba1874db..de4ae6069d 100644 --- a/scm-core/src/main/java/sonia/scm/repository/util/SimpleWorkdirFactory.java +++ b/scm-core/src/main/java/sonia/scm/repository/util/SimpleWorkdirFactory.java @@ -15,15 +15,12 @@ public abstract class SimpleWorkdirFactory implements WorkdirFactory private final File poolDirectory; - private final CloneProvider cloneProvider; - - public SimpleWorkdirFactory(CloneProvider cloneProvider) { - this(new File(System.getProperty("java.io.tmpdir"), "scmm-work-pool"), cloneProvider); + public SimpleWorkdirFactory() { + this(new File(System.getProperty("java.io.tmpdir"), "scmm-work-pool")); } - public SimpleWorkdirFactory(File poolDirectory, CloneProvider cloneProvider) { + public SimpleWorkdirFactory(File poolDirectory) { this.poolDirectory = poolDirectory; - this.cloneProvider = cloneProvider; if (!poolDirectory.exists() && !poolDirectory.mkdirs()) { throw new IllegalStateException("could not create pool directory " + poolDirectory); } @@ -33,17 +30,19 @@ public abstract class SimpleWorkdirFactory implements WorkdirFactory public WorkingCopy createWorkingCopy(C context) { try { File directory = createNewWorkdir(); - ParentAndClone parentAndClone = cloneProvider.cloneRepository(context, directory); + ParentAndClone parentAndClone = cloneRepository(context, directory); return new WorkingCopy<>(parentAndClone.getClone(), parentAndClone.getParent(), this::close, directory); } catch (IOException e) { - throw new InternalRepositoryException(getRepository(context), "could not create temporary directory for clone of repository", e); + throw new InternalRepositoryException(getScmRepository(context), "could not clone repository in temporary directory", e); } } - protected abstract Repository getRepository(C context); + protected abstract Repository getScmRepository(C context); protected abstract void closeRepository(R repository); + protected abstract ParentAndClone cloneRepository(C context, File target) throws IOException; + private File createNewWorkdir() throws IOException { return Files.createTempDirectory(poolDirectory.toPath(),"workdir").toFile(); } @@ -56,11 +55,6 @@ public abstract class SimpleWorkdirFactory implements WorkdirFactory } } - @FunctionalInterface - protected interface CloneProvider { - ParentAndClone cloneRepository(C context, File target) throws IOException; - } - protected static class ParentAndClone { private final R parent; private final R clone; diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/SimpleGitWorkdirFactory.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/SimpleGitWorkdirFactory.java index 1346504b12..a4d1ab830e 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/SimpleGitWorkdirFactory.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/SimpleGitWorkdirFactory.java @@ -13,31 +13,27 @@ import java.io.File; public class SimpleGitWorkdirFactory extends SimpleWorkdirFactory implements GitWorkdirFactory { public SimpleGitWorkdirFactory() { - super(new GitCloneProvider()); } - public SimpleGitWorkdirFactory(File poolDirectory) { - super(poolDirectory, new GitCloneProvider()); + SimpleGitWorkdirFactory(File poolDirectory) { + super(poolDirectory); } - private static class GitCloneProvider implements CloneProvider { - - @Override - public ParentAndClone cloneRepository(GitContext context, File target) { - try { - return new ParentAndClone<>(null, Git.cloneRepository() - .setURI(createScmTransportProtocolUri(context.getDirectory())) - .setDirectory(target) - .call() - .getRepository()); - } catch (GitAPIException e) { - throw new InternalRepositoryException(context.getRepository(), "could not clone working copy of repository", e); - } + @Override + public ParentAndClone cloneRepository(GitContext context, File target) { + try { + return new ParentAndClone<>(null, Git.cloneRepository() + .setURI(createScmTransportProtocolUri(context.getDirectory())) + .setDirectory(target) + .call() + .getRepository()); + } catch (GitAPIException e) { + throw new InternalRepositoryException(context.getRepository(), "could not clone working copy of repository", e); } + } - private String createScmTransportProtocolUri(File bareRepository) { - return ScmTransportProtocol.NAME + "://" + bareRepository.getAbsolutePath(); - } + private String createScmTransportProtocolUri(File bareRepository) { + return ScmTransportProtocol.NAME + "://" + bareRepository.getAbsolutePath(); } @Override @@ -46,7 +42,7 @@ public class SimpleGitWorkdirFactory extends SimpleWorkdirFactory implements HgWorkdirFactory { + private final Provider hgRepositoryEnvironmentBuilder; + @Inject public SimpleHgWorkdirFactory(Provider hgRepositoryEnvironmentBuilder) { - super(new HgCloneProvider(hgRepositoryEnvironmentBuilder)); + this.hgRepositoryEnvironmentBuilder = hgRepositoryEnvironmentBuilder; } - - private static class HgCloneProvider implements CloneProvider { - - private final Provider hgRepositoryEnvironmentBuilder; - - private HgCloneProvider(Provider hgRepositoryEnvironmentBuilder) { - this.hgRepositoryEnvironmentBuilder = hgRepositoryEnvironmentBuilder; - } - - @Override - public ParentAndClone cloneRepository(HgCommandContext context, File target) throws IOException { - BiConsumer> repositoryMapBiConsumer = - (repository, environment) -> hgRepositoryEnvironmentBuilder.get().buildFor(repository, null, environment); - Repository centralRepository = context.openWithSpecialEnvironment(repositoryMapBiConsumer); - CloneCommand.on(centralRepository).execute(target.getAbsolutePath()); - return new ParentAndClone<>(centralRepository, Repository.open(target)); - } + @Override + public ParentAndClone cloneRepository(HgCommandContext context, File target) throws IOException { + BiConsumer> repositoryMapBiConsumer = + (repository, environment) -> hgRepositoryEnvironmentBuilder.get().buildFor(repository, null, environment); + Repository centralRepository = context.openWithSpecialEnvironment(repositoryMapBiConsumer); + CloneCommand.on(centralRepository).execute(target.getAbsolutePath()); + return new ParentAndClone<>(centralRepository, Repository.open(target)); } @Override @@ -44,8 +36,8 @@ public class SimpleHgWorkdirFactory extends SimpleWorkdirFactory