diff --git a/scm-core/src/main/java/sonia/scm/repository/work/SimpleWorkingCopyFactory.java b/scm-core/src/main/java/sonia/scm/repository/work/SimpleWorkingCopyFactory.java index 7ed74c4e11..0b842ad78c 100644 --- a/scm-core/src/main/java/sonia/scm/repository/work/SimpleWorkingCopyFactory.java +++ b/scm-core/src/main/java/sonia/scm/repository/work/SimpleWorkingCopyFactory.java @@ -41,10 +41,10 @@ import java.io.File; * implemented: * *
- *
{@link #getInitializer(C)}
+ *
{@link #initialize(C, File, String)}
*
Creates a new clone of the repository for the given context in the given * directory with the given branch checked out (if branches are supported).
- *
{@link #getReclaimer(C)}
+ *
{@link #reclaim(C, File, String)}
*
Reclaim the working directory with a already checked out clone of the * repository given in the context, so that the directory is not modified in * respect to the repository and the given branch is checked out (if branches @@ -215,19 +215,9 @@ public abstract class SimpleWorkingCopyFactory { - ParentAndClone initialize(File target, String initialBranch); - } + protected abstract ParentAndClone initialize(C context, File target, String initialBranch); - @FunctionalInterface - public interface WorkingCopyReclaimer { - ParentAndClone reclaim(File target, String initialBranch) throws ReclaimFailedException; - } - - protected abstract WorkingCopyInitializer getInitializer(C context); - - protected abstract WorkingCopyReclaimer getReclaimer(C context); + protected abstract ParentAndClone reclaim(C context, File target, String initialBranch) throws ReclaimFailedException; @SuppressWarnings("squid:S00112") // We do allow implementations to throw arbitrary exceptions here, so that we can handle them in closeCentral @@ -289,11 +279,11 @@ public abstract class SimpleWorkingCopyFactory reclaim(File workdir) throws SimpleWorkingCopyFactory.ReclaimFailedException { - return createWorkingCopyFromParentAndClone(getReclaimer(repositoryContext).reclaim(workdir, requestedBranch)); + return createWorkingCopyFromParentAndClone(SimpleWorkingCopyFactory.this.reclaim(repositoryContext, workdir, requestedBranch)); } public WorkingCopy initialize(File workdir) { - return createWorkingCopyFromParentAndClone(getInitializer(repositoryContext).initialize(workdir, requestedBranch)); + return createWorkingCopyFromParentAndClone(SimpleWorkingCopyFactory.this.initialize(repositoryContext, workdir, requestedBranch)); } public WorkingCopy createWorkingCopyFromParentAndClone(ParentAndClone parentAndClone) { diff --git a/scm-core/src/test/java/sonia/scm/repository/work/SimpleWorkingCopyFactoryTest.java b/scm-core/src/test/java/sonia/scm/repository/work/SimpleWorkingCopyFactoryTest.java index 69a4225b22..1ab22972f9 100644 --- a/scm-core/src/test/java/sonia/scm/repository/work/SimpleWorkingCopyFactoryTest.java +++ b/scm-core/src/test/java/sonia/scm/repository/work/SimpleWorkingCopyFactoryTest.java @@ -84,23 +84,20 @@ public class SimpleWorkingCopyFactoryTest { } @Override - protected WorkingCopyReclaimer< - Closeable, Closeable> getReclaimer(Context context) { - return (target, initialBranch) -> {throw new UnsupportedOperationException();}; + protected ParentAndClone initialize(Context context, File target, String initialBranch) { + initialBranchForLastCloneCall = initialBranch; + return new ParentAndClone<>(parent, clone, target); + } + + @Override + protected ParentAndClone reclaim(Context context, File target, String initialBranch) throws ReclaimFailedException { + throw new UnsupportedOperationException(); } @Override protected void closeWorkingCopy(Closeable workingCopy) throws Exception { workingCopy.close(); } - - @Override - protected WorkingCopyInitializer getInitializer(Context context) { - return (target, initialBranch) -> { - initialBranchForLastCloneCall = initialBranch; - return new ParentAndClone<>(parent, clone, target); - }; - } }; } diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitWorkingCopyInitializer.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitWorkingCopyInitializer.java index e1cd889d07..d48a64cc25 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitWorkingCopyInitializer.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitWorkingCopyInitializer.java @@ -32,7 +32,6 @@ import org.eclipse.jgit.lib.Repository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import sonia.scm.repository.InternalRepositoryException; -import sonia.scm.repository.work.SimpleWorkingCopyFactory; import sonia.scm.repository.work.SimpleWorkingCopyFactory.ParentAndClone; import java.io.File; @@ -41,7 +40,7 @@ import java.io.IOException; import static sonia.scm.ContextEntry.ContextBuilder.entity; import static sonia.scm.NotFoundException.notFound; -class GitWorkingCopyInitializer implements SimpleWorkingCopyFactory.WorkingCopyInitializer { +class GitWorkingCopyInitializer { private static final Logger LOG = LoggerFactory.getLogger(GitWorkingCopyInitializer.class); @@ -53,7 +52,6 @@ class GitWorkingCopyInitializer implements SimpleWorkingCopyFactory.WorkingCopyI this.context = context; } - @Override public ParentAndClone initialize(File target, String initialBranch) { LOG.trace("clone repository {}", context.getRepository().getId()); long start = System.nanoTime(); diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitWorkingCopyReclaimer.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitWorkingCopyReclaimer.java index 2cd37432b6..c5ffd24aa7 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitWorkingCopyReclaimer.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitWorkingCopyReclaimer.java @@ -37,7 +37,7 @@ import sonia.scm.repository.work.SimpleWorkingCopyFactory.ParentAndClone; import java.io.File; import java.io.IOException; -class GitWorkingCopyReclaimer implements SimpleWorkingCopyFactory.WorkingCopyReclaimer { +class GitWorkingCopyReclaimer { private static final Logger LOG = LoggerFactory.getLogger(GitWorkingCopyReclaimer.class); @@ -47,7 +47,6 @@ class GitWorkingCopyReclaimer implements SimpleWorkingCopyFactory.WorkingCopyRec this.context = context; } - @Override public ParentAndClone reclaim(File target, String initialBranch) throws SimpleWorkingCopyFactory.ReclaimFailedException { LOG.trace("reclaim repository {}", context.getRepository().getId()); long start = System.nanoTime(); diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/SimpleGitWorkingCopyFactory.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/SimpleGitWorkingCopyFactory.java index 2de4ff92c0..a4fa38111e 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/SimpleGitWorkingCopyFactory.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/SimpleGitWorkingCopyFactory.java @@ -26,18 +26,14 @@ package sonia.scm.repository.spi; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.transport.ScmTransportProtocol; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import sonia.scm.repository.GitWorkingCopyFactory; -import sonia.scm.repository.work.WorkingCopyPool; import sonia.scm.repository.work.SimpleWorkingCopyFactory; +import sonia.scm.repository.work.WorkingCopyPool; import sonia.scm.util.SystemUtil; import javax.inject.Inject; import java.io.File; -import static sonia.scm.ContextEntry.ContextBuilder.entity; - public class SimpleGitWorkingCopyFactory extends SimpleWorkingCopyFactory implements GitWorkingCopyFactory { @Inject @@ -46,13 +42,13 @@ public class SimpleGitWorkingCopyFactory extends SimpleWorkingCopyFactory getInitializer(GitContext context) { - return new GitWorkingCopyInitializer(this, context); + public ParentAndClone initialize(GitContext context, File target, String initialBranch) { + return new GitWorkingCopyInitializer(this, context).initialize(target, initialBranch); } @Override - protected WorkingCopyReclaimer getReclaimer(GitContext context) { - return new GitWorkingCopyReclaimer(context); + public ParentAndClone reclaim(GitContext context, File target, String initialBranch) throws SimpleWorkingCopyFactory.ReclaimFailedException { + return new GitWorkingCopyReclaimer(context).reclaim(target, initialBranch); } String createScmTransportProtocolUri(File bareRepository) { diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/SimpleGitWorkingCopyFactoryTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/SimpleGitWorkingCopyFactoryTest.java index 93c1c1425b..9a32b5d01c 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/SimpleGitWorkingCopyFactoryTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/SimpleGitWorkingCopyFactoryTest.java @@ -142,7 +142,7 @@ public class SimpleGitWorkingCopyFactoryTest extends AbstractGitCommandTestBase SimpleGitWorkingCopyFactory factory = new SimpleGitWorkingCopyFactory(new NoneCachingWorkingCopyPool(workdirProvider)); File workdir = createExistingClone(factory); - factory.getReclaimer(createContext()).reclaim(workdir, "master"); + factory.reclaim(createContext(), workdir, "master"); assertBranchCheckedOutAndClean(workdir, "master"); } @@ -152,7 +152,7 @@ public class SimpleGitWorkingCopyFactoryTest extends AbstractGitCommandTestBase SimpleGitWorkingCopyFactory factory = new SimpleGitWorkingCopyFactory(new NoneCachingWorkingCopyPool(workdirProvider)); File workdir = createExistingClone(factory); - factory.getReclaimer(createContext()).reclaim(workdir, "test-branch"); + factory.reclaim(createContext(), workdir, "test-branch"); assertBranchCheckedOutAndClean(workdir, "test-branch"); } @@ -163,7 +163,7 @@ public class SimpleGitWorkingCopyFactoryTest extends AbstractGitCommandTestBase File workdir = createExistingClone(factory); Git.open(workdir).rm().addFilepattern("a.txt").call(); - factory.getReclaimer(createContext()).reclaim(workdir, "master"); + factory.reclaim(createContext(), workdir, "master"); assertBranchCheckedOutAndClean(workdir, "master"); } @@ -174,7 +174,7 @@ public class SimpleGitWorkingCopyFactoryTest extends AbstractGitCommandTestBase File workdir = createExistingClone(factory); Files.delete(workdir.toPath().resolve("a.txt")); - factory.getReclaimer(createContext()).reclaim(workdir, "master"); + factory.reclaim(createContext(), workdir, "master"); assertBranchCheckedOutAndClean(workdir, "master"); } @@ -187,7 +187,7 @@ public class SimpleGitWorkingCopyFactoryTest extends AbstractGitCommandTestBase Files.createDirectories(newDirectory); Files.createFile(newDirectory.resolve("newFile")); - factory.getReclaimer(createContext()).reclaim(workdir, "master"); + factory.reclaim(createContext(), workdir, "master"); assertBranchCheckedOutAndClean(workdir, "master"); } diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/SimpleHgWorkingCopyFactory.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/SimpleHgWorkingCopyFactory.java index 7fdd107ae0..edd2e3aca1 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/SimpleHgWorkingCopyFactory.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/SimpleHgWorkingCopyFactory.java @@ -55,23 +55,36 @@ public class SimpleHgWorkingCopyFactory extends SimpleWorkingCopyFactory getInitializer(HgCommandContext context) { - return (target, initialBranch) -> { - Repository centralRepository = openCentral(context); - CloneCommand cloneCommand = CloneCommandFlags.on(centralRepository); - if (initialBranch != null) { - cloneCommand.updaterev(initialBranch); - } - try { - cloneCommand.execute(target.getAbsolutePath()); - } catch (IOException e) { - throw new InternalRepositoryException(context.getScmRepository(), "could not clone repository", e); - } + public ParentAndClone initialize(HgCommandContext context, File target, String initialBranch) { + Repository centralRepository = openCentral(context); + CloneCommand cloneCommand = CloneCommandFlags.on(centralRepository); + if (initialBranch != null) { + cloneCommand.updaterev(initialBranch); + } + try { + cloneCommand.execute(target.getAbsolutePath()); + } catch (IOException e) { + throw new InternalRepositoryException(context.getScmRepository(), "could not clone repository", e); + } + BaseRepository clone = Repository.open(target); + + return new ParentAndClone<>(centralRepository, clone, target); + } + + @Override + protected ParentAndClone reclaim(HgCommandContext context, File target, String initialBranch) throws ReclaimFailedException { + Repository centralRepository = openCentral(context); + try { BaseRepository clone = Repository.open(target); - + for (String unknown : StatusCommand.on(clone).execute().getUnknown()) { + delete(clone.getDirectory(), unknown); + } + UpdateCommand.on(clone).rev(initialBranch).clean().execute(); return new ParentAndClone<>(centralRepository, clone, target); - }; + } catch (ExecutionException | IOException e) { + throw new ReclaimFailedException(e); + } } public Repository openCentral(HgCommandContext context) { @@ -80,23 +93,6 @@ public class SimpleHgWorkingCopyFactory extends SimpleWorkingCopyFactory getReclaimer(HgCommandContext context) { - return (target, initialBranch) -> { - Repository centralRepository = openCentral(context); - try { - BaseRepository clone = Repository.open(target); - for (String unknown : StatusCommand.on(clone).execute().getUnknown()) { - delete(clone.getDirectory(), unknown); - } - UpdateCommand.on(clone).rev(initialBranch).clean().execute(); - return new ParentAndClone<>(centralRepository, clone, target); - } catch (ExecutionException | IOException e) { - throw new ReclaimFailedException(e); - } - }; - } - private void delete(File directory, String unknownFile) throws IOException { IOUtil.delete(new File(directory, unknownFile)); } diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SimpleSvnWorkingCopyFactory.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SimpleSvnWorkingCopyFactory.java index 6156ad6cf5..e3a1bda34c 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SimpleSvnWorkingCopyFactory.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SimpleSvnWorkingCopyFactory.java @@ -25,8 +25,8 @@ package sonia.scm.repository.spi; import sonia.scm.repository.SvnWorkingCopyFactory; -import sonia.scm.repository.work.WorkingCopyPool; import sonia.scm.repository.work.SimpleWorkingCopyFactory; +import sonia.scm.repository.work.WorkingCopyPool; import javax.inject.Inject; import java.io.File; @@ -39,13 +39,13 @@ public class SimpleSvnWorkingCopyFactory extends SimpleWorkingCopyFactory getInitializer(SvnContext context) { - return new SvnWorkingCopyInitializer(context); + protected ParentAndClone initialize(SvnContext context, File workingCopy, String initialBranch) { + return new SvnWorkingCopyInitializer(context).initialize(workingCopy); } @Override - protected WorkingCopyReclaimer getReclaimer(SvnContext context) { - return new SvnWorkingCopyReclaimer(context); + protected ParentAndClone reclaim(SvnContext context, File target, String initialBranch) throws SimpleWorkingCopyFactory.ReclaimFailedException { + return new SvnWorkingCopyReclaimer(context).reclaim(target); } @Override diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnWorkingCopyInitializer.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnWorkingCopyInitializer.java index ed778f503f..140c7e10f3 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnWorkingCopyInitializer.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnWorkingCopyInitializer.java @@ -30,20 +30,18 @@ import org.tmatesoft.svn.core.wc2.SvnCheckout; import org.tmatesoft.svn.core.wc2.SvnOperationFactory; import org.tmatesoft.svn.core.wc2.SvnTarget; import sonia.scm.repository.InternalRepositoryException; -import sonia.scm.repository.work.SimpleWorkingCopyFactory; import sonia.scm.repository.work.SimpleWorkingCopyFactory.ParentAndClone; import java.io.File; -class SvnWorkingCopyInitializer implements SimpleWorkingCopyFactory.WorkingCopyInitializer { +class SvnWorkingCopyInitializer { private final SvnContext context; public SvnWorkingCopyInitializer(SvnContext context) { this.context = context; } - @Override - public ParentAndClone initialize(File workingCopy, String initialBranch) { + public ParentAndClone initialize(File workingCopy) { final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); SVNURL source; diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnWorkingCopyReclaimer.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnWorkingCopyReclaimer.java index 2e60ce4c52..f72efa8e8d 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnWorkingCopyReclaimer.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnWorkingCopyReclaimer.java @@ -34,15 +34,14 @@ import java.io.File; import static org.tmatesoft.svn.core.SVNDepth.INFINITY; -class SvnWorkingCopyReclaimer implements SimpleWorkingCopyFactory.WorkingCopyReclaimer { +class SvnWorkingCopyReclaimer { private final SvnContext context; public SvnWorkingCopyReclaimer(SvnContext context) { this.context = context; } - @Override - public ParentAndClone reclaim(File target, String initialBranch) throws SimpleWorkingCopyFactory.ReclaimFailedException { + public ParentAndClone reclaim(File target) throws SimpleWorkingCopyFactory.ReclaimFailedException { SVNClientManager clientManager = SVNClientManager.newInstance(); try { clientManager.getWCClient().doRevert(new File[] {target}, INFINITY, null);