Fire RepositoryImportHookEvent instead of PostReceiveRepositoryHookEvent (#1561)

We will fire an RepositoryImportHookEvent instead of PostReceiveRepositoryHookEvent for repository imports with metadata. The event is only fired if all parts of the repository could be successfully imported. The extra event is required to avoid heavy recalculations which can be triggered by the PostReceiveRepositoryHookEvent for example the scm-statistic-plugin uses the PostReceiveRepositoryHookEvent to calculate its statistics.

Co-authored-by: Eduard Heimbuch <eduard.heimbuch@cloudogu.com>
This commit is contained in:
Sebastian Sdorra
2021-02-26 09:49:34 +01:00
committed by GitHub
parent c8621061bf
commit 888f5d699b
24 changed files with 252 additions and 144 deletions

View File

@@ -50,13 +50,13 @@ public class HgPullCommand extends AbstractHgPushOrPullCommand implements PullCo
private static final String AUTH_SECTION = "auth";
private final ScmEventBus eventBus;
private final HgLazyChangesetResolver changesetResolver;
private final HgPostReceiveRepositoryHookEventFactory eventFactory;
private final HgRepositoryHookEventFactory eventFactory;
public HgPullCommand(HgRepositoryHandler handler,
HgCommandContext context,
ScmEventBus eventBus,
HgLazyChangesetResolver changesetResolver,
HgPostReceiveRepositoryHookEventFactory eventFactory
HgRepositoryHookEventFactory eventFactory
) {
super(handler, context);
this.eventBus = eventBus;

View File

@@ -24,7 +24,6 @@
package sonia.scm.repository.spi;
import sonia.scm.repository.PostReceiveRepositoryHookEvent;
import sonia.scm.repository.RepositoryHookEvent;
import sonia.scm.repository.Tag;
import sonia.scm.repository.api.HookContext;
@@ -37,21 +36,20 @@ import static sonia.scm.repository.RepositoryHookType.POST_RECEIVE;
import static sonia.scm.repository.spi.HgBranchesTagsExtractor.extractBranches;
import static sonia.scm.repository.spi.HgBranchesTagsExtractor.extractTags;
class HgPostReceiveRepositoryHookEventFactory {
class HgRepositoryHookEventFactory {
private final HookContextFactory hookContextFactory;
@Inject
public HgPostReceiveRepositoryHookEventFactory(HookContextFactory hookContextFactory) {
public HgRepositoryHookEventFactory(HookContextFactory hookContextFactory) {
this.hookContextFactory = hookContextFactory;
}
PostReceiveRepositoryHookEvent createEvent(HgCommandContext hgContext, HgLazyChangesetResolver changesetResolver) {
RepositoryHookEvent createEvent(HgCommandContext hgContext, HgLazyChangesetResolver changesetResolver) {
List<String> branches = extractBranches(hgContext);
List<Tag> tags = extractTags(hgContext);
HgImportHookContextProvider contextProvider = new HgImportHookContextProvider(branches, tags, changesetResolver);
HookContext context = hookContextFactory.createContext(contextProvider, hgContext.getScmRepository());
RepositoryHookEvent repositoryHookEvent = new RepositoryHookEvent(context, hgContext.getScmRepository(), POST_RECEIVE);
return new PostReceiveRepositoryHookEvent(repositoryHookEvent);
return new RepositoryHookEvent(context, hgContext.getScmRepository(), POST_RECEIVE);
}
}

View File

@@ -66,12 +66,12 @@ public class HgRepositoryServiceProvider extends RepositoryServiceProvider {
private final HgRepositoryHandler handler;
private final HgCommandContext context;
private final HgLazyChangesetResolver lazyChangesetResolver;
private final HgPostReceiveRepositoryHookEventFactory eventFactory;
private final HgRepositoryHookEventFactory eventFactory;
private final ScmEventBus eventBus;
HgRepositoryServiceProvider(HgRepositoryHandler handler,
HgRepositoryFactory factory,
HgPostReceiveRepositoryHookEventFactory eventFactory,
HgRepositoryHookEventFactory eventFactory,
ScmEventBus eventBus,
Repository repository) {
this.handler = handler;
@@ -184,6 +184,6 @@ public class HgRepositoryServiceProvider extends RepositoryServiceProvider {
@Override
public UnbundleCommand getUnbundleCommand() {
return new HgUnbundleCommand(context, eventBus, lazyChangesetResolver, eventFactory);
return new HgUnbundleCommand(context, lazyChangesetResolver, eventFactory);
}
}

View File

@@ -40,13 +40,13 @@ public class HgRepositoryServiceResolver implements RepositoryServiceResolver {
private final HgRepositoryHandler handler;
private final HgRepositoryFactory factory;
private final ScmEventBus eventBus;
private final HgPostReceiveRepositoryHookEventFactory eventFactory;
private final HgRepositoryHookEventFactory eventFactory;
@Inject
public HgRepositoryServiceResolver(HgRepositoryHandler handler,
HgRepositoryFactory factory,
ScmEventBus eventBus,
HgPostReceiveRepositoryHookEventFactory eventFactory
HgRepositoryHookEventFactory eventFactory
) {
this.handler = handler;
this.factory = factory;

View File

@@ -27,7 +27,7 @@ package sonia.scm.repository.spi;
import com.google.common.io.ByteSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sonia.scm.event.ScmEventBus;
import sonia.scm.repository.RepositoryHookEvent;
import sonia.scm.repository.api.UnbundleResponse;
import java.io.IOException;
@@ -41,17 +41,14 @@ public class HgUnbundleCommand implements UnbundleCommand {
private static final Logger LOG = LoggerFactory.getLogger(HgUnbundleCommand.class);
private final HgCommandContext context;
private final ScmEventBus eventBus;
private final HgLazyChangesetResolver changesetResolver;
private final HgPostReceiveRepositoryHookEventFactory eventFactory;
private final HgRepositoryHookEventFactory eventFactory;
HgUnbundleCommand(HgCommandContext context,
ScmEventBus eventBus,
HgLazyChangesetResolver changesetResolver,
HgPostReceiveRepositoryHookEventFactory eventFactory
HgRepositoryHookEventFactory eventFactory
) {
this.context = context;
this.eventBus = eventBus;
this.changesetResolver = changesetResolver;
this.eventFactory = eventFactory;
}
@@ -67,12 +64,15 @@ public class HgUnbundleCommand implements UnbundleCommand {
}
unbundleRepositoryFromRequest(request, repositoryDir);
firePostReceiveRepositoryHookEvent();
fireHookEvent(request);
return new UnbundleResponse(0);
}
private void firePostReceiveRepositoryHookEvent() {
eventBus.post(eventFactory.createEvent(context, changesetResolver));
private void fireHookEvent(UnbundleCommandRequest request) {
RepositoryHookEvent event = eventFactory.createEvent(context, changesetResolver);
if (event != null) {
request.getPostEventSink().accept(event);
}
}
private void unbundleRepositoryFromRequest(UnbundleCommandRequest request, Path repositoryDir) throws IOException {