diff --git a/scm-plugins/scm-git-plugin/src/main/java/org/eclipse/jgit/transport/ScmTransportProtocol.java b/scm-plugins/scm-git-plugin/src/main/java/org/eclipse/jgit/transport/ScmTransportProtocol.java index 6c5efe722c..61c3013f36 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/org/eclipse/jgit/transport/ScmTransportProtocol.java +++ b/scm-plugins/scm-git-plugin/src/main/java/org/eclipse/jgit/transport/ScmTransportProtocol.java @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package org.eclipse.jgit.transport; //~--- non-JDK imports -------------------------------------------------------- @@ -29,200 +29,106 @@ package org.eclipse.jgit.transport; import com.google.common.collect.ImmutableSet; import com.google.inject.Inject; import com.google.inject.Provider; - import org.eclipse.jgit.errors.NoRemoteRepositoryException; -import org.eclipse.jgit.errors.NotSupportedException; import org.eclipse.jgit.errors.TransportException; import org.eclipse.jgit.internal.JGitText; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.lib.RepositoryCache; - +import sonia.scm.repository.GitChangesetConverterFactory; import sonia.scm.repository.GitRepositoryHandler; import sonia.scm.repository.spi.HookEventFacade; import sonia.scm.web.CollectingPackParserListener; import sonia.scm.web.GitReceiveHook; -//~--- JDK imports ------------------------------------------------------------ - import java.io.File; - import java.util.Set; +//~--- JDK imports ------------------------------------------------------------ + /** - * * @author Sebastian Sdorra */ -public class ScmTransportProtocol extends TransportProtocol -{ +public class ScmTransportProtocol extends TransportProtocol { - /** Field description */ public static final String NAME = "scm"; - - /** Field description */ private static final Set SCHEMES = ImmutableSet.of(NAME); - //~--- constructors --------------------------------------------------------- + private Provider converterFactory; + private Provider hookEventFacadeProvider; + private Provider repositoryHandlerProvider; - /** - * Constructs ... - * - */ - public ScmTransportProtocol() {} + public ScmTransportProtocol() { + } - /** - * Constructs ... - * - * - * - * @param hookEventFacadeProvider - * - * @param repositoryHandlerProvider - */ @Inject public ScmTransportProtocol( + Provider converterFactory, Provider hookEventFacadeProvider, - Provider repositoryHandlerProvider) - { + Provider repositoryHandlerProvider) { + this.converterFactory = converterFactory; this.hookEventFacadeProvider = hookEventFacadeProvider; this.repositoryHandlerProvider = repositoryHandlerProvider; } - //~--- methods -------------------------------------------------------------- - - /** - * Method description - * - * - * @param uri - * @param local - * @param remoteName - * - * @return - */ @Override - public boolean canHandle(URIish uri, Repository local, String remoteName) - { - if ((uri.getPath() == null) || (uri.getPort() > 0) - || (uri.getUser() != null) || (uri.getPass() != null) - || (uri.getHost() != null) - || ((uri.getScheme() != null) &&!getSchemes().contains(uri.getScheme()))) - { - return false; - } - - return true; + public boolean canHandle(URIish uri, Repository local, String remoteName) { + return (uri.getPath() != null) && (uri.getPort() <= 0) + && (uri.getUser() == null) && (uri.getPass() == null) + && (uri.getHost() == null) + && ((uri.getScheme() == null) || getSchemes().contains(uri.getScheme())); } - /** - * Method description - * - * - * @param uri - * @param local - * @param remoteName - * - * @return - * - * @throws NotSupportedException - * @throws TransportException - */ @Override - public Transport open(URIish uri, Repository local, String remoteName) - throws TransportException - { + public Transport open(URIish uri, Repository local, String remoteName) throws TransportException { File localDirectory = local.getDirectory(); File path = local.getFS().resolve(localDirectory, uri.getPath()); File gitDir = RepositoryCache.FileKey.resolve(path, local.getFS()); - if (gitDir == null) - { + if (gitDir == null) { throw new NoRemoteRepositoryException(uri, JGitText.get().notFound); } - //J- return new TransportLocalWithHooks( + converterFactory.get(), hookEventFacadeProvider.get(), repositoryHandlerProvider.get(), local, uri, gitDir ); - //J+ } - //~--- get methods ---------------------------------------------------------- - - /** - * Method description - * - * - * @return - */ @Override - public String getName() - { + public String getName() { return NAME; } - /** - * Method description - * - * - * @return - */ @Override - public Set getSchemes() - { + public Set getSchemes() { return SCHEMES; } - //~--- inner classes -------------------------------------------------------- + private static class TransportLocalWithHooks extends TransportLocal { - /** - * Class description - * - * - * @version Enter version here..., 13/05/19 - * @author Enter your name here... - */ - private static class TransportLocalWithHooks extends TransportLocal - { + private final GitChangesetConverterFactory converterFactory; + private final GitRepositoryHandler handler; + private final HookEventFacade hookEventFacade; - /** - * Constructs ... - * - * - * - * @param hookEventFacade - * @param handler - * @param local - * @param uri - * @param gitDir - */ - public TransportLocalWithHooks(HookEventFacade hookEventFacade, - GitRepositoryHandler handler, Repository local, URIish uri, File gitDir) - { + public TransportLocalWithHooks( + GitChangesetConverterFactory converterFactory, + HookEventFacade hookEventFacade, + GitRepositoryHandler handler, + Repository local, URIish uri, File gitDir) { super(local, uri, gitDir); + this.converterFactory = converterFactory; this.hookEventFacade = hookEventFacade; this.handler = handler; } - //~--- methods ------------------------------------------------------------ - - /** - * Method description - * - * - * @param dst - * - * @return - */ @Override - ReceivePack createReceivePack(Repository dst) - { + ReceivePack createReceivePack(Repository dst) { ReceivePack pack = new ReceivePack(dst); - if ((hookEventFacade != null) && (handler != null)) - { - GitReceiveHook hook = new GitReceiveHook(hookEventFacade, handler); + if ((hookEventFacade != null) && (handler != null) && (converterFactory != null)) { + GitReceiveHook hook = new GitReceiveHook(converterFactory, hookEventFacade, handler); pack.setPreReceiveHook(hook); pack.setPostReceiveHook(hook); @@ -232,22 +138,6 @@ public class ScmTransportProtocol extends TransportProtocol return pack; } - - //~--- fields ------------------------------------------------------------- - - /** Field description */ - private GitRepositoryHandler handler; - - /** Field description */ - private HookEventFacade hookEventFacade; } - - //~--- fields --------------------------------------------------------------- - - /** Field description */ - private Provider hookEventFacadeProvider; - - /** Field description */ - private Provider repositoryHandlerProvider; } diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/protocolcommand/git/BaseReceivePackFactory.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/protocolcommand/git/BaseReceivePackFactory.java index 9b18991d1a..028e91009d 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/protocolcommand/git/BaseReceivePackFactory.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/protocolcommand/git/BaseReceivePackFactory.java @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.protocolcommand.git; import org.eclipse.jgit.lib.Repository; @@ -29,6 +29,7 @@ import org.eclipse.jgit.transport.ReceivePack; import org.eclipse.jgit.transport.resolver.ReceivePackFactory; import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException; import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException; +import sonia.scm.repository.GitChangesetConverterFactory; import sonia.scm.repository.GitRepositoryHandler; import sonia.scm.repository.spi.HookEventFacade; import sonia.scm.web.CollectingPackParserListener; @@ -39,9 +40,9 @@ public abstract class BaseReceivePackFactory implements ReceivePackFactory private final GitRepositoryHandler handler; private final GitReceiveHook hook; - protected BaseReceivePackFactory(GitRepositoryHandler handler, HookEventFacade hookEventFacade) { + protected BaseReceivePackFactory(GitChangesetConverterFactory converterFactory, GitRepositoryHandler handler, HookEventFacade hookEventFacade) { this.handler = handler; - this.hook = new GitReceiveHook(hookEventFacade, handler); + this.hook = new GitReceiveHook(converterFactory, hookEventFacade, handler); } @Override diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/protocolcommand/git/ScmReceivePackFactory.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/protocolcommand/git/ScmReceivePackFactory.java index f15ccfcf99..a999a57d4d 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/protocolcommand/git/ScmReceivePackFactory.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/protocolcommand/git/ScmReceivePackFactory.java @@ -21,21 +21,22 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.protocolcommand.git; import com.google.inject.Inject; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.transport.ReceivePack; import sonia.scm.protocolcommand.RepositoryContext; +import sonia.scm.repository.GitChangesetConverterFactory; import sonia.scm.repository.GitRepositoryHandler; import sonia.scm.repository.spi.HookEventFacade; public class ScmReceivePackFactory extends BaseReceivePackFactory { @Inject - public ScmReceivePackFactory(GitRepositoryHandler handler, HookEventFacade hookEventFacade) { - super(handler, hookEventFacade); + public ScmReceivePackFactory(GitChangesetConverterFactory converterFactory, GitRepositoryHandler handler, HookEventFacade hookEventFacade) { + super(converterFactory, handler, hookEventFacade); } @Override diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitChangesetConverter.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitChangesetConverter.java index 0f08f54aaa..3b8e6dadad 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitChangesetConverter.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitChangesetConverter.java @@ -67,7 +67,7 @@ public class GitChangesetConverter implements Closeable * * @param repository */ - public GitChangesetConverter(org.eclipse.jgit.lib.Repository repository) + GitChangesetConverter(org.eclipse.jgit.lib.Repository repository) { this(repository, null); } @@ -79,7 +79,7 @@ public class GitChangesetConverter implements Closeable * @param repository * @param revWalk */ - public GitChangesetConverter(org.eclipse.jgit.lib.Repository repository, + GitChangesetConverter(org.eclipse.jgit.lib.Repository repository, RevWalk revWalk) { this.repository = repository; diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitChangesetConverterFactory.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitChangesetConverterFactory.java new file mode 100644 index 0000000000..c5eb6e312a --- /dev/null +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitChangesetConverterFactory.java @@ -0,0 +1,40 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package sonia.scm.repository; + +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevWalk; + +public class GitChangesetConverterFactory { + + public GitChangesetConverter create(Repository repository) { + return new GitChangesetConverter(repository); + } + + public GitChangesetConverter create(Repository repository, RevWalk revWalk) { + return new GitChangesetConverter(repository, revWalk); + } + +} diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitHookChangesetCollector.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitHookChangesetCollector.java index 3071f590bc..5d7de5ce27 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitHookChangesetCollector.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitHookChangesetCollector.java @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- @@ -72,9 +72,10 @@ public class GitHookChangesetCollector * @param rpack * @param receiveCommands */ - public GitHookChangesetCollector(ReceivePack rpack, + public GitHookChangesetCollector(GitChangesetConverterFactory converterFactory, ReceivePack rpack, List receiveCommands) { + this.converterFactory = converterFactory; this.rpack = rpack; this.receiveCommands = receiveCommands; this.listener = CollectingPackParserListener.get(rpack); @@ -100,14 +101,14 @@ public class GitHookChangesetCollector try { walk = rpack.getRevWalk(); - converter = new GitChangesetConverter(repository, walk); + converter = converterFactory.create(repository, walk); for (ReceiveCommand rc : receiveCommands) { String ref = rc.getRefName(); - + logger.trace("handle receive command, type={}, ref={}, result={}", rc.getType(), ref, rc.getResult()); - + if (rc.getType() == ReceiveCommand.Type.DELETE) { logger.debug("skip delete of ref {}", ref); @@ -130,7 +131,7 @@ public class GitHookChangesetCollector builder.append(rc.getType()).append(", ref="); builder.append(rc.getRefName()).append(", result="); builder.append(rc.getResult()); - + logger.error(builder.toString(), ex); } } @@ -222,5 +223,6 @@ public class GitHookChangesetCollector private final List receiveCommands; + private final GitChangesetConverterFactory converterFactory; private final ReceivePack rpack; } diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/AbstractGitIncomingOutgoingCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/AbstractGitIncomingOutgoingCommand.java index 1b03a5a55e..94b1451d68 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/AbstractGitIncomingOutgoingCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/AbstractGitIncomingOutgoingCommand.java @@ -36,6 +36,7 @@ import org.eclipse.jgit.revwalk.RevWalk; import sonia.scm.repository.Changeset; import sonia.scm.repository.ChangesetPagingResult; import sonia.scm.repository.GitChangesetConverter; +import sonia.scm.repository.GitChangesetConverterFactory; import sonia.scm.repository.GitRepositoryHandler; import sonia.scm.repository.GitUtil; import sonia.scm.repository.InternalRepositoryException; @@ -58,18 +59,10 @@ public abstract class AbstractGitIncomingOutgoingCommand /** Field description */ private static final String REMOTE_REF_PREFIX = "refs/remote/scm/%s/"; - //~--- constructors --------------------------------------------------------- - - /** - * Constructs ... - * - * @param handler - * @param context - */ - AbstractGitIncomingOutgoingCommand(GitRepositoryHandler handler, GitContext context) - { + AbstractGitIncomingOutgoingCommand(GitContext context, GitRepositoryHandler handler, GitChangesetConverterFactory converterFactory) { super(context); this.handler = handler; + this.converterFactory = converterFactory; } //~--- methods -------------------------------------------------------------- @@ -132,7 +125,7 @@ public abstract class AbstractGitIncomingOutgoingCommand try { walk = new RevWalk(git.getRepository()); - converter = new GitChangesetConverter(git.getRepository(), walk); + converter = converterFactory.create(git.getRepository(), walk); org.eclipse.jgit.api.LogCommand log = git.log(); @@ -203,4 +196,5 @@ public abstract class AbstractGitIncomingOutgoingCommand /** Field description */ private GitRepositoryHandler handler; + private final GitChangesetConverterFactory converterFactory; } diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitHookChangesetProvider.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitHookChangesetProvider.java index 3280e2c5c4..1dbe652371 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitHookChangesetProvider.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitHookChangesetProvider.java @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- @@ -29,6 +29,7 @@ package sonia.scm.repository.spi; import org.eclipse.jgit.transport.ReceiveCommand; import org.eclipse.jgit.transport.ReceivePack; +import sonia.scm.repository.GitChangesetConverterFactory; import sonia.scm.repository.GitHookChangesetCollector; //~--- JDK imports ------------------------------------------------------------ @@ -39,56 +40,27 @@ import java.util.List; * * @author Sebastian Sdorra */ -public class GitHookChangesetProvider implements HookChangesetProvider -{ +public class GitHookChangesetProvider implements HookChangesetProvider { - /** - * Constructs ... - * - * - * @param receivePack - * @param receiveCommands - */ - public GitHookChangesetProvider(ReceivePack receivePack, - List receiveCommands) - { + private final GitChangesetConverterFactory converterFactory; + private final ReceivePack receivePack; + private final List receiveCommands; + + private HookChangesetResponse response; + + public GitHookChangesetProvider(GitChangesetConverterFactory converterFactory, ReceivePack receivePack, + List receiveCommands) { + this.converterFactory = converterFactory; this.receivePack = receivePack; this.receiveCommands = receiveCommands; } - //~--- methods -------------------------------------------------------------- - - /** - * Method description - * - * - * @param request - * - * @return - */ @Override - public synchronized HookChangesetResponse handleRequest( - HookChangesetRequest request) - { - if (response == null) - { - GitHookChangesetCollector collector = - new GitHookChangesetCollector(receivePack, receiveCommands); - + public synchronized HookChangesetResponse handleRequest(HookChangesetRequest request) { + if (response == null) { + GitHookChangesetCollector collector = new GitHookChangesetCollector(converterFactory, receivePack, receiveCommands); response = new HookChangesetResponse(collector.collectChangesets()); } - return response; } - - //~--- fields --------------------------------------------------------------- - - /** Field description */ - private List receiveCommands; - - /** Field description */ - private ReceivePack receivePack; - - /** Field description */ - private HookChangesetResponse response; } diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitHookContextProvider.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitHookContextProvider.java index 8e642a18ce..95843970e4 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitHookContextProvider.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitHookContextProvider.java @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- @@ -29,6 +29,7 @@ package sonia.scm.repository.spi; import org.eclipse.jgit.transport.ReceiveCommand; import org.eclipse.jgit.transport.ReceivePack; +import sonia.scm.repository.GitChangesetConverterFactory; import sonia.scm.repository.api.GitHookBranchProvider; import sonia.scm.repository.api.GitHookMessageProvider; import sonia.scm.repository.api.HookBranchProvider; @@ -63,12 +64,12 @@ public class GitHookContextProvider extends HookContextProvider * @param receivePack git receive pack * @param receiveCommands received commands */ - public GitHookContextProvider(ReceivePack receivePack, - List receiveCommands) + public GitHookContextProvider(GitChangesetConverterFactory converterFactory, ReceivePack receivePack, + List receiveCommands) { this.receivePack = receivePack; this.receiveCommands = receiveCommands; - this.changesetProvider = new GitHookChangesetProvider(receivePack, + this.changesetProvider = new GitHookChangesetProvider(converterFactory, receivePack, receiveCommands); } diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitIncomingCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitIncomingCommand.java index 638983b6f1..205d9e9e3f 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitIncomingCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitIncomingCommand.java @@ -29,6 +29,7 @@ package sonia.scm.repository.spi; import org.eclipse.jgit.api.LogCommand; import org.eclipse.jgit.lib.ObjectId; import sonia.scm.repository.ChangesetPagingResult; +import sonia.scm.repository.GitChangesetConverterFactory; import sonia.scm.repository.GitRepositoryHandler; import javax.inject.Inject; @@ -41,19 +42,11 @@ import java.io.IOException; * @author Sebastian Sdorra */ public class GitIncomingCommand extends AbstractGitIncomingOutgoingCommand - implements IncomingCommand -{ + implements IncomingCommand { - /** - * Constructs ... - * - * @param handler - * @param context - */ @Inject - GitIncomingCommand(GitRepositoryHandler handler, GitContext context) - { - super(handler, context); + GitIncomingCommand(GitContext context, GitRepositoryHandler handler, GitChangesetConverterFactory converterFactory) { + super(context, handler, converterFactory); } //~--- get methods ---------------------------------------------------------- diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitLogCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitLogCommand.java index b1205de975..bd50d0fb07 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitLogCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitLogCommand.java @@ -43,6 +43,7 @@ import sonia.scm.NotFoundException; import sonia.scm.repository.Changeset; import sonia.scm.repository.ChangesetPagingResult; import sonia.scm.repository.GitChangesetConverter; +import sonia.scm.repository.GitChangesetConverterFactory; import sonia.scm.repository.GitUtil; import sonia.scm.repository.InternalRepositoryException; import sonia.scm.util.IOUtil; @@ -71,6 +72,7 @@ public class GitLogCommand extends AbstractGitCommand implements LogCommand private static final Logger logger = LoggerFactory.getLogger(GitLogCommand.class); public static final String REVISION = "Revision"; + private final GitChangesetConverterFactory converterFactory; //~--- constructors --------------------------------------------------------- @@ -82,9 +84,10 @@ public class GitLogCommand extends AbstractGitCommand implements LogCommand * */ @Inject - GitLogCommand(GitContext context) + GitLogCommand(GitContext context, GitChangesetConverterFactory converterFactory) { super(context); + this.converterFactory = converterFactory; } //~--- get methods ---------------------------------------------------------- @@ -122,7 +125,7 @@ public class GitLogCommand extends AbstractGitCommand implements LogCommand if (commit != null) { - converter = new GitChangesetConverter(gr, revWalk); + converter = converterFactory.create(gr, revWalk); if (isBranchRequested(request)) { String branch = request.getBranch(); @@ -233,7 +236,7 @@ public class GitLogCommand extends AbstractGitCommand implements LogCommand revWalk = new RevWalk(repository); - converter = new GitChangesetConverter(repository, revWalk); + converter = converterFactory.create(repository, revWalk); if (!Strings.isNullOrEmpty(request.getPath())) { revWalk.setTreeFilter( diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitOutgoingCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitOutgoingCommand.java index bfb319df10..30192d4297 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitOutgoingCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitOutgoingCommand.java @@ -29,6 +29,7 @@ package sonia.scm.repository.spi; import org.eclipse.jgit.api.LogCommand; import org.eclipse.jgit.lib.ObjectId; import sonia.scm.repository.ChangesetPagingResult; +import sonia.scm.repository.GitChangesetConverterFactory; import sonia.scm.repository.GitRepositoryHandler; import javax.inject.Inject; @@ -41,19 +42,12 @@ import java.io.IOException; * @author Sebastian Sdorra */ public class GitOutgoingCommand extends AbstractGitIncomingOutgoingCommand - implements OutgoingCommand -{ + implements OutgoingCommand { - /** - * Constructs ... - * - * @param handler - * @param context - */ @Inject - GitOutgoingCommand(GitRepositoryHandler handler, GitContext context) + GitOutgoingCommand(GitContext context, GitRepositoryHandler handler, GitChangesetConverterFactory converterFactory) { - super(handler, context); + super(context, handler, converterFactory); } //~--- get methods ---------------------------------------------------------- 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 75b0f97b3f..fae69a47cf 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 @@ -117,7 +117,7 @@ public class GitRepositoryServiceProvider extends RepositoryServiceProvider @Override public LogCommand getLogCommand() { - return new GitLogCommand(context); + return commandInjector.getInstance(GitLogCommand.class); } @Override diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitReceiveHook.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitReceiveHook.java index c7b323224c..4c127ca9af 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitReceiveHook.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitReceiveHook.java @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.web; //~--- non-JDK imports -------------------------------------------------------- @@ -34,6 +34,7 @@ import org.eclipse.jgit.transport.ReceiveCommand; import org.eclipse.jgit.transport.ReceivePack; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import sonia.scm.repository.GitChangesetConverterFactory; import sonia.scm.repository.GitRepositoryHandler; import sonia.scm.repository.RepositoryHookType; import sonia.scm.repository.spi.GitHookContextProvider; @@ -66,9 +67,10 @@ public class GitReceiveHook implements PreReceiveHook, PostReceiveHook * @param hookEventFacade * @param handler */ - public GitReceiveHook(HookEventFacade hookEventFacade, - GitRepositoryHandler handler) + public GitReceiveHook(GitChangesetConverterFactory converterFactory, HookEventFacade hookEventFacade, + GitRepositoryHandler handler) { + this.converterFactory = converterFactory; this.hookEventFacade = hookEventFacade; this.handler = handler; } @@ -122,7 +124,7 @@ public class GitReceiveHook implements PreReceiveHook, PostReceiveHook logger.trace("resolved repository to {}", repositoryId); - GitHookContextProvider context = new GitHookContextProvider(rpack, + GitHookContextProvider context = new GitHookContextProvider(converterFactory, rpack, receiveCommands); hookEventFacade.handle(repositoryId).fireHookEvent(type, context); @@ -188,6 +190,7 @@ public class GitReceiveHook implements PreReceiveHook, PostReceiveHook /** Field description */ private GitRepositoryHandler handler; + private final GitChangesetConverterFactory converterFactory; /** Field description */ private HookEventFacade hookEventFacade; } diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitReceivePackFactory.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitReceivePackFactory.java index b4b43ea5b5..dc18189da9 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitReceivePackFactory.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitReceivePackFactory.java @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.web; //~--- non-JDK imports -------------------------------------------------------- @@ -34,6 +34,7 @@ import org.eclipse.jgit.transport.resolver.ReceivePackFactory; import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException; import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException; import sonia.scm.protocolcommand.git.BaseReceivePackFactory; +import sonia.scm.repository.GitChangesetConverterFactory; import sonia.scm.repository.GitRepositoryHandler; import sonia.scm.repository.spi.HookEventFacade; @@ -53,8 +54,8 @@ public class GitReceivePackFactory extends BaseReceivePackFactory wrapped; @Inject - public GitReceivePackFactory(GitRepositoryHandler handler, HookEventFacade hookEventFacade) { - super(handler, hookEventFacade); + public GitReceivePackFactory(GitChangesetConverterFactory converterFactory, GitRepositoryHandler handler, HookEventFacade hookEventFacade) { + super(converterFactory, handler, hookEventFacade); this.wrapped = new DefaultReceivePackFactory(); } diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/protocolcommand/git/BaseReceivePackFactoryTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/protocolcommand/git/BaseReceivePackFactoryTest.java index 8fa2ecddaa..d6de6a0780 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/protocolcommand/git/BaseReceivePackFactoryTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/protocolcommand/git/BaseReceivePackFactoryTest.java @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.protocolcommand.git; import org.eclipse.jgit.api.Git; @@ -38,6 +38,7 @@ import org.junit.rules.TemporaryFolder; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; +import sonia.scm.repository.GitChangesetConverterFactory; import sonia.scm.repository.GitConfig; import sonia.scm.repository.GitRepositoryHandler; import sonia.scm.web.CollectingPackParserListener; @@ -82,7 +83,7 @@ public class BaseReceivePackFactoryTest { ReceivePack receivePack = new ReceivePack(repository); when(wrappedReceivePackFactory.create(request, repository)).thenReturn(receivePack); - factory = new BaseReceivePackFactory(handler, null) { + factory = new BaseReceivePackFactory(new GitChangesetConverterFactory(), handler, null) { @Override protected ReceivePack createBasicReceivePack(Object request, Repository repository) throws ServiceNotEnabledException, ServiceNotAuthorizedException { return wrappedReceivePackFactory.create(request, repository); diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/client/spi/GitCommitCommand.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/client/spi/GitCommitCommand.java index 01b0112b72..9ea196c951 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/client/spi/GitCommitCommand.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/client/spi/GitCommitCommand.java @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.repository.client.spi; //~--- non-JDK imports -------------------------------------------------------- @@ -32,6 +32,7 @@ import org.eclipse.jgit.revwalk.RevCommit; import sonia.scm.repository.Changeset; import sonia.scm.repository.GitChangesetConverter; +import sonia.scm.repository.GitChangesetConverterFactory; import sonia.scm.repository.client.api.RepositoryClientException; //~--- JDK imports ------------------------------------------------------------ @@ -71,7 +72,8 @@ public class GitCommitCommand implements CommitCommand @Override public Changeset commit(CommitRequest request) throws IOException { - try (GitChangesetConverter converter = new GitChangesetConverter(git.getRepository())) + GitChangesetConverterFactory converterFactory = new GitChangesetConverterFactory(); + try (GitChangesetConverter converter = converterFactory.create(git.getRepository())) { RevCommit commit = git.commit() .setAuthor(request.getAuthor().getName(), request.getAuthor().getMail()) diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/AbstractRemoteCommandTestBase.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/AbstractRemoteCommandTestBase.java index 01477e6bd9..36d0002de2 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/AbstractRemoteCommandTestBase.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/AbstractRemoteCommandTestBase.java @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- @@ -40,6 +40,7 @@ import org.junit.Before; import org.junit.Rule; import org.junit.rules.TemporaryFolder; import sonia.scm.repository.Changeset; +import sonia.scm.repository.GitChangesetConverterFactory; import sonia.scm.repository.GitRepositoryHandler; import sonia.scm.repository.Repository; import sonia.scm.user.User; @@ -110,23 +111,7 @@ public class AbstractRemoteCommandTestBase { // store reference to handle weak references - proto = new ScmTransportProtocol(new Provider() - { - - @Override - public HookEventFacade get() - { - return null; - } - }, new Provider() - { - - @Override - public GitRepositoryHandler get() - { - return null; - } - }); + proto = new ScmTransportProtocol(GitChangesetConverterFactory::new, () -> null, () -> null); Transport.register(proto); } diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/BindTransportProtocolRule.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/BindTransportProtocolRule.java index cd2d537038..7e48c10b8c 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/BindTransportProtocolRule.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/BindTransportProtocolRule.java @@ -21,12 +21,13 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.repository.spi; import org.eclipse.jgit.transport.ScmTransportProtocol; import org.eclipse.jgit.transport.Transport; import org.junit.rules.ExternalResource; +import sonia.scm.repository.GitChangesetConverterFactory; import sonia.scm.repository.GitRepositoryHandler; import sonia.scm.repository.PreProcessorUtil; import sonia.scm.repository.RepositoryManager; @@ -47,7 +48,7 @@ public class BindTransportProtocolRule extends ExternalResource { RepositoryManager repositoryManager = mock(RepositoryManager.class); HookEventFacade hookEventFacade = new HookEventFacade(of(repositoryManager), hookContextFactory); GitRepositoryHandler gitRepositoryHandler = mock(GitRepositoryHandler.class); - scmTransportProtocol = new ScmTransportProtocol(of(hookEventFacade), of(gitRepositoryHandler)); + scmTransportProtocol = new ScmTransportProtocol(of(new GitChangesetConverterFactory()), of(hookEventFacade), of(gitRepositoryHandler)); Transport.register(scmTransportProtocol); diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitIncomingCommandTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitIncomingCommandTest.java index 0ffa917a14..edf2500e1e 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitIncomingCommandTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitIncomingCommandTest.java @@ -32,6 +32,7 @@ import org.junit.Ignore; import org.junit.Test; import sonia.scm.api.v2.resources.GitRepositoryConfigStoreProvider; import sonia.scm.repository.ChangesetPagingResult; +import sonia.scm.repository.GitChangesetConverterFactory; import sonia.scm.store.InMemoryConfigurationStoreFactory; import java.io.IOException; @@ -173,14 +174,11 @@ public class GitIncomingCommandTest assertEquals(0, cpr.getTotal()); } - /** - * Method description - * - * - * @return - */ - private GitIncomingCommand createCommand() - { - return new GitIncomingCommand(handler, new GitContext(incomingDirectory, incomingRepository, new GitRepositoryConfigStoreProvider(new InMemoryConfigurationStoreFactory()))); + private GitIncomingCommand createCommand() { + return new GitIncomingCommand( + new GitContext(incomingDirectory, incomingRepository, new GitRepositoryConfigStoreProvider(new InMemoryConfigurationStoreFactory())), + handler, + new GitChangesetConverterFactory() + ); } } diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitLogCommandAncestorTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitLogCommandAncestorTest.java index 6fcb9303cb..a6c08120e7 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitLogCommandAncestorTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitLogCommandAncestorTest.java @@ -27,6 +27,7 @@ package sonia.scm.repository.spi; import org.junit.Test; import sonia.scm.NotFoundException; import sonia.scm.repository.ChangesetPagingResult; +import sonia.scm.repository.GitChangesetConverterFactory; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -108,8 +109,7 @@ public class GitLogCommandAncestorTest extends AbstractGitCommandTestBase createCommand().getChangesets(request); } - private GitLogCommand createCommand() - { - return new GitLogCommand(createContext()); + private GitLogCommand createCommand() { + return new GitLogCommand(createContext(), new GitChangesetConverterFactory()); } } diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitLogCommandTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitLogCommandTest.java index 2a8c40db58..df3fd2a702 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitLogCommandTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitLogCommandTest.java @@ -31,6 +31,7 @@ import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import sonia.scm.repository.Changeset; import sonia.scm.repository.ChangesetPagingResult; +import sonia.scm.repository.GitChangesetConverterFactory; import sonia.scm.repository.GitRepositoryConfig; import sonia.scm.repository.Modifications; import sonia.scm.repository.Person; @@ -293,8 +294,7 @@ public class GitLogCommandTest extends AbstractGitCommandTestBase return new File(repositoryDirectory, "HEAD"); } - private GitLogCommand createCommand() - { - return new GitLogCommand(createContext()); + private GitLogCommand createCommand() { + return new GitLogCommand(createContext(), new GitChangesetConverterFactory()); } } diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitOutgoingCommandTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitOutgoingCommandTest.java index 5c7a491c72..890704841a 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitOutgoingCommandTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitOutgoingCommandTest.java @@ -31,6 +31,7 @@ import org.eclipse.jgit.revwalk.RevCommit; import org.junit.Test; import sonia.scm.api.v2.resources.GitRepositoryConfigStoreProvider; import sonia.scm.repository.ChangesetPagingResult; +import sonia.scm.repository.GitChangesetConverterFactory; import sonia.scm.store.InMemoryConfigurationStoreFactory; import java.io.IOException; @@ -151,6 +152,10 @@ public class GitOutgoingCommandTest extends AbstractRemoteCommandTestBase */ private GitOutgoingCommand createCommand() { - return new GitOutgoingCommand(handler, new GitContext(outgoingDirectory, outgoingRepository, new GitRepositoryConfigStoreProvider(new InMemoryConfigurationStoreFactory()))); + return new GitOutgoingCommand( + new GitContext(outgoingDirectory, outgoingRepository, new GitRepositoryConfigStoreProvider(new InMemoryConfigurationStoreFactory())), + handler, + new GitChangesetConverterFactory() + ); } } 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 9a32b5d01c..c8762bde01 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 @@ -34,6 +34,7 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; +import sonia.scm.repository.GitChangesetConverterFactory; import sonia.scm.repository.GitRepositoryHandler; import sonia.scm.repository.PreProcessorUtil; import sonia.scm.repository.RepositoryManager; @@ -65,7 +66,7 @@ public class SimpleGitWorkingCopyFactoryTest extends AbstractGitCommandTestBase HookContextFactory hookContextFactory = new HookContextFactory(mock(PreProcessorUtil.class)); HookEventFacade hookEventFacade = new HookEventFacade(of(mock(RepositoryManager.class)), hookContextFactory); GitRepositoryHandler gitRepositoryHandler = mock(GitRepositoryHandler.class); - proto = new ScmTransportProtocol(of(hookEventFacade), of(gitRepositoryHandler)); + proto = new ScmTransportProtocol(of(new GitChangesetConverterFactory()), of(hookEventFacade), of(gitRepositoryHandler)); Transport.register(proto); workdirProvider = new WorkdirProvider(temporaryFolder.newFolder()); }