From 514e82498a6181dadf6a879a6740056e4bf238be Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Sat, 1 Nov 2014 12:35:33 +0100 Subject: [PATCH] implement bundle/unbundle command for subversion repository provider --- .../scm/repository/spi/SvnBundleCommand.java | 148 +++++++++++++++++ .../spi/SvnRepositoryServiceProvider.java | 33 +++- .../repository/spi/SvnUnbundleCommand.java | 155 ++++++++++++++++++ 3 files changed, 333 insertions(+), 3 deletions(-) create mode 100644 scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnBundleCommand.java create mode 100644 scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnUnbundleCommand.java diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnBundleCommand.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnBundleCommand.java new file mode 100644 index 0000000000..d514a51ac1 --- /dev/null +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnBundleCommand.java @@ -0,0 +1,148 @@ +/** +* Copyright (c) 2010, Sebastian Sdorra +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* 1. Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* 2. Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following disclaimer in the documentation +* and/or other materials provided with the distribution. +* 3. Neither the name of SCM-Manager; nor the names of its +* contributors may be used to endorse or promote products derived from this +* software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* http://bitbucket.org/sdorra/scm-manager +* +*/ + + + +package sonia.scm.repository.spi; + +//~--- non-JDK imports -------------------------------------------------------- + +import com.google.common.io.Closeables; + +import org.tmatesoft.svn.core.SVNException; +import org.tmatesoft.svn.core.wc.SVNClientManager; +import org.tmatesoft.svn.core.wc.SVNRevision; +import org.tmatesoft.svn.core.wc.admin.SVNAdminClient; + +import sonia.scm.repository.Repository; +import sonia.scm.repository.RepositoryException; +import sonia.scm.repository.SvnUtil; +import sonia.scm.repository.api.BundleResponse; + +import static com.google.common.base.Preconditions.*; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +/** + * + * @author Sebastian Sdorra + */ +public class SvnBundleCommand extends AbstractSvnCommand + implements BundleCommand +{ + + /** + * Constructs ... + * + * + * @param context + * @param repository + */ + public SvnBundleCommand(SvnContext context, Repository repository) + { + super(context, repository); + } + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @param adminClient + * @param repository + * @param target + * + * @throws IOException + * @throws SVNException + */ + private static void dump(SVNAdminClient adminClient, File repository, + File target) + throws SVNException, IOException + { + OutputStream outputStream = null; + + try + { + outputStream = new FileOutputStream(target); + adminClient.doDump(repository, outputStream, SVNRevision.create(-1l), + SVNRevision.HEAD, false, false); + } + finally + { + Closeables.close(outputStream, true); + } + } + + /** + * Method description + * + * + * @param request + * + * @return + * + * @throws IOException + * @throws RepositoryException + */ + @Override + public BundleResponse bundle(BundleCommandRequest request) + throws IOException, RepositoryException + { + File archive = checkNotNull(request.getArchive(), "archive is required"); + + SVNClientManager clientManager = null; + + try + { + clientManager = SVNClientManager.newInstance(); + + SVNAdminClient adminClient = clientManager.getAdminClient(); + + dump(adminClient, context.getDirectory(), archive); + } + catch (SVNException ex) + { + throw new IOException("could not create dump", ex); + } + finally + { + SvnUtil.dispose(clientManager); + } + + return new BundleResponse(); + } +} diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnRepositoryServiceProvider.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnRepositoryServiceProvider.java index 5c1907da7b..24180bfe9e 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnRepositoryServiceProvider.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnRepositoryServiceProvider.java @@ -56,9 +56,12 @@ public class SvnRepositoryServiceProvider extends RepositoryServiceProvider { /** Field description */ - public static final Set COMMANDS = ImmutableSet.of(Command.BLAME, - Command.BROWSE, Command.CAT, - Command.DIFF, Command.LOG); + //J- + public static final Set COMMANDS = ImmutableSet.of( + Command.BLAME, Command.BROWSE, Command.CAT, Command.DIFF, + Command.LOG, Command.BUNDLE, Command.UNBUNDLE + ); + //J+ //~--- constructors --------------------------------------------------------- @@ -116,6 +119,18 @@ public class SvnRepositoryServiceProvider extends RepositoryServiceProvider return new SvnBrowseCommand(context, repository); } + /** + * Method description + * + * + * @return + */ + @Override + public BundleCommand getBundleCommand() + { + return new SvnBundleCommand(context, repository); + } + /** * Method description * @@ -164,6 +179,18 @@ public class SvnRepositoryServiceProvider extends RepositoryServiceProvider return COMMANDS; } + /** + * Method description + * + * + * @return + */ + @Override + public UnbundleCommand getUnbundleCommand() + { + return new SvnUnbundleCommand(context, repository); + } + //~--- fields --------------------------------------------------------------- /** Field description */ diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnUnbundleCommand.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnUnbundleCommand.java new file mode 100644 index 0000000000..e83d0664e0 --- /dev/null +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnUnbundleCommand.java @@ -0,0 +1,155 @@ +/** +* Copyright (c) 2010, Sebastian Sdorra +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* 1. Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* 2. Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following disclaimer in the documentation +* and/or other materials provided with the distribution. +* 3. Neither the name of SCM-Manager; nor the names of its +* contributors may be used to endorse or promote products derived from this +* software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* http://bitbucket.org/sdorra/scm-manager +* +*/ + + + +package sonia.scm.repository.spi; + +//~--- non-JDK imports -------------------------------------------------------- + +import com.google.common.io.Closeables; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.tmatesoft.svn.core.SVNException; +import org.tmatesoft.svn.core.wc.SVNClientManager; +import org.tmatesoft.svn.core.wc.admin.SVNAdminClient; + +import sonia.scm.repository.Repository; +import sonia.scm.repository.SvnUtil; +import sonia.scm.repository.api.UnbundleResponse; + +import static com.google.common.base.Preconditions.*; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; + +/** + * + * @author Sebastian Sdorra + */ +public class SvnUnbundleCommand extends AbstractSvnCommand + implements UnbundleCommand +{ + + /** Field description */ + private static final Logger logger = + LoggerFactory.getLogger(SvnUnbundleCommand.class); + + //~--- constructors --------------------------------------------------------- + + /** + * Constructs ... + * + * + * @param context + * @param repository + */ + public SvnUnbundleCommand(SvnContext context, Repository repository) + { + super(context, repository); + } + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @param request + * + * @return + * + * @throws IOException + */ + @Override + public UnbundleResponse unbundle(UnbundleCommandRequest request) + throws IOException + { + File archive = checkNotNull(request.getArchive(), "archive is required"); + + logger.debug("archive repository {} to {}", context.getDirectory(), + archive); + + SVNClientManager clientManager = null; + + try + { + clientManager = SVNClientManager.newInstance(); + + SVNAdminClient adminClient = clientManager.getAdminClient(); + + restore(adminClient, archive, context.getDirectory()); + } + catch (SVNException ex) + { + throw new IOException("could not restore dump", ex); + } + finally + { + SvnUtil.dispose(clientManager); + } + + return new UnbundleResponse(); + } + + /** + * Method description + * + * + * @param adminClient + * @param dump + * @param repository + * + * @throws IOException + * @throws SVNException + */ + private void restore(SVNAdminClient adminClient, File dump, File repository) + throws SVNException, IOException + { + InputStream inputStream = null; + + try + { + inputStream = new FileInputStream(dump); + adminClient.doLoad(repository, inputStream); + } + finally + { + Closeables.close(inputStream, true); + } + } +}