Assisted Injection for commands

Co-authored-by: Eduard Heimbuch<eduard.heimbuch@cloudogu.com>
Co-authored-by: Laura Gorzitze<laura.gorzitze@cloudogu.com>
Pushed-by: Eduard Heimbuch<eduard.heimbuch@cloudogu.com>
Pushed-by: Laura Gorzitze<laura.gorzitze@cloudogu.com>
This commit is contained in:
Laura Gorzitze
2023-11-02 12:41:54 +01:00
parent 123fc4c3d1
commit f641c1ef08
52 changed files with 508 additions and 116 deletions

View File

@@ -28,6 +28,7 @@ package sonia.scm.repository.spi;
import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
import com.google.inject.assistedinject.Assisted;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.lib.ObjectId;
@@ -66,7 +67,7 @@ public class GitBlameCommand extends AbstractGitCommand implements BlameCommand
//~--- constructors ---------------------------------------------------------
@Inject
public GitBlameCommand(GitContext context)
public GitBlameCommand(@Assisted GitContext context)
{
super(context);
}
@@ -148,4 +149,9 @@ public class GitBlameCommand extends AbstractGitCommand implements BlameCommand
return result;
}
public interface Factory {
BlameCommand create(GitContext context);
}
}

View File

@@ -24,6 +24,7 @@
package sonia.scm.repository.spi;
import com.google.inject.assistedinject.Assisted;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.errors.CannotDeleteCurrentBranchException;
@@ -71,7 +72,10 @@ public class GitBranchCommand extends AbstractGitCommand implements BranchComman
private final GitChangesetConverterFactory converterFactory;
@Inject
GitBranchCommand(GitContext context, HookContextFactory hookContextFactory, ScmEventBus eventBus, GitChangesetConverterFactory converterFactory) {
GitBranchCommand(@Assisted GitContext context,
HookContextFactory hookContextFactory,
ScmEventBus eventBus,
GitChangesetConverterFactory converterFactory) {
super(context);
this.hookContextFactory = hookContextFactory;
this.eventBus = eventBus;
@@ -201,4 +205,8 @@ public class GitBranchCommand extends AbstractGitCommand implements BranchComman
};
}
}
public interface Factory {
BranchCommand create(GitContext context);
}
}

View File

@@ -24,6 +24,7 @@
package sonia.scm.repository.spi;
import com.google.inject.assistedinject.Assisted;
import org.eclipse.jgit.errors.IncorrectObjectTypeException;
import org.eclipse.jgit.errors.MissingObjectException;
import org.eclipse.jgit.lib.ObjectId;
@@ -46,7 +47,7 @@ import static sonia.scm.NotFoundException.notFound;
public class GitBranchDetailsCommand extends AbstractGitCommand implements BranchDetailsCommand {
@Inject
GitBranchDetailsCommand(GitContext context) {
GitBranchDetailsCommand(@Assisted GitContext context) {
super(context);
}
@@ -97,4 +98,9 @@ public class GitBranchDetailsCommand extends AbstractGitCommand implements Branc
throw new InternalRepositoryException(context.getRepository(), "could not compute ahead/behind", e);
}
}
public interface Factory {
BranchDetailsCommand create(GitContext context);
}
}

View File

@@ -26,6 +26,7 @@ package sonia.scm.repository.spi;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Strings;
import com.google.inject.assistedinject.Assisted;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.errors.GitAPIException;
@@ -55,7 +56,7 @@ public class GitBranchesCommand extends AbstractGitCommand implements BranchesCo
private static final Logger LOG = LoggerFactory.getLogger(GitBranchesCommand.class);
@Inject
public GitBranchesCommand(GitContext context) {
public GitBranchesCommand(@Assisted GitContext context) {
super(context);
}
@@ -120,5 +121,10 @@ public class GitBranchesCommand extends AbstractGitCommand implements BranchesCo
Optional<Ref> getRepositoryHeadRef(Git git) {
return GitUtil.getRepositoryHeadRef(git.getRepository());
}
public interface Factory {
BranchesCommand create(GitContext context);
}
}

View File

@@ -28,6 +28,7 @@ import com.google.common.base.Stopwatch;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.inject.assistedinject.Assisted;
import org.eclipse.jgit.attributes.Attributes;
import org.eclipse.jgit.lfs.LfsPointer;
import org.eclipse.jgit.lib.Constants;
@@ -113,7 +114,7 @@ public class GitBrowseCommand extends AbstractGitCommand
private int resultCount = 0;
@Inject
public GitBrowseCommand(GitContext context, LfsBlobStoreFactory lfsBlobStoreFactory, SyncAsyncExecutorProvider executorProvider) {
public GitBrowseCommand(@Assisted GitContext context, LfsBlobStoreFactory lfsBlobStoreFactory, SyncAsyncExecutorProvider executorProvider) {
this(context, lfsBlobStoreFactory, executorProvider.createExecutorWithDefaultTimeout());
}
@@ -560,4 +561,9 @@ public class GitBrowseCommand extends AbstractGitCommand
children.add(treeEntry);
}
}
public interface Factory {
BrowseCommand create(GitContext context);
}
}

View File

@@ -23,10 +23,12 @@
*/
package sonia.scm.repository.spi;
import com.google.inject.assistedinject.Assisted;
import sonia.scm.ContextEntry;
import sonia.scm.repository.api.BundleResponse;
import sonia.scm.repository.api.ExportFailedException;
import javax.inject.Inject;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
@@ -38,7 +40,8 @@ public class GitBundleCommand extends AbstractGitCommand implements BundleComman
private static final String TAR_ARCHIVE = "tar";
public GitBundleCommand(GitContext context) {
@Inject
public GitBundleCommand(@Assisted GitContext context) {
super(context);
}
@@ -66,4 +69,9 @@ public class GitBundleCommand extends AbstractGitCommand implements BundleComman
private boolean shouldIncludeFile(Path filePath) {
return !filePath.getFileName().toString().equals("config");
}
public interface Factory {
BundleCommand create(GitContext context);
}
}

View File

@@ -24,6 +24,7 @@
package sonia.scm.repository.spi;
import com.google.inject.assistedinject.Assisted;
import org.eclipse.jgit.errors.MissingObjectException;
import org.eclipse.jgit.lfs.LfsPointer;
import org.eclipse.jgit.lib.Constants;
@@ -63,7 +64,7 @@ public class GitCatCommand extends AbstractGitCommand implements CatCommand {
private final LfsBlobStoreFactory lfsBlobStoreFactory;
@Inject
public GitCatCommand(GitContext context, LfsBlobStoreFactory lfsBlobStoreFactory) {
public GitCatCommand(@Assisted GitContext context, LfsBlobStoreFactory lfsBlobStoreFactory) {
super(context);
this.lfsBlobStoreFactory = lfsBlobStoreFactory;
}
@@ -225,4 +226,9 @@ public class GitCatCommand extends AbstractGitCommand implements CatCommand {
}
}
}
public interface Factory {
CatCommand create(GitContext context);
}
}

View File

@@ -24,6 +24,7 @@
package sonia.scm.repository.spi;
import com.google.inject.assistedinject.Assisted;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
@@ -47,7 +48,7 @@ public class GitChangesetsCommand extends AbstractGitCommand implements Changese
private final GitChangesetConverterFactory converterFactory;
@Inject
GitChangesetsCommand(GitContext context, GitChangesetConverterFactory converterFactory) {
GitChangesetsCommand(@Assisted GitContext context, GitChangesetConverterFactory converterFactory) {
super(context);
this.converterFactory = converterFactory;
}
@@ -122,4 +123,9 @@ public class GitChangesetsCommand extends AbstractGitCommand implements Changese
return Long.compare(commitTime1, commitTime2);
}
}
public interface Factory {
ChangesetsCommand create(GitContext context);
}
}

View File

@@ -24,6 +24,7 @@
package sonia.scm.repository.spi;
import com.google.inject.assistedinject.Assisted;
import org.eclipse.jgit.diff.DiffEntry;
import org.eclipse.jgit.diff.DiffFormatter;
import org.eclipse.jgit.util.QuotedString;
@@ -43,7 +44,7 @@ import static java.nio.charset.StandardCharsets.UTF_8;
public class GitDiffCommand extends AbstractGitCommand implements DiffCommand {
@Inject
GitDiffCommand(GitContext context) {
GitDiffCommand(@Assisted GitContext context) {
super(context);
}
@@ -185,4 +186,9 @@ public class GitDiffCommand extends AbstractGitCommand implements DiffCommand {
target.flush();
}
}
public interface Factory {
DiffCommand create(GitContext context);
}
}

View File

@@ -24,6 +24,7 @@
package sonia.scm.repository.spi;
import com.google.inject.assistedinject.Assisted;
import org.eclipse.jgit.diff.DiffEntry;
import org.eclipse.jgit.diff.DiffFormatter;
import org.eclipse.jgit.errors.AmbiguousObjectException;
@@ -50,7 +51,7 @@ import static java.util.Optional.ofNullable;
public class GitDiffResultCommand extends AbstractGitCommand implements DiffResultCommand {
@Inject
GitDiffResultCommand(GitContext context) {
GitDiffResultCommand(@Assisted GitContext context) {
super(context);
}
@@ -197,4 +198,9 @@ public class GitDiffResultCommand extends AbstractGitCommand implements DiffResu
}
}
public interface Factory {
DiffResultCommand create(GitContext context);
}
}

View File

@@ -24,6 +24,7 @@
package sonia.scm.repository.spi;
import com.google.inject.assistedinject.Assisted;
import sonia.scm.repository.api.FileLock;
import sonia.scm.repository.api.LockCommandResult;
import sonia.scm.repository.api.UnlockCommandResult;
@@ -39,7 +40,7 @@ public class GitFileLockCommand implements FileLockCommand {
private final GitFileLockStoreFactory lockStoreFactory;
@Inject
public GitFileLockCommand(GitContext context, GitFileLockStoreFactory lockStoreFactory) {
public GitFileLockCommand(@Assisted GitContext context, GitFileLockStoreFactory lockStoreFactory) {
this.context = context;
this.lockStoreFactory = lockStoreFactory;
}
@@ -73,4 +74,9 @@ public class GitFileLockCommand implements FileLockCommand {
private GitFileLockStore getLockStore() {
return lockStoreFactory.create(context.getRepository());
}
public interface Factory {
FileLockCommand create(GitContext context);
}
}

View File

@@ -26,6 +26,7 @@ package sonia.scm.repository.spi;
//~--- non-JDK imports --------------------------------------------------------
import com.google.inject.assistedinject.Assisted;
import org.eclipse.jgit.api.LogCommand;
import org.eclipse.jgit.lib.ObjectId;
import sonia.scm.repository.ChangesetPagingResult;
@@ -45,7 +46,7 @@ public class GitIncomingCommand extends AbstractGitIncomingOutgoingCommand
implements IncomingCommand {
@Inject
GitIncomingCommand(GitContext context, GitRepositoryHandler handler, GitChangesetConverterFactory converterFactory) {
GitIncomingCommand(@Assisted GitContext context, GitRepositoryHandler handler, GitChangesetConverterFactory converterFactory) {
super(context, handler, converterFactory);
}
@@ -95,4 +96,9 @@ public class GitIncomingCommand extends AbstractGitIncomingOutgoingCommand
{
return remoteId != null;
}
public interface Factory {
IncomingCommand create(GitContext context);
}
}

View File

@@ -27,6 +27,7 @@ package sonia.scm.repository.spi;
//~--- non-JDK imports --------------------------------------------------------
import com.google.common.base.Strings;
import com.google.inject.assistedinject.Assisted;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
@@ -74,7 +75,7 @@ public class GitLogCommand extends AbstractGitCommand implements LogCommand
*
*/
@Inject
GitLogCommand(GitContext context, GitChangesetConverterFactory converterFactory)
GitLogCommand(@Assisted GitContext context, GitChangesetConverterFactory converterFactory)
{
super(context);
this.converterFactory = converterFactory;
@@ -188,4 +189,7 @@ public class GitLogCommand extends AbstractGitCommand implements LogCommand
}
}
public interface Factory {
LogCommand create(GitContext context);
}
}

View File

@@ -25,6 +25,7 @@
package sonia.scm.repository.spi;
import com.google.common.collect.ImmutableSet;
import com.google.inject.assistedinject.Assisted;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.MergeResult;
import org.eclipse.jgit.api.Status;
@@ -65,11 +66,11 @@ public class GitMergeCommand extends AbstractGitCommand implements MergeCommand
);
@Inject
GitMergeCommand(GitContext context, GitRepositoryHandler handler) {
GitMergeCommand(@Assisted GitContext context, GitRepositoryHandler handler) {
this(context, handler.getWorkingCopyFactory());
}
GitMergeCommand(GitContext context, GitWorkingCopyFactory workingCopyFactory) {
GitMergeCommand(@Assisted GitContext context, GitWorkingCopyFactory workingCopyFactory) {
super(context);
this.workingCopyFactory = workingCopyFactory;
}
@@ -214,4 +215,9 @@ public class GitMergeCommand extends AbstractGitCommand implements MergeCommand
return status;
}
}
public interface Factory {
MergeCommand create(GitContext context);
}
}

View File

@@ -26,6 +26,7 @@ package sonia.scm.repository.spi;
import com.google.common.base.Stopwatch;
import com.google.common.base.Strings;
import com.google.inject.assistedinject.Assisted;
import org.apache.commons.lang.StringUtils;
import org.eclipse.jgit.api.FetchCommand;
import org.eclipse.jgit.api.Git;
@@ -113,7 +114,7 @@ public class GitMirrorCommand extends AbstractGitCommand implements MirrorComman
private final LfsLoader lfsLoader;
@Inject
GitMirrorCommand(GitContext context,
GitMirrorCommand(@Assisted GitContext context,
MirrorHttpConnectionProvider mirrorHttpConnectionProvider,
GitChangesetConverterFactory converterFactory,
GitTagConverter gitTagConverter,
@@ -799,4 +800,9 @@ public class GitMirrorCommand extends AbstractGitCommand implements MirrorComman
this.typeForLog = typeForLog;
}
}
public interface Factory {
MirrorCommand create(GitContext context);
}
}

View File

@@ -24,6 +24,7 @@
package sonia.scm.repository.spi;
import com.google.inject.assistedinject.Assisted;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.jgit.diff.DiffEntry;
import org.eclipse.jgit.lib.ObjectId;
@@ -57,7 +58,7 @@ import static sonia.scm.ContextEntry.ContextBuilder.entity;
public class GitModificationsCommand extends AbstractGitCommand implements ModificationsCommand {
@Inject
GitModificationsCommand(GitContext context) {
GitModificationsCommand(@Assisted GitContext context) {
super(context);
}
@@ -156,4 +157,9 @@ public class GitModificationsCommand extends AbstractGitCommand implements Modif
throw new UnsupportedModificationTypeException(entity(repository), MessageFormat.format("The modification type: {0} is not supported.", type));
}
}
public interface Factory {
ModificationsCommand create(GitContext context);
}
}

View File

@@ -25,6 +25,7 @@
package sonia.scm.repository.spi;
import com.google.common.util.concurrent.Striped;
import com.google.inject.assistedinject.Assisted;
import org.apache.commons.lang.StringUtils;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.errors.GitAPIException;
@@ -57,11 +58,11 @@ public class GitModifyCommand extends AbstractGitCommand implements ModifyComman
private final GitRepositoryConfigStoreProvider gitRepositoryConfigStoreProvider;
@Inject
GitModifyCommand(GitContext context, GitRepositoryHandler repositoryHandler, LfsBlobStoreFactory lfsBlobStoreFactory, GitRepositoryConfigStoreProvider gitRepositoryConfigStoreProvider) {
GitModifyCommand(@Assisted GitContext context, GitRepositoryHandler repositoryHandler, LfsBlobStoreFactory lfsBlobStoreFactory, GitRepositoryConfigStoreProvider gitRepositoryConfigStoreProvider) {
this(context, repositoryHandler.getWorkingCopyFactory(), lfsBlobStoreFactory, gitRepositoryConfigStoreProvider);
}
GitModifyCommand(GitContext context, GitWorkingCopyFactory workingCopyFactory, LfsBlobStoreFactory lfsBlobStoreFactory, GitRepositoryConfigStoreProvider gitRepositoryConfigStoreProvider) {
GitModifyCommand(@Assisted GitContext context, GitWorkingCopyFactory workingCopyFactory, LfsBlobStoreFactory lfsBlobStoreFactory, GitRepositoryConfigStoreProvider gitRepositoryConfigStoreProvider) {
super(context);
this.workingCopyFactory = workingCopyFactory;
this.lfsBlobStoreFactory = lfsBlobStoreFactory;
@@ -217,4 +218,9 @@ public class GitModifyCommand extends AbstractGitCommand implements ModifyComman
throw new InternalRepositoryException(context.getRepository(), message, e);
}
}
public interface Factory {
ModifyCommand create(GitContext context);
}
}

View File

@@ -26,6 +26,7 @@ package sonia.scm.repository.spi;
//~--- non-JDK imports --------------------------------------------------------
import com.google.inject.assistedinject.Assisted;
import org.eclipse.jgit.api.LogCommand;
import org.eclipse.jgit.lib.ObjectId;
import sonia.scm.repository.ChangesetPagingResult;
@@ -45,7 +46,7 @@ public class GitOutgoingCommand extends AbstractGitIncomingOutgoingCommand
implements OutgoingCommand {
@Inject
GitOutgoingCommand(GitContext context, GitRepositoryHandler handler, GitChangesetConverterFactory converterFactory)
GitOutgoingCommand(@Assisted GitContext context, GitRepositoryHandler handler, GitChangesetConverterFactory converterFactory)
{
super(context, handler, converterFactory);
}
@@ -109,4 +110,9 @@ public class GitOutgoingCommand extends AbstractGitIncomingOutgoingCommand
{
return localId != null;
}
public interface Factory {
OutgoingCommand create(GitContext context);
}
}

View File

@@ -27,6 +27,7 @@ package sonia.scm.repository.spi;
import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
import com.google.common.collect.Iterables;
import com.google.inject.assistedinject.Assisted;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.lib.ObjectId;
@@ -67,8 +68,8 @@ public class GitPullCommand extends AbstractGitPushOrPullCommand
@Inject
public GitPullCommand(GitRepositoryHandler handler,
GitContext context,
PostReceiveRepositoryHookEventFactory postReceiveRepositoryHookEventFactory,
@Assisted GitContext context,
@Assisted PostReceiveRepositoryHookEventFactory postReceiveRepositoryHookEventFactory,
LfsLoader lfsLoader,
PullHttpConnectionProvider pullHttpConnectionProvider,
GitRepositoryConfigStoreProvider storeProvider, GitHeadModifier gitHeadModifier) {
@@ -266,4 +267,9 @@ public class GitPullCommand extends AbstractGitPushOrPullCommand
return failureCount;
}
}
public interface Factory {
PullCommand create(GitContext context, PostReceiveRepositoryHookEventFactory postReceiveRepositoryHookEventFactory);
}
}

View File

@@ -24,6 +24,7 @@
package sonia.scm.repository.spi;
import com.google.inject.assistedinject.Assisted;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sonia.scm.repository.GitRepositoryHandler;
@@ -37,7 +38,7 @@ public class GitPushCommand extends AbstractGitPushOrPullCommand implements Push
private static final Logger LOG = LoggerFactory.getLogger(GitPushCommand.class);
@Inject
public GitPushCommand(GitRepositoryHandler handler, GitContext context) {
public GitPushCommand(GitRepositoryHandler handler, @Assisted GitContext context) {
super(handler, context);
this.handler = handler;
}
@@ -51,4 +52,9 @@ public class GitPushCommand extends AbstractGitPushOrPullCommand implements Push
return new PushResponse(push(open(), remoteUrl, request.getUsername(), request.getPassword(), request.isForce()));
}
public interface Factory {
PushCommand create(GitContext context);
}
}

View File

@@ -25,7 +25,6 @@
package sonia.scm.repository.spi;
import com.google.common.collect.ImmutableSet;
import com.google.inject.AbstractModule;
import com.google.inject.Injector;
import sonia.scm.repository.Feature;
import sonia.scm.repository.api.Command;
@@ -69,134 +68,130 @@ public class GitRepositoryServiceProvider extends RepositoryServiceProvider {
Feature.FORCE_PUSH
);
private final Injector injector;
private final GitContext context;
private final Injector commandInjector;
//~--- constructors ---------------------------------------------------------
GitRepositoryServiceProvider(Injector injector, GitContext context) {
this.injector = injector;
this.context = context;
commandInjector = injector.createChildInjector(new AbstractModule() {
@Override
protected void configure() {
bind(GitContext.class).toInstance(context);
}
});
}
@Override
public BlameCommand getBlameCommand() {
return new GitBlameCommand(context);
return injector.getInstance(GitBlameCommand.Factory.class).create(context);
}
@Override
public BranchesCommand getBranchesCommand() {
return new GitBranchesCommand(context);
return injector.getInstance(GitBranchesCommand.Factory.class).create(context);
}
@Override
public BranchCommand getBranchCommand() {
return commandInjector.getInstance(GitBranchCommand.class);
return injector.getInstance(GitBranchCommand.Factory.class).create(context);
}
@Override
public BrowseCommand getBrowseCommand() {
return commandInjector.getInstance(GitBrowseCommand.class);
return injector.getInstance(GitBrowseCommand.Factory.class).create(context);
}
@Override
public CatCommand getCatCommand() {
return commandInjector.getInstance(GitCatCommand.class);
return injector.getInstance(GitCatCommand.Factory.class).create(context);
}
@Override
public DiffCommand getDiffCommand() {
return new GitDiffCommand(context);
return injector.getInstance(GitDiffCommand.Factory.class).create(context);
}
@Override
public DiffResultCommand getDiffResultCommand() {
return new GitDiffResultCommand(context);
return injector.getInstance(GitDiffResultCommand.Factory.class).create(context);
}
@Override
public IncomingCommand getIncomingCommand() {
return commandInjector.getInstance(GitIncomingCommand.class);
return injector.getInstance(GitIncomingCommand.Factory.class).create(context);
}
@Override
public LogCommand getLogCommand() {
return commandInjector.getInstance(GitLogCommand.class);
return injector.getInstance(GitLogCommand.Factory.class).create(context);
}
@Override
public ModificationsCommand getModificationsCommand() {
return new GitModificationsCommand(context);
return injector.getInstance(GitModificationsCommand.Factory.class).create(context);
}
@Override
public OutgoingCommand getOutgoingCommand() {
return commandInjector.getInstance(GitOutgoingCommand.class);
return injector.getInstance(GitOutgoingCommand.Factory.class).create(context);
}
@Override
public PullCommand getPullCommand() {
return commandInjector.getInstance(GitPullCommand.class);
PostReceiveRepositoryHookEventFactory postReceiveRepositoryHookEventFactory = injector.getInstance(PostReceiveRepositoryHookEventFactory.Factory.class).create(context);
return injector.getInstance(GitPullCommand.Factory.class).create(context, postReceiveRepositoryHookEventFactory);
}
@Override
public PushCommand getPushCommand() {
return commandInjector.getInstance(GitPushCommand.class);
return injector.getInstance(GitPushCommand.Factory.class).create(context);
}
@Override
public TagsCommand getTagsCommand() {
return commandInjector.getInstance(GitTagsCommand.class);
return injector.getInstance(GitTagsCommand.Factory.class).create(context);
}
@Override
public TagCommand getTagCommand() {
return commandInjector.getInstance(GitTagCommand.class);
return injector.getInstance(GitTagCommand.Factory.class).create(context);
}
@Override
public MergeCommand getMergeCommand() {
return commandInjector.getInstance(GitMergeCommand.class);
return injector.getInstance(GitMergeCommand.Factory.class).create(context);
}
@Override
public ModifyCommand getModifyCommand() {
return commandInjector.getInstance(GitModifyCommand.class);
return injector.getInstance(GitModifyCommand.Factory.class).create(context);
}
@Override
public BundleCommand getBundleCommand() {
return new GitBundleCommand(context);
return injector.getInstance(GitBundleCommand.Factory.class).create(context);
}
@Override
public UnbundleCommand getUnbundleCommand() {
return commandInjector.getInstance(GitUnbundleCommand.class);
return injector.getInstance(GitUnbundleCommand.Factory.class).create(context);
}
@Override
public MirrorCommand getMirrorCommand() {
return commandInjector.getInstance(GitMirrorCommand.class);
return injector.getInstance(GitMirrorCommand.Factory.class).create(context);
}
@Override
public FileLockCommand getFileLockCommand() {
return commandInjector.getInstance(GitFileLockCommand.class);
return injector.getInstance(GitFileLockCommand.Factory.class).create(context);
}
@Override
public BranchDetailsCommand getBranchDetailsCommand() {
return commandInjector.getInstance(GitBranchDetailsCommand.class);
return injector.getInstance(GitBranchDetailsCommand.Factory.class).create(context);
}
@Override
public ChangesetsCommand getChangesetsCommand() {
return commandInjector.getInstance(GitChangesetsCommand.class);
return injector.getInstance(GitChangesetsCommand.Factory.class).create(context);
}
@Override

View File

@@ -25,6 +25,7 @@
package sonia.scm.repository.spi;
import com.google.common.base.Strings;
import com.google.inject.assistedinject.Assisted;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.SecurityUtils;
import org.eclipse.jgit.api.Git;
@@ -80,7 +81,7 @@ public class GitTagCommand extends AbstractGitCommand implements TagCommand {
private final GitChangesetConverterFactory converterFactory;
@Inject
GitTagCommand(GitContext context, HookContextFactory hookContextFactory, ScmEventBus eventBus, GitChangesetConverterFactory converterFactory) {
GitTagCommand(@Assisted GitContext context, HookContextFactory hookContextFactory, ScmEventBus eventBus, GitChangesetConverterFactory converterFactory) {
super(context);
this.hookContextFactory = hookContextFactory;
this.eventBus = eventBus;
@@ -254,4 +255,9 @@ public class GitTagCommand extends AbstractGitCommand implements TagCommand {
};
}
}
public interface Factory {
TagCommand create(GitContext context);
}
}

View File

@@ -26,6 +26,7 @@ package sonia.scm.repository.spi;
//~--- non-JDK imports --------------------------------------------------------
import com.google.inject.assistedinject.Assisted;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.lib.Ref;
@@ -54,7 +55,7 @@ public class GitTagsCommand extends AbstractGitCommand implements TagsCommand {
* @param context
*/
@Inject
public GitTagsCommand(GitContext context, GitTagConverter gitTagConverter) {
public GitTagsCommand(@Assisted GitContext context, GitTagConverter gitTagConverter) {
super(context);
this.gitTagConverter = gitTagConverter;
}
@@ -73,4 +74,9 @@ public class GitTagsCommand extends AbstractGitCommand implements TagsCommand {
throw new InternalRepositoryException(repository, "could not read tags from repository", ex);
}
}
public interface Factory {
TagsCommand create(GitContext context);
}
}

View File

@@ -24,6 +24,7 @@
package sonia.scm.repository.spi;
import com.google.common.io.ByteSource;
import com.google.inject.assistedinject.Assisted;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.lib.Ref;
@@ -52,7 +53,7 @@ public class GitUnbundleCommand extends AbstractGitCommand implements UnbundleCo
private final GitRepositoryHookEventFactory eventFactory;
@Inject
GitUnbundleCommand(GitContext context, GitRepositoryHookEventFactory eventFactory) {
GitUnbundleCommand(@Assisted GitContext context, GitRepositoryHookEventFactory eventFactory) {
super(context);
this.eventFactory = eventFactory;
}
@@ -107,4 +108,9 @@ public class GitUnbundleCommand extends AbstractGitCommand implements UnbundleCo
private void unbundleRepositoryFromRequest(UnbundleCommandRequest request, Path repositoryDir) throws IOException {
extractTar(request.getArchive().openBufferedStream(), repositoryDir).run();
}
public interface Factory {
UnbundleCommand create(GitContext context);
}
}

View File

@@ -24,6 +24,7 @@
package sonia.scm.repository.spi;
import com.google.inject.assistedinject.Assisted;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.transport.FetchResult;
import sonia.scm.ContextEntry;
@@ -38,14 +39,14 @@ import java.io.IOException;
import java.util.List;
import java.util.stream.Collectors;
class PostReceiveRepositoryHookEventFactory {
public class PostReceiveRepositoryHookEventFactory {
private final ScmEventBus eventBus;
private final GitRepositoryHookEventFactory eventFactory;
private final GitContext context;
@Inject
PostReceiveRepositoryHookEventFactory(ScmEventBus eventBus, GitRepositoryHookEventFactory eventFactory, GitContext context) {
PostReceiveRepositoryHookEventFactory(ScmEventBus eventBus, GitRepositoryHookEventFactory eventFactory, @Assisted GitContext context) {
this.eventBus = eventBus;
this.eventFactory = eventFactory;
this.context = context;
@@ -81,4 +82,9 @@ class PostReceiveRepositoryHookEventFactory {
.map(r -> r.getLeaf().getName().substring("refs/heads/".length()))
.collect(Collectors.toList());
}
public interface Factory {
PostReceiveRepositoryHookEventFactory create(GitContext context);
}
}

View File

@@ -26,6 +26,7 @@ package sonia.scm.web;
//~--- non-JDK imports --------------------------------------------------------
import com.google.inject.assistedinject.FactoryModuleBuilder;
import com.google.inject.servlet.ServletModule;
import org.eclipse.jgit.transport.ScmTransportProtocol;
import org.mapstruct.factory.Mappers;
@@ -34,7 +35,54 @@ import sonia.scm.api.v2.resources.GitConfigToGitConfigDtoMapper;
import sonia.scm.api.v2.resources.GitRepositoryConfigMapper;
import sonia.scm.plugin.Extension;
import sonia.scm.repository.GitWorkingCopyFactory;
import sonia.scm.repository.spi.BlameCommand;
import sonia.scm.repository.spi.BranchCommand;
import sonia.scm.repository.spi.BranchDetailsCommand;
import sonia.scm.repository.spi.BranchesCommand;
import sonia.scm.repository.spi.BrowseCommand;
import sonia.scm.repository.spi.BundleCommand;
import sonia.scm.repository.spi.CatCommand;
import sonia.scm.repository.spi.ChangesetsCommand;
import sonia.scm.repository.spi.DiffCommand;
import sonia.scm.repository.spi.DiffResultCommand;
import sonia.scm.repository.spi.FileLockCommand;
import sonia.scm.repository.spi.GitBlameCommand;
import sonia.scm.repository.spi.GitBranchCommand;
import sonia.scm.repository.spi.GitBranchDetailsCommand;
import sonia.scm.repository.spi.GitBranchesCommand;
import sonia.scm.repository.spi.GitBrowseCommand;
import sonia.scm.repository.spi.GitBundleCommand;
import sonia.scm.repository.spi.GitCatCommand;
import sonia.scm.repository.spi.GitChangesetsCommand;
import sonia.scm.repository.spi.GitDiffCommand;
import sonia.scm.repository.spi.GitDiffResultCommand;
import sonia.scm.repository.spi.GitFileLockCommand;
import sonia.scm.repository.spi.GitIncomingCommand;
import sonia.scm.repository.spi.GitLogCommand;
import sonia.scm.repository.spi.GitMergeCommand;
import sonia.scm.repository.spi.GitMirrorCommand;
import sonia.scm.repository.spi.GitModificationsCommand;
import sonia.scm.repository.spi.GitModifyCommand;
import sonia.scm.repository.spi.GitOutgoingCommand;
import sonia.scm.repository.spi.GitPullCommand;
import sonia.scm.repository.spi.GitPushCommand;
import sonia.scm.repository.spi.GitTagCommand;
import sonia.scm.repository.spi.GitTagsCommand;
import sonia.scm.repository.spi.GitUnbundleCommand;
import sonia.scm.repository.spi.IncomingCommand;
import sonia.scm.repository.spi.LogCommand;
import sonia.scm.repository.spi.MergeCommand;
import sonia.scm.repository.spi.MirrorCommand;
import sonia.scm.repository.spi.ModificationsCommand;
import sonia.scm.repository.spi.ModifyCommand;
import sonia.scm.repository.spi.OutgoingCommand;
import sonia.scm.repository.spi.PostReceiveRepositoryHookEventFactory;
import sonia.scm.repository.spi.PullCommand;
import sonia.scm.repository.spi.PushCommand;
import sonia.scm.repository.spi.SimpleGitWorkingCopyFactory;
import sonia.scm.repository.spi.TagCommand;
import sonia.scm.repository.spi.TagsCommand;
import sonia.scm.repository.spi.UnbundleCommand;
import sonia.scm.web.lfs.LfsBlobStoreFactory;
/**
@@ -57,5 +105,32 @@ public class GitServletModule extends ServletModule {
bind(GitRepositoryConfigMapper.class).to(Mappers.getMapper(GitRepositoryConfigMapper.class).getClass());
bind(GitWorkingCopyFactory.class).to(SimpleGitWorkingCopyFactory.class);
install(new FactoryModuleBuilder().implement(BranchCommand.class, GitBranchCommand.class).build(GitBranchCommand.Factory.class));
install(new FactoryModuleBuilder().implement(BlameCommand.class, GitBlameCommand.class).build(GitBlameCommand.Factory.class));
install(new FactoryModuleBuilder().implement(BranchesCommand.class, GitBranchesCommand.class).build(GitBranchesCommand.Factory.class));
install(new FactoryModuleBuilder().implement(BrowseCommand.class, GitBrowseCommand.class).build(GitBrowseCommand.Factory.class));
install(new FactoryModuleBuilder().implement(CatCommand.class, GitCatCommand.class).build(GitCatCommand.Factory.class));
install(new FactoryModuleBuilder().implement(DiffCommand.class, GitDiffCommand.class).build(GitDiffCommand.Factory.class));
install(new FactoryModuleBuilder().implement(DiffResultCommand.class, GitDiffResultCommand.class).build(GitDiffResultCommand.Factory.class));
install(new FactoryModuleBuilder().implement(IncomingCommand.class, GitIncomingCommand.class).build(GitIncomingCommand.Factory.class));
install(new FactoryModuleBuilder().implement(LogCommand.class, GitLogCommand.class).build(GitLogCommand.Factory.class));
install(new FactoryModuleBuilder().implement(ModificationsCommand.class, GitModificationsCommand.class).build(GitModificationsCommand.Factory.class));
install(new FactoryModuleBuilder().implement(OutgoingCommand.class, GitOutgoingCommand.class).build(GitOutgoingCommand.Factory.class));
install(new FactoryModuleBuilder().implement(PullCommand.class, GitPullCommand.class).build(GitPullCommand.Factory.class));
install(new FactoryModuleBuilder().implement(PostReceiveRepositoryHookEventFactory.class, PostReceiveRepositoryHookEventFactory.class).build(PostReceiveRepositoryHookEventFactory.Factory.class));
install(new FactoryModuleBuilder().implement(PushCommand.class, GitPushCommand.class).build(GitPushCommand.Factory.class));
install(new FactoryModuleBuilder().implement(TagsCommand.class, GitTagsCommand.class).build(GitTagsCommand.Factory.class));
install(new FactoryModuleBuilder().implement(TagCommand.class, GitTagCommand.class).build(GitTagCommand.Factory.class));
install(new FactoryModuleBuilder().implement(MergeCommand.class, GitMergeCommand.class).build(GitMergeCommand.Factory.class));
install(new FactoryModuleBuilder().implement(ModifyCommand.class, GitModifyCommand.class).build(GitModifyCommand.Factory.class));
install(new FactoryModuleBuilder().implement(BundleCommand.class, GitBundleCommand.class).build(GitBundleCommand.Factory.class));
install(new FactoryModuleBuilder().implement(UnbundleCommand.class, GitUnbundleCommand.class).build(GitUnbundleCommand.Factory.class));
install(new FactoryModuleBuilder().implement(MirrorCommand.class, GitMirrorCommand.class).build(GitMirrorCommand.Factory.class));
install(new FactoryModuleBuilder().implement(FileLockCommand.class, GitFileLockCommand.class).build(GitFileLockCommand.Factory.class));
install(new FactoryModuleBuilder().implement(BranchDetailsCommand.class, GitBranchDetailsCommand.class).build(GitBranchDetailsCommand.Factory.class));
install(new FactoryModuleBuilder().implement(ChangesetsCommand.class, GitChangesetsCommand.class).build(GitChangesetsCommand.Factory.class));
}
}

View File

@@ -27,6 +27,8 @@ package sonia.scm.repository.spi;
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Module;
import com.google.inject.assistedinject.FactoryModuleBuilder;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
@@ -59,6 +61,7 @@ class GitRepositoryServiceProviderTest {
}
private GitRepositoryServiceProvider createProvider() {
return new GitRepositoryServiceProvider(createParentInjector(), context);
}
@@ -67,6 +70,9 @@ class GitRepositoryServiceProviderTest {
@Override
protected void configure() {
bind(GitRepositoryHandler.class).toInstance(handler);
FactoryModuleBuilder builder = new FactoryModuleBuilder();
Module module = builder.implement(PushCommand.class, GitPushCommand.class).build(GitPushCommand.Factory.class);
install(module);
}
});
}