introduces GitChangesetConverterFactory

This change introduces a GitChangesetConverterFactory to allow injections for the GitChangesetConverter.
This commit is contained in:
Sebastian Sdorra
2020-07-21 07:05:26 +02:00
parent 6e27051ed9
commit 7cb349242c
24 changed files with 179 additions and 291 deletions

View File

@@ -21,7 +21,7 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE. * SOFTWARE.
*/ */
package org.eclipse.jgit.transport; package org.eclipse.jgit.transport;
//~--- non-JDK imports -------------------------------------------------------- //~--- non-JDK imports --------------------------------------------------------
@@ -29,200 +29,106 @@ package org.eclipse.jgit.transport;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.Provider; import com.google.inject.Provider;
import org.eclipse.jgit.errors.NoRemoteRepositoryException; import org.eclipse.jgit.errors.NoRemoteRepositoryException;
import org.eclipse.jgit.errors.NotSupportedException;
import org.eclipse.jgit.errors.TransportException; import org.eclipse.jgit.errors.TransportException;
import org.eclipse.jgit.internal.JGitText; import org.eclipse.jgit.internal.JGitText;
import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.RepositoryCache; import org.eclipse.jgit.lib.RepositoryCache;
import sonia.scm.repository.GitChangesetConverterFactory;
import sonia.scm.repository.GitRepositoryHandler; import sonia.scm.repository.GitRepositoryHandler;
import sonia.scm.repository.spi.HookEventFacade; import sonia.scm.repository.spi.HookEventFacade;
import sonia.scm.web.CollectingPackParserListener; import sonia.scm.web.CollectingPackParserListener;
import sonia.scm.web.GitReceiveHook; import sonia.scm.web.GitReceiveHook;
//~--- JDK imports ------------------------------------------------------------
import java.io.File; import java.io.File;
import java.util.Set; import java.util.Set;
//~--- JDK imports ------------------------------------------------------------
/** /**
*
* @author Sebastian Sdorra * @author Sebastian Sdorra
*/ */
public class ScmTransportProtocol extends TransportProtocol public class ScmTransportProtocol extends TransportProtocol {
{
/** Field description */
public static final String NAME = "scm"; public static final String NAME = "scm";
/** Field description */
private static final Set<String> SCHEMES = ImmutableSet.of(NAME); private static final Set<String> SCHEMES = ImmutableSet.of(NAME);
//~--- constructors --------------------------------------------------------- private Provider<GitChangesetConverterFactory> converterFactory;
private Provider<HookEventFacade> hookEventFacadeProvider;
private Provider<GitRepositoryHandler> repositoryHandlerProvider;
/** public ScmTransportProtocol() {
* Constructs ... }
*
*/
public ScmTransportProtocol() {}
/**
* Constructs ...
*
*
*
* @param hookEventFacadeProvider
*
* @param repositoryHandlerProvider
*/
@Inject @Inject
public ScmTransportProtocol( public ScmTransportProtocol(
Provider<GitChangesetConverterFactory> converterFactory,
Provider<HookEventFacade> hookEventFacadeProvider, Provider<HookEventFacade> hookEventFacadeProvider,
Provider<GitRepositoryHandler> repositoryHandlerProvider) Provider<GitRepositoryHandler> repositoryHandlerProvider) {
{ this.converterFactory = converterFactory;
this.hookEventFacadeProvider = hookEventFacadeProvider; this.hookEventFacadeProvider = hookEventFacadeProvider;
this.repositoryHandlerProvider = repositoryHandlerProvider; this.repositoryHandlerProvider = repositoryHandlerProvider;
} }
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*
* @param uri
* @param local
* @param remoteName
*
* @return
*/
@Override @Override
public boolean canHandle(URIish uri, Repository local, String remoteName) public boolean canHandle(URIish uri, Repository local, String remoteName) {
{ return (uri.getPath() != null) && (uri.getPort() <= 0)
if ((uri.getPath() == null) || (uri.getPort() > 0) && (uri.getUser() == null) && (uri.getPass() == null)
|| (uri.getUser() != null) || (uri.getPass() != null) && (uri.getHost() == null)
|| (uri.getHost() != null) && ((uri.getScheme() == null) || getSchemes().contains(uri.getScheme()));
|| ((uri.getScheme() != null) &&!getSchemes().contains(uri.getScheme())))
{
return false;
}
return true;
} }
/**
* Method description
*
*
* @param uri
* @param local
* @param remoteName
*
* @return
*
* @throws NotSupportedException
* @throws TransportException
*/
@Override @Override
public Transport open(URIish uri, Repository local, String remoteName) public Transport open(URIish uri, Repository local, String remoteName) throws TransportException {
throws TransportException
{
File localDirectory = local.getDirectory(); File localDirectory = local.getDirectory();
File path = local.getFS().resolve(localDirectory, uri.getPath()); File path = local.getFS().resolve(localDirectory, uri.getPath());
File gitDir = RepositoryCache.FileKey.resolve(path, local.getFS()); File gitDir = RepositoryCache.FileKey.resolve(path, local.getFS());
if (gitDir == null) if (gitDir == null) {
{
throw new NoRemoteRepositoryException(uri, JGitText.get().notFound); throw new NoRemoteRepositoryException(uri, JGitText.get().notFound);
} }
//J-
return new TransportLocalWithHooks( return new TransportLocalWithHooks(
converterFactory.get(),
hookEventFacadeProvider.get(), hookEventFacadeProvider.get(),
repositoryHandlerProvider.get(), repositoryHandlerProvider.get(),
local, uri, gitDir local, uri, gitDir
); );
//J+
} }
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @return
*/
@Override @Override
public String getName() public String getName() {
{
return NAME; return NAME;
} }
/**
* Method description
*
*
* @return
*/
@Override @Override
public Set<String> getSchemes() public Set<String> getSchemes() {
{
return SCHEMES; return SCHEMES;
} }
//~--- inner classes -------------------------------------------------------- private static class TransportLocalWithHooks extends TransportLocal {
/** private final GitChangesetConverterFactory converterFactory;
* Class description private final GitRepositoryHandler handler;
* private final HookEventFacade hookEventFacade;
*
* @version Enter version here..., 13/05/19
* @author Enter your name here...
*/
private static class TransportLocalWithHooks extends TransportLocal
{
/** public TransportLocalWithHooks(
* Constructs ... GitChangesetConverterFactory converterFactory,
* HookEventFacade hookEventFacade,
* GitRepositoryHandler handler,
* Repository local, URIish uri, File gitDir) {
* @param hookEventFacade
* @param handler
* @param local
* @param uri
* @param gitDir
*/
public TransportLocalWithHooks(HookEventFacade hookEventFacade,
GitRepositoryHandler handler, Repository local, URIish uri, File gitDir)
{
super(local, uri, gitDir); super(local, uri, gitDir);
this.converterFactory = converterFactory;
this.hookEventFacade = hookEventFacade; this.hookEventFacade = hookEventFacade;
this.handler = handler; this.handler = handler;
} }
//~--- methods ------------------------------------------------------------
/**
* Method description
*
*
* @param dst
*
* @return
*/
@Override @Override
ReceivePack createReceivePack(Repository dst) ReceivePack createReceivePack(Repository dst) {
{
ReceivePack pack = new ReceivePack(dst); ReceivePack pack = new ReceivePack(dst);
if ((hookEventFacade != null) && (handler != null)) if ((hookEventFacade != null) && (handler != null) && (converterFactory != null)) {
{ GitReceiveHook hook = new GitReceiveHook(converterFactory, hookEventFacade, handler);
GitReceiveHook hook = new GitReceiveHook(hookEventFacade, handler);
pack.setPreReceiveHook(hook); pack.setPreReceiveHook(hook);
pack.setPostReceiveHook(hook); pack.setPostReceiveHook(hook);
@@ -232,22 +138,6 @@ public class ScmTransportProtocol extends TransportProtocol
return pack; return pack;
} }
//~--- fields -------------------------------------------------------------
/** Field description */
private GitRepositoryHandler handler;
/** Field description */
private HookEventFacade hookEventFacade;
} }
//~--- fields ---------------------------------------------------------------
/** Field description */
private Provider<HookEventFacade> hookEventFacadeProvider;
/** Field description */
private Provider<GitRepositoryHandler> repositoryHandlerProvider;
} }

View File

@@ -21,7 +21,7 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE. * SOFTWARE.
*/ */
package sonia.scm.protocolcommand.git; package sonia.scm.protocolcommand.git;
import org.eclipse.jgit.lib.Repository; 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.ReceivePackFactory;
import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException; import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException;
import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException; import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
import sonia.scm.repository.GitChangesetConverterFactory;
import sonia.scm.repository.GitRepositoryHandler; import sonia.scm.repository.GitRepositoryHandler;
import sonia.scm.repository.spi.HookEventFacade; import sonia.scm.repository.spi.HookEventFacade;
import sonia.scm.web.CollectingPackParserListener; import sonia.scm.web.CollectingPackParserListener;
@@ -39,9 +40,9 @@ public abstract class BaseReceivePackFactory<T> implements ReceivePackFactory<T>
private final GitRepositoryHandler handler; private final GitRepositoryHandler handler;
private final GitReceiveHook hook; private final GitReceiveHook hook;
protected BaseReceivePackFactory(GitRepositoryHandler handler, HookEventFacade hookEventFacade) { protected BaseReceivePackFactory(GitChangesetConverterFactory converterFactory, GitRepositoryHandler handler, HookEventFacade hookEventFacade) {
this.handler = handler; this.handler = handler;
this.hook = new GitReceiveHook(hookEventFacade, handler); this.hook = new GitReceiveHook(converterFactory, hookEventFacade, handler);
} }
@Override @Override

View File

@@ -21,21 +21,22 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE. * SOFTWARE.
*/ */
package sonia.scm.protocolcommand.git; package sonia.scm.protocolcommand.git;
import com.google.inject.Inject; import com.google.inject.Inject;
import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.transport.ReceivePack; import org.eclipse.jgit.transport.ReceivePack;
import sonia.scm.protocolcommand.RepositoryContext; import sonia.scm.protocolcommand.RepositoryContext;
import sonia.scm.repository.GitChangesetConverterFactory;
import sonia.scm.repository.GitRepositoryHandler; import sonia.scm.repository.GitRepositoryHandler;
import sonia.scm.repository.spi.HookEventFacade; import sonia.scm.repository.spi.HookEventFacade;
public class ScmReceivePackFactory extends BaseReceivePackFactory<RepositoryContext> { public class ScmReceivePackFactory extends BaseReceivePackFactory<RepositoryContext> {
@Inject @Inject
public ScmReceivePackFactory(GitRepositoryHandler handler, HookEventFacade hookEventFacade) { public ScmReceivePackFactory(GitChangesetConverterFactory converterFactory, GitRepositoryHandler handler, HookEventFacade hookEventFacade) {
super(handler, hookEventFacade); super(converterFactory, handler, hookEventFacade);
} }
@Override @Override

View File

@@ -67,7 +67,7 @@ public class GitChangesetConverter implements Closeable
* *
* @param repository * @param repository
*/ */
public GitChangesetConverter(org.eclipse.jgit.lib.Repository repository) GitChangesetConverter(org.eclipse.jgit.lib.Repository repository)
{ {
this(repository, null); this(repository, null);
} }
@@ -79,7 +79,7 @@ public class GitChangesetConverter implements Closeable
* @param repository * @param repository
* @param revWalk * @param revWalk
*/ */
public GitChangesetConverter(org.eclipse.jgit.lib.Repository repository, GitChangesetConverter(org.eclipse.jgit.lib.Repository repository,
RevWalk revWalk) RevWalk revWalk)
{ {
this.repository = repository; this.repository = repository;

View File

@@ -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);
}
}

View File

@@ -21,7 +21,7 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE. * SOFTWARE.
*/ */
package sonia.scm.repository; package sonia.scm.repository;
//~--- non-JDK imports -------------------------------------------------------- //~--- non-JDK imports --------------------------------------------------------
@@ -72,9 +72,10 @@ public class GitHookChangesetCollector
* @param rpack * @param rpack
* @param receiveCommands * @param receiveCommands
*/ */
public GitHookChangesetCollector(ReceivePack rpack, public GitHookChangesetCollector(GitChangesetConverterFactory converterFactory, ReceivePack rpack,
List<ReceiveCommand> receiveCommands) List<ReceiveCommand> receiveCommands)
{ {
this.converterFactory = converterFactory;
this.rpack = rpack; this.rpack = rpack;
this.receiveCommands = receiveCommands; this.receiveCommands = receiveCommands;
this.listener = CollectingPackParserListener.get(rpack); this.listener = CollectingPackParserListener.get(rpack);
@@ -100,14 +101,14 @@ public class GitHookChangesetCollector
try try
{ {
walk = rpack.getRevWalk(); walk = rpack.getRevWalk();
converter = new GitChangesetConverter(repository, walk); converter = converterFactory.create(repository, walk);
for (ReceiveCommand rc : receiveCommands) for (ReceiveCommand rc : receiveCommands)
{ {
String ref = rc.getRefName(); String ref = rc.getRefName();
logger.trace("handle receive command, type={}, ref={}, result={}", rc.getType(), ref, rc.getResult()); logger.trace("handle receive command, type={}, ref={}, result={}", rc.getType(), ref, rc.getResult());
if (rc.getType() == ReceiveCommand.Type.DELETE) if (rc.getType() == ReceiveCommand.Type.DELETE)
{ {
logger.debug("skip delete of ref {}", ref); logger.debug("skip delete of ref {}", ref);
@@ -130,7 +131,7 @@ public class GitHookChangesetCollector
builder.append(rc.getType()).append(", ref="); builder.append(rc.getType()).append(", ref=");
builder.append(rc.getRefName()).append(", result="); builder.append(rc.getRefName()).append(", result=");
builder.append(rc.getResult()); builder.append(rc.getResult());
logger.error(builder.toString(), ex); logger.error(builder.toString(), ex);
} }
} }
@@ -222,5 +223,6 @@ public class GitHookChangesetCollector
private final List<ReceiveCommand> receiveCommands; private final List<ReceiveCommand> receiveCommands;
private final GitChangesetConverterFactory converterFactory;
private final ReceivePack rpack; private final ReceivePack rpack;
} }

View File

@@ -36,6 +36,7 @@ import org.eclipse.jgit.revwalk.RevWalk;
import sonia.scm.repository.Changeset; import sonia.scm.repository.Changeset;
import sonia.scm.repository.ChangesetPagingResult; import sonia.scm.repository.ChangesetPagingResult;
import sonia.scm.repository.GitChangesetConverter; import sonia.scm.repository.GitChangesetConverter;
import sonia.scm.repository.GitChangesetConverterFactory;
import sonia.scm.repository.GitRepositoryHandler; import sonia.scm.repository.GitRepositoryHandler;
import sonia.scm.repository.GitUtil; import sonia.scm.repository.GitUtil;
import sonia.scm.repository.InternalRepositoryException; import sonia.scm.repository.InternalRepositoryException;
@@ -58,18 +59,10 @@ public abstract class AbstractGitIncomingOutgoingCommand
/** Field description */ /** Field description */
private static final String REMOTE_REF_PREFIX = "refs/remote/scm/%s/"; private static final String REMOTE_REF_PREFIX = "refs/remote/scm/%s/";
//~--- constructors --------------------------------------------------------- AbstractGitIncomingOutgoingCommand(GitContext context, GitRepositoryHandler handler, GitChangesetConverterFactory converterFactory) {
/**
* Constructs ...
*
* @param handler
* @param context
*/
AbstractGitIncomingOutgoingCommand(GitRepositoryHandler handler, GitContext context)
{
super(context); super(context);
this.handler = handler; this.handler = handler;
this.converterFactory = converterFactory;
} }
//~--- methods -------------------------------------------------------------- //~--- methods --------------------------------------------------------------
@@ -132,7 +125,7 @@ public abstract class AbstractGitIncomingOutgoingCommand
try try
{ {
walk = new RevWalk(git.getRepository()); 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(); org.eclipse.jgit.api.LogCommand log = git.log();
@@ -203,4 +196,5 @@ public abstract class AbstractGitIncomingOutgoingCommand
/** Field description */ /** Field description */
private GitRepositoryHandler handler; private GitRepositoryHandler handler;
private final GitChangesetConverterFactory converterFactory;
} }

View File

@@ -21,7 +21,7 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE. * SOFTWARE.
*/ */
package sonia.scm.repository.spi; package sonia.scm.repository.spi;
//~--- non-JDK imports -------------------------------------------------------- //~--- non-JDK imports --------------------------------------------------------
@@ -29,6 +29,7 @@ package sonia.scm.repository.spi;
import org.eclipse.jgit.transport.ReceiveCommand; import org.eclipse.jgit.transport.ReceiveCommand;
import org.eclipse.jgit.transport.ReceivePack; import org.eclipse.jgit.transport.ReceivePack;
import sonia.scm.repository.GitChangesetConverterFactory;
import sonia.scm.repository.GitHookChangesetCollector; import sonia.scm.repository.GitHookChangesetCollector;
//~--- JDK imports ------------------------------------------------------------ //~--- JDK imports ------------------------------------------------------------
@@ -39,56 +40,27 @@ import java.util.List;
* *
* @author Sebastian Sdorra * @author Sebastian Sdorra
*/ */
public class GitHookChangesetProvider implements HookChangesetProvider public class GitHookChangesetProvider implements HookChangesetProvider {
{
/** private final GitChangesetConverterFactory converterFactory;
* Constructs ... private final ReceivePack receivePack;
* private final List<ReceiveCommand> receiveCommands;
*
* @param receivePack private HookChangesetResponse response;
* @param receiveCommands
*/ public GitHookChangesetProvider(GitChangesetConverterFactory converterFactory, ReceivePack receivePack,
public GitHookChangesetProvider(ReceivePack receivePack, List<ReceiveCommand> receiveCommands) {
List<ReceiveCommand> receiveCommands) this.converterFactory = converterFactory;
{
this.receivePack = receivePack; this.receivePack = receivePack;
this.receiveCommands = receiveCommands; this.receiveCommands = receiveCommands;
} }
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*
* @param request
*
* @return
*/
@Override @Override
public synchronized HookChangesetResponse handleRequest( public synchronized HookChangesetResponse handleRequest(HookChangesetRequest request) {
HookChangesetRequest request) if (response == null) {
{ GitHookChangesetCollector collector = new GitHookChangesetCollector(converterFactory, receivePack, receiveCommands);
if (response == null)
{
GitHookChangesetCollector collector =
new GitHookChangesetCollector(receivePack, receiveCommands);
response = new HookChangesetResponse(collector.collectChangesets()); response = new HookChangesetResponse(collector.collectChangesets());
} }
return response; return response;
} }
//~--- fields ---------------------------------------------------------------
/** Field description */
private List<ReceiveCommand> receiveCommands;
/** Field description */
private ReceivePack receivePack;
/** Field description */
private HookChangesetResponse response;
} }

View File

@@ -21,7 +21,7 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE. * SOFTWARE.
*/ */
package sonia.scm.repository.spi; package sonia.scm.repository.spi;
//~--- non-JDK imports -------------------------------------------------------- //~--- non-JDK imports --------------------------------------------------------
@@ -29,6 +29,7 @@ package sonia.scm.repository.spi;
import org.eclipse.jgit.transport.ReceiveCommand; import org.eclipse.jgit.transport.ReceiveCommand;
import org.eclipse.jgit.transport.ReceivePack; import org.eclipse.jgit.transport.ReceivePack;
import sonia.scm.repository.GitChangesetConverterFactory;
import sonia.scm.repository.api.GitHookBranchProvider; import sonia.scm.repository.api.GitHookBranchProvider;
import sonia.scm.repository.api.GitHookMessageProvider; import sonia.scm.repository.api.GitHookMessageProvider;
import sonia.scm.repository.api.HookBranchProvider; import sonia.scm.repository.api.HookBranchProvider;
@@ -63,12 +64,12 @@ public class GitHookContextProvider extends HookContextProvider
* @param receivePack git receive pack * @param receivePack git receive pack
* @param receiveCommands received commands * @param receiveCommands received commands
*/ */
public GitHookContextProvider(ReceivePack receivePack, public GitHookContextProvider(GitChangesetConverterFactory converterFactory, ReceivePack receivePack,
List<ReceiveCommand> receiveCommands) List<ReceiveCommand> receiveCommands)
{ {
this.receivePack = receivePack; this.receivePack = receivePack;
this.receiveCommands = receiveCommands; this.receiveCommands = receiveCommands;
this.changesetProvider = new GitHookChangesetProvider(receivePack, this.changesetProvider = new GitHookChangesetProvider(converterFactory, receivePack,
receiveCommands); receiveCommands);
} }

View File

@@ -29,6 +29,7 @@ package sonia.scm.repository.spi;
import org.eclipse.jgit.api.LogCommand; import org.eclipse.jgit.api.LogCommand;
import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectId;
import sonia.scm.repository.ChangesetPagingResult; import sonia.scm.repository.ChangesetPagingResult;
import sonia.scm.repository.GitChangesetConverterFactory;
import sonia.scm.repository.GitRepositoryHandler; import sonia.scm.repository.GitRepositoryHandler;
import javax.inject.Inject; import javax.inject.Inject;
@@ -41,19 +42,11 @@ import java.io.IOException;
* @author Sebastian Sdorra * @author Sebastian Sdorra
*/ */
public class GitIncomingCommand extends AbstractGitIncomingOutgoingCommand public class GitIncomingCommand extends AbstractGitIncomingOutgoingCommand
implements IncomingCommand implements IncomingCommand {
{
/**
* Constructs ...
*
* @param handler
* @param context
*/
@Inject @Inject
GitIncomingCommand(GitRepositoryHandler handler, GitContext context) GitIncomingCommand(GitContext context, GitRepositoryHandler handler, GitChangesetConverterFactory converterFactory) {
{ super(context, handler, converterFactory);
super(handler, context);
} }
//~--- get methods ---------------------------------------------------------- //~--- get methods ----------------------------------------------------------

View File

@@ -43,6 +43,7 @@ import sonia.scm.NotFoundException;
import sonia.scm.repository.Changeset; import sonia.scm.repository.Changeset;
import sonia.scm.repository.ChangesetPagingResult; import sonia.scm.repository.ChangesetPagingResult;
import sonia.scm.repository.GitChangesetConverter; import sonia.scm.repository.GitChangesetConverter;
import sonia.scm.repository.GitChangesetConverterFactory;
import sonia.scm.repository.GitUtil; import sonia.scm.repository.GitUtil;
import sonia.scm.repository.InternalRepositoryException; import sonia.scm.repository.InternalRepositoryException;
import sonia.scm.util.IOUtil; import sonia.scm.util.IOUtil;
@@ -71,6 +72,7 @@ public class GitLogCommand extends AbstractGitCommand implements LogCommand
private static final Logger logger = private static final Logger logger =
LoggerFactory.getLogger(GitLogCommand.class); LoggerFactory.getLogger(GitLogCommand.class);
public static final String REVISION = "Revision"; public static final String REVISION = "Revision";
private final GitChangesetConverterFactory converterFactory;
//~--- constructors --------------------------------------------------------- //~--- constructors ---------------------------------------------------------
@@ -82,9 +84,10 @@ public class GitLogCommand extends AbstractGitCommand implements LogCommand
* *
*/ */
@Inject @Inject
GitLogCommand(GitContext context) GitLogCommand(GitContext context, GitChangesetConverterFactory converterFactory)
{ {
super(context); super(context);
this.converterFactory = converterFactory;
} }
//~--- get methods ---------------------------------------------------------- //~--- get methods ----------------------------------------------------------
@@ -122,7 +125,7 @@ public class GitLogCommand extends AbstractGitCommand implements LogCommand
if (commit != null) if (commit != null)
{ {
converter = new GitChangesetConverter(gr, revWalk); converter = converterFactory.create(gr, revWalk);
if (isBranchRequested(request)) { if (isBranchRequested(request)) {
String branch = request.getBranch(); String branch = request.getBranch();
@@ -233,7 +236,7 @@ public class GitLogCommand extends AbstractGitCommand implements LogCommand
revWalk = new RevWalk(repository); revWalk = new RevWalk(repository);
converter = new GitChangesetConverter(repository, revWalk); converter = converterFactory.create(repository, revWalk);
if (!Strings.isNullOrEmpty(request.getPath())) { if (!Strings.isNullOrEmpty(request.getPath())) {
revWalk.setTreeFilter( revWalk.setTreeFilter(

View File

@@ -29,6 +29,7 @@ package sonia.scm.repository.spi;
import org.eclipse.jgit.api.LogCommand; import org.eclipse.jgit.api.LogCommand;
import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectId;
import sonia.scm.repository.ChangesetPagingResult; import sonia.scm.repository.ChangesetPagingResult;
import sonia.scm.repository.GitChangesetConverterFactory;
import sonia.scm.repository.GitRepositoryHandler; import sonia.scm.repository.GitRepositoryHandler;
import javax.inject.Inject; import javax.inject.Inject;
@@ -41,19 +42,12 @@ import java.io.IOException;
* @author Sebastian Sdorra * @author Sebastian Sdorra
*/ */
public class GitOutgoingCommand extends AbstractGitIncomingOutgoingCommand public class GitOutgoingCommand extends AbstractGitIncomingOutgoingCommand
implements OutgoingCommand implements OutgoingCommand {
{
/**
* Constructs ...
*
* @param handler
* @param context
*/
@Inject @Inject
GitOutgoingCommand(GitRepositoryHandler handler, GitContext context) GitOutgoingCommand(GitContext context, GitRepositoryHandler handler, GitChangesetConverterFactory converterFactory)
{ {
super(handler, context); super(context, handler, converterFactory);
} }
//~--- get methods ---------------------------------------------------------- //~--- get methods ----------------------------------------------------------

View File

@@ -117,7 +117,7 @@ public class GitRepositoryServiceProvider extends RepositoryServiceProvider
@Override @Override
public LogCommand getLogCommand() { public LogCommand getLogCommand() {
return new GitLogCommand(context); return commandInjector.getInstance(GitLogCommand.class);
} }
@Override @Override

View File

@@ -21,7 +21,7 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE. * SOFTWARE.
*/ */
package sonia.scm.web; package sonia.scm.web;
//~--- non-JDK imports -------------------------------------------------------- //~--- non-JDK imports --------------------------------------------------------
@@ -34,6 +34,7 @@ import org.eclipse.jgit.transport.ReceiveCommand;
import org.eclipse.jgit.transport.ReceivePack; import org.eclipse.jgit.transport.ReceivePack;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import sonia.scm.repository.GitChangesetConverterFactory;
import sonia.scm.repository.GitRepositoryHandler; import sonia.scm.repository.GitRepositoryHandler;
import sonia.scm.repository.RepositoryHookType; import sonia.scm.repository.RepositoryHookType;
import sonia.scm.repository.spi.GitHookContextProvider; import sonia.scm.repository.spi.GitHookContextProvider;
@@ -66,9 +67,10 @@ public class GitReceiveHook implements PreReceiveHook, PostReceiveHook
* @param hookEventFacade * @param hookEventFacade
* @param handler * @param handler
*/ */
public GitReceiveHook(HookEventFacade hookEventFacade, public GitReceiveHook(GitChangesetConverterFactory converterFactory, HookEventFacade hookEventFacade,
GitRepositoryHandler handler) GitRepositoryHandler handler)
{ {
this.converterFactory = converterFactory;
this.hookEventFacade = hookEventFacade; this.hookEventFacade = hookEventFacade;
this.handler = handler; this.handler = handler;
} }
@@ -122,7 +124,7 @@ public class GitReceiveHook implements PreReceiveHook, PostReceiveHook
logger.trace("resolved repository to {}", repositoryId); logger.trace("resolved repository to {}", repositoryId);
GitHookContextProvider context = new GitHookContextProvider(rpack, GitHookContextProvider context = new GitHookContextProvider(converterFactory, rpack,
receiveCommands); receiveCommands);
hookEventFacade.handle(repositoryId).fireHookEvent(type, context); hookEventFacade.handle(repositoryId).fireHookEvent(type, context);
@@ -188,6 +190,7 @@ public class GitReceiveHook implements PreReceiveHook, PostReceiveHook
/** Field description */ /** Field description */
private GitRepositoryHandler handler; private GitRepositoryHandler handler;
private final GitChangesetConverterFactory converterFactory;
/** Field description */ /** Field description */
private HookEventFacade hookEventFacade; private HookEventFacade hookEventFacade;
} }

View File

@@ -21,7 +21,7 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE. * SOFTWARE.
*/ */
package sonia.scm.web; package sonia.scm.web;
//~--- non-JDK imports -------------------------------------------------------- //~--- 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.ServiceNotAuthorizedException;
import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException; import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
import sonia.scm.protocolcommand.git.BaseReceivePackFactory; import sonia.scm.protocolcommand.git.BaseReceivePackFactory;
import sonia.scm.repository.GitChangesetConverterFactory;
import sonia.scm.repository.GitRepositoryHandler; import sonia.scm.repository.GitRepositoryHandler;
import sonia.scm.repository.spi.HookEventFacade; import sonia.scm.repository.spi.HookEventFacade;
@@ -53,8 +54,8 @@ public class GitReceivePackFactory extends BaseReceivePackFactory<HttpServletReq
private ReceivePackFactory<HttpServletRequest> wrapped; private ReceivePackFactory<HttpServletRequest> wrapped;
@Inject @Inject
public GitReceivePackFactory(GitRepositoryHandler handler, HookEventFacade hookEventFacade) { public GitReceivePackFactory(GitChangesetConverterFactory converterFactory, GitRepositoryHandler handler, HookEventFacade hookEventFacade) {
super(handler, hookEventFacade); super(converterFactory, handler, hookEventFacade);
this.wrapped = new DefaultReceivePackFactory(); this.wrapped = new DefaultReceivePackFactory();
} }

View File

@@ -21,7 +21,7 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE. * SOFTWARE.
*/ */
package sonia.scm.protocolcommand.git; package sonia.scm.protocolcommand.git;
import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.Git;
@@ -38,6 +38,7 @@ import org.junit.rules.TemporaryFolder;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner; import org.mockito.junit.MockitoJUnitRunner;
import sonia.scm.repository.GitChangesetConverterFactory;
import sonia.scm.repository.GitConfig; import sonia.scm.repository.GitConfig;
import sonia.scm.repository.GitRepositoryHandler; import sonia.scm.repository.GitRepositoryHandler;
import sonia.scm.web.CollectingPackParserListener; import sonia.scm.web.CollectingPackParserListener;
@@ -82,7 +83,7 @@ public class BaseReceivePackFactoryTest {
ReceivePack receivePack = new ReceivePack(repository); ReceivePack receivePack = new ReceivePack(repository);
when(wrappedReceivePackFactory.create(request, repository)).thenReturn(receivePack); when(wrappedReceivePackFactory.create(request, repository)).thenReturn(receivePack);
factory = new BaseReceivePackFactory<Object>(handler, null) { factory = new BaseReceivePackFactory<Object>(new GitChangesetConverterFactory(), handler, null) {
@Override @Override
protected ReceivePack createBasicReceivePack(Object request, Repository repository) throws ServiceNotEnabledException, ServiceNotAuthorizedException { protected ReceivePack createBasicReceivePack(Object request, Repository repository) throws ServiceNotEnabledException, ServiceNotAuthorizedException {
return wrappedReceivePackFactory.create(request, repository); return wrappedReceivePackFactory.create(request, repository);

View File

@@ -21,7 +21,7 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE. * SOFTWARE.
*/ */
package sonia.scm.repository.client.spi; package sonia.scm.repository.client.spi;
//~--- non-JDK imports -------------------------------------------------------- //~--- non-JDK imports --------------------------------------------------------
@@ -32,6 +32,7 @@ import org.eclipse.jgit.revwalk.RevCommit;
import sonia.scm.repository.Changeset; import sonia.scm.repository.Changeset;
import sonia.scm.repository.GitChangesetConverter; import sonia.scm.repository.GitChangesetConverter;
import sonia.scm.repository.GitChangesetConverterFactory;
import sonia.scm.repository.client.api.RepositoryClientException; import sonia.scm.repository.client.api.RepositoryClientException;
//~--- JDK imports ------------------------------------------------------------ //~--- JDK imports ------------------------------------------------------------
@@ -71,7 +72,8 @@ public class GitCommitCommand implements CommitCommand
@Override @Override
public Changeset commit(CommitRequest request) throws IOException 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() RevCommit commit = git.commit()
.setAuthor(request.getAuthor().getName(), request.getAuthor().getMail()) .setAuthor(request.getAuthor().getName(), request.getAuthor().getMail())

View File

@@ -21,7 +21,7 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE. * SOFTWARE.
*/ */
package sonia.scm.repository.spi; package sonia.scm.repository.spi;
//~--- non-JDK imports -------------------------------------------------------- //~--- non-JDK imports --------------------------------------------------------
@@ -40,6 +40,7 @@ import org.junit.Before;
import org.junit.Rule; import org.junit.Rule;
import org.junit.rules.TemporaryFolder; import org.junit.rules.TemporaryFolder;
import sonia.scm.repository.Changeset; import sonia.scm.repository.Changeset;
import sonia.scm.repository.GitChangesetConverterFactory;
import sonia.scm.repository.GitRepositoryHandler; import sonia.scm.repository.GitRepositoryHandler;
import sonia.scm.repository.Repository; import sonia.scm.repository.Repository;
import sonia.scm.user.User; import sonia.scm.user.User;
@@ -110,23 +111,7 @@ public class AbstractRemoteCommandTestBase
{ {
// store reference to handle weak references // store reference to handle weak references
proto = new ScmTransportProtocol(new Provider<HookEventFacade>() proto = new ScmTransportProtocol(GitChangesetConverterFactory::new, () -> null, () -> null);
{
@Override
public HookEventFacade get()
{
return null;
}
}, new Provider<GitRepositoryHandler>()
{
@Override
public GitRepositoryHandler get()
{
return null;
}
});
Transport.register(proto); Transport.register(proto);
} }

View File

@@ -21,12 +21,13 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE. * SOFTWARE.
*/ */
package sonia.scm.repository.spi; package sonia.scm.repository.spi;
import org.eclipse.jgit.transport.ScmTransportProtocol; import org.eclipse.jgit.transport.ScmTransportProtocol;
import org.eclipse.jgit.transport.Transport; import org.eclipse.jgit.transport.Transport;
import org.junit.rules.ExternalResource; import org.junit.rules.ExternalResource;
import sonia.scm.repository.GitChangesetConverterFactory;
import sonia.scm.repository.GitRepositoryHandler; import sonia.scm.repository.GitRepositoryHandler;
import sonia.scm.repository.PreProcessorUtil; import sonia.scm.repository.PreProcessorUtil;
import sonia.scm.repository.RepositoryManager; import sonia.scm.repository.RepositoryManager;
@@ -47,7 +48,7 @@ public class BindTransportProtocolRule extends ExternalResource {
RepositoryManager repositoryManager = mock(RepositoryManager.class); RepositoryManager repositoryManager = mock(RepositoryManager.class);
HookEventFacade hookEventFacade = new HookEventFacade(of(repositoryManager), hookContextFactory); HookEventFacade hookEventFacade = new HookEventFacade(of(repositoryManager), hookContextFactory);
GitRepositoryHandler gitRepositoryHandler = mock(GitRepositoryHandler.class); 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); Transport.register(scmTransportProtocol);

View File

@@ -32,6 +32,7 @@ import org.junit.Ignore;
import org.junit.Test; import org.junit.Test;
import sonia.scm.api.v2.resources.GitRepositoryConfigStoreProvider; import sonia.scm.api.v2.resources.GitRepositoryConfigStoreProvider;
import sonia.scm.repository.ChangesetPagingResult; import sonia.scm.repository.ChangesetPagingResult;
import sonia.scm.repository.GitChangesetConverterFactory;
import sonia.scm.store.InMemoryConfigurationStoreFactory; import sonia.scm.store.InMemoryConfigurationStoreFactory;
import java.io.IOException; import java.io.IOException;
@@ -173,14 +174,11 @@ public class GitIncomingCommandTest
assertEquals(0, cpr.getTotal()); assertEquals(0, cpr.getTotal());
} }
/** private GitIncomingCommand createCommand() {
* Method description return new GitIncomingCommand(
* new GitContext(incomingDirectory, incomingRepository, new GitRepositoryConfigStoreProvider(new InMemoryConfigurationStoreFactory())),
* handler,
* @return new GitChangesetConverterFactory()
*/ );
private GitIncomingCommand createCommand()
{
return new GitIncomingCommand(handler, new GitContext(incomingDirectory, incomingRepository, new GitRepositoryConfigStoreProvider(new InMemoryConfigurationStoreFactory())));
} }
} }

View File

@@ -27,6 +27,7 @@ package sonia.scm.repository.spi;
import org.junit.Test; import org.junit.Test;
import sonia.scm.NotFoundException; import sonia.scm.NotFoundException;
import sonia.scm.repository.ChangesetPagingResult; import sonia.scm.repository.ChangesetPagingResult;
import sonia.scm.repository.GitChangesetConverterFactory;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
@@ -108,8 +109,7 @@ public class GitLogCommandAncestorTest extends AbstractGitCommandTestBase
createCommand().getChangesets(request); createCommand().getChangesets(request);
} }
private GitLogCommand createCommand() private GitLogCommand createCommand() {
{ return new GitLogCommand(createContext(), new GitChangesetConverterFactory());
return new GitLogCommand(createContext());
} }
} }

View File

@@ -31,6 +31,7 @@ import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner; import org.mockito.junit.MockitoJUnitRunner;
import sonia.scm.repository.Changeset; import sonia.scm.repository.Changeset;
import sonia.scm.repository.ChangesetPagingResult; import sonia.scm.repository.ChangesetPagingResult;
import sonia.scm.repository.GitChangesetConverterFactory;
import sonia.scm.repository.GitRepositoryConfig; import sonia.scm.repository.GitRepositoryConfig;
import sonia.scm.repository.Modifications; import sonia.scm.repository.Modifications;
import sonia.scm.repository.Person; import sonia.scm.repository.Person;
@@ -293,8 +294,7 @@ public class GitLogCommandTest extends AbstractGitCommandTestBase
return new File(repositoryDirectory, "HEAD"); return new File(repositoryDirectory, "HEAD");
} }
private GitLogCommand createCommand() private GitLogCommand createCommand() {
{ return new GitLogCommand(createContext(), new GitChangesetConverterFactory());
return new GitLogCommand(createContext());
} }
} }

View File

@@ -31,6 +31,7 @@ import org.eclipse.jgit.revwalk.RevCommit;
import org.junit.Test; import org.junit.Test;
import sonia.scm.api.v2.resources.GitRepositoryConfigStoreProvider; import sonia.scm.api.v2.resources.GitRepositoryConfigStoreProvider;
import sonia.scm.repository.ChangesetPagingResult; import sonia.scm.repository.ChangesetPagingResult;
import sonia.scm.repository.GitChangesetConverterFactory;
import sonia.scm.store.InMemoryConfigurationStoreFactory; import sonia.scm.store.InMemoryConfigurationStoreFactory;
import java.io.IOException; import java.io.IOException;
@@ -151,6 +152,10 @@ public class GitOutgoingCommandTest extends AbstractRemoteCommandTestBase
*/ */
private GitOutgoingCommand createCommand() 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()
);
} }
} }

View File

@@ -34,6 +34,7 @@ import org.junit.Before;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.rules.TemporaryFolder; import org.junit.rules.TemporaryFolder;
import sonia.scm.repository.GitChangesetConverterFactory;
import sonia.scm.repository.GitRepositoryHandler; import sonia.scm.repository.GitRepositoryHandler;
import sonia.scm.repository.PreProcessorUtil; import sonia.scm.repository.PreProcessorUtil;
import sonia.scm.repository.RepositoryManager; import sonia.scm.repository.RepositoryManager;
@@ -65,7 +66,7 @@ public class SimpleGitWorkingCopyFactoryTest extends AbstractGitCommandTestBase
HookContextFactory hookContextFactory = new HookContextFactory(mock(PreProcessorUtil.class)); HookContextFactory hookContextFactory = new HookContextFactory(mock(PreProcessorUtil.class));
HookEventFacade hookEventFacade = new HookEventFacade(of(mock(RepositoryManager.class)), hookContextFactory); HookEventFacade hookEventFacade = new HookEventFacade(of(mock(RepositoryManager.class)), hookContextFactory);
GitRepositoryHandler gitRepositoryHandler = mock(GitRepositoryHandler.class); 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); Transport.register(proto);
workdirProvider = new WorkdirProvider(temporaryFolder.newFolder()); workdirProvider = new WorkdirProvider(temporaryFolder.newFolder());
} }