From 7e89a0c1c0b7c15a392476e60f01d233edee147a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Mon, 13 Apr 2020 14:39:02 +0200 Subject: [PATCH] Update repositories in reclaim --- .../repository/util/SimpleWorkdirFactory.java | 8 ++++- .../spi/SimpleGitWorkdirFactory.java | 32 +++++++++++++++++-- .../spi/SimpleHgWorkdirFactory.java | 2 ++ .../spi/SimpleSvnWorkDirFactory.java | 13 +++++++- 4 files changed, 51 insertions(+), 4 deletions(-) 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 22a0662b21..539dcac116 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 @@ -86,7 +86,7 @@ public abstract class SimpleWorkdirFactory implements WorkdirFactory cloneRepository(C context, File target, String initialBranch) throws IOException; - protected abstract ParentAndClone reclaimRepository(C context, File target, String initialBranch) throws IOException; + protected abstract ParentAndClone reclaimRepository(C context, File target, String initialBranch) throws IOException, ReclaimFailedException; private void closeCentral(R repository) { try { @@ -129,5 +129,11 @@ public abstract class SimpleWorkdirFactory implements WorkdirFactory implements GitWorkdirFactory { + private static final Logger LOG = LoggerFactory.getLogger(SimpleGitWorkdirFactory.class); + @Inject public SimpleGitWorkdirFactory(CacheSupportingWorkdirProvider workdirProvider) { super(workdirProvider); @@ -53,6 +58,8 @@ public class SimpleGitWorkdirFactory extends SimpleWorkdirFactory cloneRepository(GitContext context, File target, String initialBranch) { + LOG.trace("clone repository {}", context.getRepository().getId()); + long start = System.nanoTime(); try { Repository clone = Git.cloneRepository() .setURI(createScmTransportProtocolUri(context.getDirectory())) @@ -70,12 +77,33 @@ public class SimpleGitWorkdirFactory extends SimpleWorkdirFactory(null, clone, target); } catch (GitAPIException | IOException e) { throw new InternalRepositoryException(context.getRepository(), "could not clone working copy of repository", e); + } finally { + long end = System.nanoTime(); + long duration = end - start; + LOG.trace("took {} ns to clone repository {}", duration, context.getRepository().getId()); } } @Override - protected ParentAndClone reclaimRepository(GitContext context, File target, String initialBranch) throws IOException { - return new ParentAndClone<>(null, GitUtil.open(target), target); + protected ParentAndClone reclaimRepository(GitContext context, File target, String initialBranch) throws IOException, ReclaimFailedException { + LOG.trace("reclaim repository {}", context.getRepository().getId()); + long start = System.nanoTime(); + Repository repo = GitUtil.open(target); + try (Git git = Git.open(target)) { + git.reset().setMode(ResetCommand.ResetType.HARD).call(); + git.clean().setForce(true).setCleanDirectories(true).call(); + git.fetch().call(); + git.branchDelete().setBranchNames(initialBranch).setForce(true).call(); + git.checkout().setForced(true).setName("origin/" + initialBranch).call(); + git.checkout().setName(initialBranch).setCreateBranch(true).call(); + return new ParentAndClone<>(null, repo, target); + } catch (GitAPIException e) { + throw new ReclaimFailedException(e); + } finally { + long end = System.nanoTime(); + long duration = end - start; + LOG.trace("took {} ns to reclaim repository {}\n", duration, context.getRepository().getId()); + } } private String createScmTransportProtocolUri(File bareRepository) { diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/SimpleHgWorkdirFactory.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/SimpleHgWorkdirFactory.java index 99c02d6af8..5663ab355e 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/SimpleHgWorkdirFactory.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/SimpleHgWorkdirFactory.java @@ -28,6 +28,7 @@ import com.aragost.javahg.BaseRepository; import com.aragost.javahg.Repository; import com.aragost.javahg.commands.CloneCommand; import com.aragost.javahg.commands.PullCommand; +import com.aragost.javahg.commands.UpdateCommand; import com.aragost.javahg.commands.flags.CloneCommandFlags; import sonia.scm.repository.util.CacheSupportingWorkdirProvider; import sonia.scm.repository.util.SimpleWorkdirFactory; @@ -73,6 +74,7 @@ public class SimpleHgWorkdirFactory extends SimpleWorkdirFactory reclaimRepository(HgCommandContext context, File target, String initialBranch) throws IOException { Repository centralRepository = openCentral(context); BaseRepository clone = Repository.open(target); + UpdateCommand.on(clone).rev(initialBranch).execute(); return new ParentAndClone<>(centralRepository, clone, target); } diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SimpleSvnWorkDirFactory.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SimpleSvnWorkDirFactory.java index 9c8bcfe987..3d88d79388 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SimpleSvnWorkDirFactory.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SimpleSvnWorkDirFactory.java @@ -24,8 +24,12 @@ package sonia.scm.repository.spi; +import org.tmatesoft.svn.core.SVNDepth; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNURL; +import org.tmatesoft.svn.core.wc.SVNClientManager; +import org.tmatesoft.svn.core.wc.SVNRevision; +import org.tmatesoft.svn.core.wc.SVNWCClient; import org.tmatesoft.svn.core.wc2.SvnCheckout; import org.tmatesoft.svn.core.wc2.SvnOperationFactory; import org.tmatesoft.svn.core.wc2.SvnTarget; @@ -78,7 +82,14 @@ public class SimpleSvnWorkDirFactory extends SimpleWorkdirFactory reclaimRepository(SvnContext context, File target, String initialBranch) throws IOException { + protected ParentAndClone reclaimRepository(SvnContext context, File target, String initialBranch) throws ReclaimFailedException { + SVNClientManager clientManager = SVNClientManager.newInstance(); + try { + clientManager.getWCClient().doCleanup(target); + clientManager.getUpdateClient().doUpdate(target, SVNRevision.HEAD, SVNDepth.fromRecurse(true), false, false); + } catch (SVNException e) { + throw new ReclaimFailedException(e); + } return new ParentAndClone<>(context.getDirectory(), target, target); }