From 01ce67694e8b13ecca241b748dc22b0281bad4d6 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Mon, 20 May 2013 16:19:59 +0200 Subject: [PATCH] implement pull command for git --- .../spi/AbstractPushOrPullCommand.java | 134 ++++++++++++++++++ .../scm/repository/spi/GitPullCommand.java | 122 ++++++++++++++++ .../scm/repository/spi/GitPushCommand.java | 31 ++-- .../spi/GitRepositoryServiceProvider.java | 15 +- 4 files changed, 279 insertions(+), 23 deletions(-) create mode 100644 scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/AbstractPushOrPullCommand.java create mode 100644 scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitPullCommand.java diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/AbstractPushOrPullCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/AbstractPushOrPullCommand.java new file mode 100644 index 0000000000..83130fc150 --- /dev/null +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/AbstractPushOrPullCommand.java @@ -0,0 +1,134 @@ +/** + * 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.base.Preconditions; + +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.lib.Repository; + +import sonia.scm.repository.RepositoryException; +import sonia.scm.repository.api.PushResponse; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.File; +import java.io.IOException; + +/** + * + * @author Sebastian Sdorra + */ +public abstract class AbstractPushOrPullCommand extends AbstractGitCommand +{ + + /** Field description */ + private static final String SCHEME = "scm://"; + + //~--- constructors --------------------------------------------------------- + + /** + * Constructs ... + * + * + * @param context + * @param repository + */ + public AbstractPushOrPullCommand(GitContext context, + sonia.scm.repository.Repository repository) + { + super(context, repository); + } + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @param request + * + * @param source + * @param target + * + * @return + * + * @throws IOException + * @throws RepositoryException + */ + protected PushResponse push(Repository source, File target) + throws IOException, RepositoryException + { + PushResponse response = null; + org.eclipse.jgit.api.PushCommand push = Git.wrap(source).push(); + + push.setPushAll().setPushTags(); + push.setRemote(SCHEME.concat(target.getAbsolutePath())); + + try + { + push.call(); + } + catch (Exception ex) + { + throw new RepositoryException("could not execute push command", ex); + } + + return response; + } + + //~--- get methods ---------------------------------------------------------- + + /** + * Method description + * + * + * @param request + * + * @return + */ + protected sonia.scm.repository.Repository getRemoteRepository( + RemoteCommandRequest request) + { + Preconditions.checkNotNull(request, "request is required"); + + sonia.scm.repository.Repository remoteRepository = + request.getRemoteRepository(); + + Preconditions.checkNotNull(remoteRepository, + "remote repository is required"); + + return remoteRepository; + } +} diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitPullCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitPullCommand.java new file mode 100644 index 0000000000..d39f71eece --- /dev/null +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitPullCommand.java @@ -0,0 +1,122 @@ +/** + * 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.base.Preconditions; + +import org.eclipse.jgit.storage.file.FileRepository; + +import sonia.scm.repository.GitRepositoryHandler; +import sonia.scm.repository.GitUtil; +import sonia.scm.repository.Repository; +import sonia.scm.repository.RepositoryException; +import sonia.scm.repository.api.PullResponse; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.File; +import java.io.IOException; + +/** + * + * @author Sebastian Sdorra + */ +public class GitPullCommand extends AbstractPushOrPullCommand + implements PullCommand +{ + + /** + * Constructs ... + * + * + * @param repositoryHandler + * @param context + * @param repository + */ + public GitPullCommand(GitRepositoryHandler repositoryHandler, + GitContext context, Repository repository) + { + super(context, repository); + this.repositoryHandler = repositoryHandler; + } + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @param request + * + * @return + * + * @throws IOException + * @throws RepositoryException + */ + @Override + public PullResponse pull(PullCommandRequest request) + throws IOException, RepositoryException + { + Repository sourceRepository = getRemoteRepository(request); + + File sourceDirectory = repositoryHandler.getDirectory(sourceRepository); + + Preconditions.checkArgument(sourceDirectory.exists(), + "source repository directory does not exists"); + + File targetDirectory = repositoryHandler.getDirectory(repository); + + Preconditions.checkArgument(sourceDirectory.exists(), + "target repository directory does not exists"); + + org.eclipse.jgit.lib.Repository source = null; + + try + { + source = new FileRepository(sourceDirectory); + push(source, targetDirectory); + } + finally + { + GitUtil.close(source); + } + + return new PullResponse(); + } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + private GitRepositoryHandler repositoryHandler; +} diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitPushCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitPushCommand.java index 5d4c401fec..097ee4d0ad 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitPushCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitPushCommand.java @@ -33,7 +33,7 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- -import org.eclipse.jgit.api.Git; +import com.google.common.base.Preconditions; import sonia.scm.repository.GitRepositoryHandler; import sonia.scm.repository.Repository; @@ -49,14 +49,10 @@ import java.io.IOException; * * @author Sebastian Sdorra */ -public class GitPushCommand extends AbstractGitCommand implements PushCommand +public class GitPushCommand extends AbstractPushOrPullCommand + implements PushCommand { - /** Field description */ - private static final String SCHEME = "scm://"; - - //~--- constructors --------------------------------------------------------- - /** * Constructs ... * @@ -89,24 +85,15 @@ public class GitPushCommand extends AbstractGitCommand implements PushCommand public PushResponse push(PushCommandRequest request) throws IOException, RepositoryException { - PushResponse response = null; - File remoteRepository = handler.getDirectory(request.getRemoteRepository()); - org.eclipse.jgit.api.PushCommand push = Git.wrap(open()).push(); + Repository target = getRemoteRepository(request); + File targetDirectory = handler.getDirectory(target); - push.setPushAll().setPushTags(); - push.setRemote(SCHEME.concat(remoteRepository.getAbsolutePath())); + Preconditions.checkArgument(targetDirectory.exists(), + "target repository directory does not exists"); - try - { - push.call(); - response = new PushResponse(); - } - catch (Exception ex) - { - throw new RepositoryException("could not execute push command", ex); - } + push(open(), targetDirectory); - return response; + return new PushResponse(); } //~--- fields --------------------------------------------------------------- diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitRepositoryServiceProvider.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitRepositoryServiceProvider.java index c4db747f87..c6e49ef2d4 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitRepositoryServiceProvider.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitRepositoryServiceProvider.java @@ -66,7 +66,8 @@ public class GitRepositoryServiceProvider extends RepositoryServiceProvider Command.BRANCHES, Command.INCOMING, Command.OUTGOING, - Command.PUSH + Command.PUSH, + Command.PULL ); //J+ @@ -187,6 +188,18 @@ public class GitRepositoryServiceProvider extends RepositoryServiceProvider return new GitLogCommand(context, repository); } + /** + * Method description + * + * + * @return + */ + @Override + public PullCommand getPullCommand() + { + return new GitPullCommand(handler, context, repository); + } + /** * Method description *