diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitMergeDryRunCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitMergeDryRunCommand.java new file mode 100644 index 0000000000..e49c520457 --- /dev/null +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitMergeDryRunCommand.java @@ -0,0 +1,25 @@ +package sonia.scm.repository.spi; + +import org.eclipse.jgit.merge.MergeStrategy; +import org.eclipse.jgit.merge.ResolveMerger; +import sonia.scm.repository.InternalRepositoryException; +import sonia.scm.repository.Repository; + +import java.io.IOException; + +public class GitMergeDryRunCommand extends AbstractGitCommand implements MergeDryRunCommand { + GitMergeDryRunCommand(GitContext context, Repository repository) { + super(context, repository); + } + + @Override + public boolean isMergeable(MergeDryRunCommandRequest request) { + try { + org.eclipse.jgit.lib.Repository repository = context.open(); + ResolveMerger merger = (ResolveMerger) MergeStrategy.RECURSIVE.newMerger(repository, true); + return merger.merge(repository.resolve(request.getBranchToMerge()), repository.resolve(request.getTargetBranch())); + } catch (IOException e) { + throw new InternalRepositoryException(e); + } + } +} diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitRepositoryServiceProvider.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitRepositoryServiceProvider.java index d60abd424d..dd6c1b5492 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitRepositoryServiceProvider.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitRepositoryServiceProvider.java @@ -63,7 +63,8 @@ public class GitRepositoryServiceProvider extends RepositoryServiceProvider Command.INCOMING, Command.OUTGOING, Command.PUSH, - Command.PULL + Command.PULL, + Command.MERGE_DRY_RUN ); //J+ @@ -240,7 +241,11 @@ public class GitRepositoryServiceProvider extends RepositoryServiceProvider return new GitTagsCommand(context, repository); } - //~--- fields --------------------------------------------------------------- + @Override + public MergeDryRunCommand getMergeDryRunCommand() { + return new GitMergeDryRunCommand(context, repository); + } +//~--- fields --------------------------------------------------------------- /** Field description */ private GitContext context; diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitMergeDryRunCommandTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitMergeDryRunCommandTest.java new file mode 100644 index 0000000000..891b8537dd --- /dev/null +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitMergeDryRunCommandTest.java @@ -0,0 +1,23 @@ +package sonia.scm.repository.spi; + +import org.junit.Assert; +import org.junit.Test; + +public class GitMergeDryRunCommandTest extends AbstractGitCommandTestBase { + @Test + public void shouldDetectNotMergeableBranches() { + GitMergeDryRunCommand command = createCommand(); + MergeDryRunCommandRequest request = new MergeDryRunCommandRequest(); + request.setBranchToMerge("test-branch"); + request.setTargetBranch("master"); + + boolean mergeable = command.isMergeable(request); + + Assert.assertFalse(mergeable); + } + + private GitMergeDryRunCommand createCommand() + { + return new GitMergeDryRunCommand(createContext(), repository); + } +}