diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/api/GitPreReceiveHookMergeDetectionProvider.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/api/GitReceiveHookMergeDetectionProvider.java similarity index 59% rename from scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/api/GitPreReceiveHookMergeDetectionProvider.java rename to scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/api/GitReceiveHookMergeDetectionProvider.java index 3f760bdaaa..fef5806412 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/api/GitPreReceiveHookMergeDetectionProvider.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/api/GitReceiveHookMergeDetectionProvider.java @@ -24,40 +24,33 @@ package sonia.scm.repository.api; -import org.eclipse.jgit.lib.AnyObjectId; import org.eclipse.jgit.lib.Repository; -import org.eclipse.jgit.transport.ReceiveCommand; -import sonia.scm.repository.ChangesetPagingResult; -import sonia.scm.repository.GitUtil; import sonia.scm.repository.spi.GitLogComputer; import sonia.scm.repository.spi.HookMergeDetectionProvider; import sonia.scm.repository.spi.LogCommandRequest; -import java.util.List; - -public class GitPreReceiveHookMergeDetectionProvider implements HookMergeDetectionProvider { - private final List receiveCommands; +public class GitReceiveHookMergeDetectionProvider implements HookMergeDetectionProvider { private final Repository repository; private final String repositoryId; + private final BranchMapper branchMapper; - public GitPreReceiveHookMergeDetectionProvider(List receiveCommands, Repository repository, String repositoryId) { - this.receiveCommands = receiveCommands; + public GitReceiveHookMergeDetectionProvider(Repository repository, String repositoryId, BranchMapper branchMapper) { this.repository = repository; this.repositoryId = repositoryId; + this.branchMapper = branchMapper; } @Override public boolean branchesMerged(String target, String branch) { - - String sourceToUse = receiveCommands.stream().filter(receiveCommand -> GitUtil.getBranch(receiveCommand.getRef()).equals(branch)).findFirst().map(ReceiveCommand::getNewId).map(AnyObjectId::getName).orElse(branch); - String targetToUse = receiveCommands.stream().filter(receiveCommand -> GitUtil.getBranch(receiveCommand.getRef()).equals(target)).findFirst().map(ReceiveCommand::getNewId).map(AnyObjectId::getName).orElse(target); - LogCommandRequest request = new LogCommandRequest(); - request.setBranch(sourceToUse); - request.setAncestorChangeset(targetToUse); + request.setBranch(branchMapper.map(branch)); + request.setAncestorChangeset(branchMapper.map(target)); request.setPagingLimit(1); - ChangesetPagingResult changesets = new GitLogComputer(repositoryId, repository).compute(request); - return changesets.getTotal() == 0; + return new GitLogComputer(repositoryId, repository).compute(request).getTotal() == 0; + } + + public interface BranchMapper { + String map(String branch); } } diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitHookContextProvider.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitHookContextProvider.java index aaa5f09bda..755223afc2 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitHookContextProvider.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitHookContextProvider.java @@ -26,15 +26,16 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- +import org.eclipse.jgit.lib.AnyObjectId; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.transport.ReceiveCommand; import org.eclipse.jgit.transport.ReceivePack; +import sonia.scm.repository.GitUtil; import sonia.scm.repository.RepositoryHookType; import sonia.scm.repository.api.GitHookBranchProvider; import sonia.scm.repository.api.GitHookMessageProvider; import sonia.scm.repository.api.GitHookTagProvider; -import sonia.scm.repository.api.GitPostReceiveHookMergeDetectionProvider; -import sonia.scm.repository.api.GitPreReceiveHookMergeDetectionProvider; +import sonia.scm.repository.api.GitReceiveHookMergeDetectionProvider; import sonia.scm.repository.api.HookBranchProvider; import sonia.scm.repository.api.HookFeature; import sonia.scm.repository.api.HookMessageProvider; @@ -116,12 +117,26 @@ public class GitHookContextProvider extends HookContextProvider @Override public HookMergeDetectionProvider getMergeDetectionProvider() { if (type == RepositoryHookType.POST_RECEIVE) { - return new GitPostReceiveHookMergeDetectionProvider(repository, repositoryId); + return new GitReceiveHookMergeDetectionProvider(repository, repositoryId, branch -> branch); } else { - return new GitPreReceiveHookMergeDetectionProvider(receiveCommands, repository, repositoryId); + return new GitReceiveHookMergeDetectionProvider(repository, repositoryId, this::findNewRevisionForBranchIfToBeUpdated); } } + private String findNewRevisionForBranchIfToBeUpdated(String branch) { + return receiveCommands + .stream() + .filter(receiveCommand -> isReceiveCommandForBranch(branch, receiveCommand)) + .map(ReceiveCommand::getNewId) + .map(AnyObjectId::getName) + .findFirst() + .orElse(branch); + } + + private boolean isReceiveCommandForBranch(String branch, ReceiveCommand receiveCommand) { + return GitUtil.getBranch(receiveCommand.getRef()).equals(branch); + } + @Override public Set getSupportedFeatures() {