mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-12-24 01:09:48 +01:00
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:
@@ -62,13 +62,13 @@ public class GitPullCommand extends AbstractGitPushOrPullCommand
|
||||
private static final String REF_SPEC = "refs/heads/*:refs/heads/*";
|
||||
private static final Logger LOG = LoggerFactory.getLogger(GitPullCommand.class);
|
||||
private final ScmEventBus eventBus;
|
||||
private final GitPostReceiveRepositoryHookEventFactory eventFactory;
|
||||
private final GitRepositoryHookEventFactory eventFactory;
|
||||
|
||||
@Inject
|
||||
public GitPullCommand(GitRepositoryHandler handler,
|
||||
GitContext context,
|
||||
ScmEventBus eventBus,
|
||||
GitPostReceiveRepositoryHookEventFactory eventFactory) {
|
||||
GitRepositoryHookEventFactory eventFactory) {
|
||||
super(handler, context);
|
||||
this.eventBus = eventBus;
|
||||
this.eventFactory = eventFactory;
|
||||
|
||||
@@ -26,7 +26,6 @@ package sonia.scm.repository.spi;
|
||||
|
||||
import sonia.scm.repository.GitChangesetConverter;
|
||||
import sonia.scm.repository.GitChangesetConverterFactory;
|
||||
import sonia.scm.repository.PostReceiveRepositoryHookEvent;
|
||||
import sonia.scm.repository.RepositoryHookEvent;
|
||||
import sonia.scm.repository.Tag;
|
||||
import sonia.scm.repository.api.HookContext;
|
||||
@@ -38,18 +37,18 @@ import java.util.List;
|
||||
|
||||
import static sonia.scm.repository.RepositoryHookType.POST_RECEIVE;
|
||||
|
||||
class GitPostReceiveRepositoryHookEventFactory {
|
||||
class GitRepositoryHookEventFactory {
|
||||
|
||||
private final HookContextFactory hookContextFactory;
|
||||
private final GitChangesetConverterFactory changesetConverterFactory;
|
||||
|
||||
@Inject
|
||||
public GitPostReceiveRepositoryHookEventFactory(HookContextFactory hookContextFactory, GitChangesetConverterFactory changesetConverterFactory) {
|
||||
public GitRepositoryHookEventFactory(HookContextFactory hookContextFactory, GitChangesetConverterFactory changesetConverterFactory) {
|
||||
this.hookContextFactory = hookContextFactory;
|
||||
this.changesetConverterFactory = changesetConverterFactory;
|
||||
}
|
||||
|
||||
PostReceiveRepositoryHookEvent createEvent(GitContext gitContext,
|
||||
RepositoryHookEvent createEvent(GitContext gitContext,
|
||||
List<String> branches,
|
||||
List<Tag> tags,
|
||||
GitLazyChangesetResolver changesetResolver
|
||||
@@ -57,7 +56,6 @@ class GitPostReceiveRepositoryHookEventFactory {
|
||||
GitChangesetConverter converter = changesetConverterFactory.create(gitContext.open());
|
||||
GitImportHookContextProvider contextProvider = new GitImportHookContextProvider(converter, branches, tags, changesetResolver);
|
||||
HookContext context = hookContextFactory.createContext(contextProvider, gitContext.getRepository());
|
||||
RepositoryHookEvent repositoryHookEvent = new RepositoryHookEvent(context, gitContext.getRepository(), POST_RECEIVE);
|
||||
return new PostReceiveRepositoryHookEvent(repositoryHookEvent);
|
||||
return new RepositoryHookEvent(context, gitContext.getRepository(), POST_RECEIVE);
|
||||
}
|
||||
}
|
||||
@@ -30,7 +30,7 @@ import org.eclipse.jgit.lib.Ref;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import sonia.scm.ContextEntry;
|
||||
import sonia.scm.event.ScmEventBus;
|
||||
import sonia.scm.repository.RepositoryHookEvent;
|
||||
import sonia.scm.repository.Tag;
|
||||
import sonia.scm.repository.api.ImportFailedException;
|
||||
import sonia.scm.repository.api.UnbundleResponse;
|
||||
@@ -49,15 +49,11 @@ public class GitUnbundleCommand extends AbstractGitCommand implements UnbundleCo
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(GitUnbundleCommand.class);
|
||||
|
||||
private final ScmEventBus eventBus;
|
||||
private final GitPostReceiveRepositoryHookEventFactory eventFactory;
|
||||
private final GitRepositoryHookEventFactory eventFactory;
|
||||
|
||||
@Inject
|
||||
GitUnbundleCommand(GitContext context,
|
||||
ScmEventBus eventBus,
|
||||
GitPostReceiveRepositoryHookEventFactory eventFactory) {
|
||||
GitUnbundleCommand(GitContext context, GitRepositoryHookEventFactory eventFactory) {
|
||||
super(context);
|
||||
this.eventBus = eventBus;
|
||||
this.eventFactory = eventFactory;
|
||||
}
|
||||
|
||||
@@ -72,18 +68,21 @@ public class GitUnbundleCommand extends AbstractGitCommand implements UnbundleCo
|
||||
}
|
||||
|
||||
unbundleRepositoryFromRequest(request, repositoryDir);
|
||||
firePostReceiveRepositoryHookEvent();
|
||||
fireRepositoryHookEvent(request);
|
||||
|
||||
return new UnbundleResponse(0);
|
||||
}
|
||||
|
||||
private void firePostReceiveRepositoryHookEvent() {
|
||||
private void fireRepositoryHookEvent(UnbundleCommandRequest request) {
|
||||
try {
|
||||
Git git = Git.wrap(context.open());
|
||||
List<String> branches = extractBranches(git);
|
||||
List<Tag> tags = extractTags(git);
|
||||
GitLazyChangesetResolver changesetResolver = new GitLazyChangesetResolver(context.getRepository(), git);
|
||||
eventBus.post(eventFactory.createEvent(context, branches, tags, changesetResolver));
|
||||
RepositoryHookEvent event = eventFactory.createEvent(context, branches, tags, changesetResolver);
|
||||
if (event != null) {
|
||||
request.getPostEventSink().accept(event);
|
||||
}
|
||||
} catch (IOException | GitAPIException e) {
|
||||
throw new ImportFailedException(
|
||||
ContextEntry.ContextBuilder.entity(context.getRepository()).build(),
|
||||
|
||||
@@ -80,7 +80,7 @@ public class AbstractRemoteCommandTestBase {
|
||||
outgoing = Git.init().setDirectory(outgoingDirectory).setBare(false).call();
|
||||
|
||||
eventBus = mock(ScmEventBus.class);
|
||||
eventFactory = mock(GitPostReceiveRepositoryHookEventFactory.class);
|
||||
eventFactory = mock(GitRepositoryHookEventFactory.class);
|
||||
|
||||
handler = mock(GitRepositoryHandler.class);
|
||||
when(handler.getDirectory(incomingRepository.getId())).thenReturn(
|
||||
@@ -212,5 +212,5 @@ public class AbstractRemoteCommandTestBase {
|
||||
private ScmTransportProtocol proto;
|
||||
|
||||
protected ScmEventBus eventBus;
|
||||
protected GitPostReceiveRepositoryHookEventFactory eventFactory;
|
||||
protected GitRepositoryHookEventFactory eventFactory;
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@ import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import sonia.scm.repository.Changeset;
|
||||
import sonia.scm.repository.GitChangesetConverterFactory;
|
||||
import sonia.scm.repository.PostReceiveRepositoryHookEvent;
|
||||
import sonia.scm.repository.RepositoryHookEvent;
|
||||
import sonia.scm.repository.Tag;
|
||||
import sonia.scm.repository.api.HookContext;
|
||||
import sonia.scm.repository.api.HookContextFactory;
|
||||
@@ -48,7 +48,7 @@ public class GitPostReceiveRepositoryHookEventFactoryTest extends AbstractGitCom
|
||||
|
||||
private HookContext hookContext;
|
||||
|
||||
private GitPostReceiveRepositoryHookEventFactory eventFactory;
|
||||
private GitRepositoryHookEventFactory eventFactory;
|
||||
|
||||
@Before
|
||||
public void init() {
|
||||
@@ -56,7 +56,7 @@ public class GitPostReceiveRepositoryHookEventFactoryTest extends AbstractGitCom
|
||||
hookContext = mock(HookContext.class, RETURNS_DEEP_STUBS);
|
||||
when(hookContextFactory.createContext(any(), eq(repository))).thenReturn(hookContext);
|
||||
GitChangesetConverterFactory converterFactory = mock(GitChangesetConverterFactory.class);
|
||||
eventFactory = new GitPostReceiveRepositoryHookEventFactory(hookContextFactory, converterFactory);
|
||||
eventFactory = new GitRepositoryHookEventFactory(hookContextFactory, converterFactory);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -68,7 +68,7 @@ public class GitPostReceiveRepositoryHookEventFactoryTest extends AbstractGitCom
|
||||
when(hookContext.getBranchProvider().getCreatedOrModified()).thenReturn(branches);
|
||||
when(hookContext.getTagProvider().getCreatedTags()).thenReturn(tags);
|
||||
|
||||
PostReceiveRepositoryHookEvent event = eventFactory.createEvent(
|
||||
RepositoryHookEvent event = eventFactory.createEvent(
|
||||
createContext(),
|
||||
branches,
|
||||
tags,
|
||||
|
||||
@@ -28,8 +28,6 @@ import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
|
||||
import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import sonia.scm.event.ScmEventBus;
|
||||
import sonia.scm.repository.PostReceiveRepositoryHookEvent;
|
||||
import sonia.scm.repository.RepositoryHookEvent;
|
||||
import sonia.scm.repository.RepositoryHookType;
|
||||
import sonia.scm.util.Archives;
|
||||
@@ -37,40 +35,41 @@ import sonia.scm.util.Archives;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
public class GitUnbundleCommandTest extends AbstractGitCommandTestBase {
|
||||
private ScmEventBus eventBus;
|
||||
private GitUnbundleCommand unbundleCommand;
|
||||
private GitPostReceiveRepositoryHookEventFactory eventFactory;
|
||||
private GitRepositoryHookEventFactory eventFactory;
|
||||
|
||||
@Before
|
||||
public void initUnbundleCommand() {
|
||||
eventBus = mock(ScmEventBus.class);
|
||||
eventFactory = mock(GitPostReceiveRepositoryHookEventFactory.class);
|
||||
unbundleCommand = new GitUnbundleCommand(createContext(), eventBus, eventFactory);
|
||||
eventFactory = mock(GitRepositoryHookEventFactory.class);
|
||||
unbundleCommand = new GitUnbundleCommand(createContext(), eventFactory);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldUnbundleRepositoryFiles() throws IOException {
|
||||
when(eventFactory.createEvent(eq(createContext()), any(), any(), any()))
|
||||
.thenReturn(new PostReceiveRepositoryHookEvent(new RepositoryHookEvent(null, repository, RepositoryHookType.POST_RECEIVE)));
|
||||
RepositoryHookEvent event = new RepositoryHookEvent(null, repository, RepositoryHookType.POST_RECEIVE);
|
||||
when(eventFactory.createEvent(eq(createContext()), any(), any(), any())).thenReturn(event);
|
||||
|
||||
AtomicReference<RepositoryHookEvent> receivedEvent = new AtomicReference<>();
|
||||
|
||||
String filePath = "test-input";
|
||||
String fileContent = "HeartOfGold";
|
||||
UnbundleCommandRequest unbundleCommandRequest = createUnbundleCommandRequestForFile(filePath, fileContent);
|
||||
unbundleCommandRequest.setPostEventSink(receivedEvent::set);
|
||||
|
||||
unbundleCommand.unbundle(unbundleCommandRequest);
|
||||
|
||||
assertFileWithContentWasCreated(createContext().getDirectory(), filePath, fileContent);
|
||||
|
||||
verify(eventBus).post(any(PostReceiveRepositoryHookEvent.class));
|
||||
assertThat(receivedEvent.get()).isSameAs(event);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
Reference in New Issue
Block a user