diff --git a/scm-core/src/main/java/sonia/scm/repository/api/MergeCommandBuilder.java b/scm-core/src/main/java/sonia/scm/repository/api/MergeCommandBuilder.java index df9f6bdfbe..6910dc02fa 100644 --- a/scm-core/src/main/java/sonia/scm/repository/api/MergeCommandBuilder.java +++ b/scm-core/src/main/java/sonia/scm/repository/api/MergeCommandBuilder.java @@ -55,6 +55,15 @@ public class MergeCommandBuilder { this.mergeCommand = mergeCommand; } + /** + * Use this to check if merge-strategy is supported by mergeCommand + * + * @return boolean. + */ + public boolean isSupported(MergeStrategy strategy) { + return mergeCommand.isSupported(strategy); + } + /** * Use this to set the branch that should be merged into the target branch. * @@ -99,8 +108,8 @@ public class MergeCommandBuilder { * * @return This builder instance. */ - public MergeCommandBuilder setMergeStrategy(ScmMergeStrategy strategy) { - request.setScmMergeStrategy(strategy); + public MergeCommandBuilder setMergeStrategy(MergeStrategy strategy) { + request.setMergeStrategy(strategy); return this; } diff --git a/scm-core/src/main/java/sonia/scm/repository/api/ScmMergeStrategy.java b/scm-core/src/main/java/sonia/scm/repository/api/MergeStrategy.java similarity index 59% rename from scm-core/src/main/java/sonia/scm/repository/api/ScmMergeStrategy.java rename to scm-core/src/main/java/sonia/scm/repository/api/MergeStrategy.java index 7ff1b6bc51..9968dd61e2 100644 --- a/scm-core/src/main/java/sonia/scm/repository/api/ScmMergeStrategy.java +++ b/scm-core/src/main/java/sonia/scm/repository/api/MergeStrategy.java @@ -1,5 +1,5 @@ package sonia.scm.repository.api; -public enum ScmMergeStrategy { +public enum MergeStrategy { SQUASH } diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/MergeCommand.java b/scm-core/src/main/java/sonia/scm/repository/spi/MergeCommand.java index 0a3680f6b3..cc20db4c5d 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/MergeCommand.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/MergeCommand.java @@ -2,9 +2,12 @@ package sonia.scm.repository.spi; import sonia.scm.repository.api.MergeCommandResult; import sonia.scm.repository.api.MergeDryRunCommandResult; +import sonia.scm.repository.api.MergeStrategy; public interface MergeCommand { MergeCommandResult merge(MergeCommandRequest request); MergeDryRunCommandResult dryRun(MergeCommandRequest request); + + boolean isSupported(MergeStrategy strategy); } diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/MergeCommandRequest.java b/scm-core/src/main/java/sonia/scm/repository/spi/MergeCommandRequest.java index f7094a5e7f..0751920d01 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/MergeCommandRequest.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/MergeCommandRequest.java @@ -5,7 +5,7 @@ import com.google.common.base.Objects; import com.google.common.base.Strings; import sonia.scm.Validateable; import sonia.scm.repository.Person; -import sonia.scm.repository.api.ScmMergeStrategy; +import sonia.scm.repository.api.MergeStrategy; import sonia.scm.repository.util.AuthorUtil.CommandWithAuthor; import java.io.Serializable; @@ -18,7 +18,7 @@ public class MergeCommandRequest implements Validateable, Resetable, Serializabl private String targetBranch; private Person author; private String messageTemplate; - private ScmMergeStrategy scmMergeStrategy; + private MergeStrategy mergeStrategy; public String getBranchToMerge() { return branchToMerge; @@ -52,12 +52,12 @@ public class MergeCommandRequest implements Validateable, Resetable, Serializabl this.messageTemplate = messageTemplate; } - public ScmMergeStrategy getScmMergeStrategy() { - return scmMergeStrategy; + public MergeStrategy getMergeStrategy() { + return mergeStrategy; } - public void setScmMergeStrategy(ScmMergeStrategy scmMergeStrategy) { - this.scmMergeStrategy = scmMergeStrategy; + public void setMergeStrategy(MergeStrategy mergeStrategy) { + this.mergeStrategy = mergeStrategy; } public boolean isValid() { @@ -85,12 +85,12 @@ public class MergeCommandRequest implements Validateable, Resetable, Serializabl return Objects.equal(branchToMerge, other.branchToMerge) && Objects.equal(targetBranch, other.targetBranch) && Objects.equal(author, other.author) - && Objects.equal(scmMergeStrategy, other.scmMergeStrategy); + && Objects.equal(mergeStrategy, other.mergeStrategy); } @Override public int hashCode() { - return Objects.hashCode(branchToMerge, targetBranch, author, scmMergeStrategy); + return Objects.hashCode(branchToMerge, targetBranch, author, mergeStrategy); } @Override @@ -99,7 +99,7 @@ public class MergeCommandRequest implements Validateable, Resetable, Serializabl .add("branchToMerge", branchToMerge) .add("targetBranch", targetBranch) .add("author", author) - .add("mergeStrategy", scmMergeStrategy) + .add("mergeStrategy", mergeStrategy) .toString(); } } diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitMergeCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitMergeCommand.java index bafe6b8376..35e2f1e144 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitMergeCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitMergeCommand.java @@ -1,13 +1,13 @@ package sonia.scm.repository.spi; import com.google.common.base.Strings; +import com.google.common.collect.ImmutableSet; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.MergeCommand.FastForwardMode; import org.eclipse.jgit.api.MergeResult; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Repository; -import org.eclipse.jgit.merge.MergeStrategy; import org.eclipse.jgit.merge.ResolveMerger; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -16,10 +16,11 @@ import sonia.scm.repository.InternalRepositoryException; import sonia.scm.repository.Person; import sonia.scm.repository.api.MergeCommandResult; import sonia.scm.repository.api.MergeDryRunCommandResult; -import sonia.scm.repository.api.ScmMergeStrategy; +import sonia.scm.repository.api.MergeStrategy; import java.io.IOException; import java.text.MessageFormat; +import java.util.Set; public class GitMergeCommand extends AbstractGitCommand implements MergeCommand { @@ -32,6 +33,8 @@ public class GitMergeCommand extends AbstractGitCommand implements MergeCommand private final GitWorkdirFactory workdirFactory; + private static final Set STRATEGIES = ImmutableSet.of(MergeStrategy.SQUASH); + GitMergeCommand(GitContext context, sonia.scm.repository.Repository repository, GitWorkdirFactory workdirFactory) { super(context, repository); this.workdirFactory = workdirFactory; @@ -46,7 +49,7 @@ public class GitMergeCommand extends AbstractGitCommand implements MergeCommand public MergeDryRunCommandResult dryRun(MergeCommandRequest request) { try { Repository repository = context.open(); - ResolveMerger merger = (ResolveMerger) MergeStrategy.RECURSIVE.newMerger(repository, true); + ResolveMerger merger = (ResolveMerger) org.eclipse.jgit.merge.MergeStrategy.RECURSIVE.newMerger(repository, true); return new MergeDryRunCommandResult( merger.merge( resolveRevisionOrThrowNotFound(repository, request.getBranchToMerge()), @@ -56,13 +59,18 @@ public class GitMergeCommand extends AbstractGitCommand implements MergeCommand } } + @Override + public boolean isSupported(MergeStrategy strategy) { + return STRATEGIES.contains(strategy); + } + private class MergeWorker extends GitCloneWorker { private final String target; private final String toMerge; private final Person author; private final String messageTemplate; - private final ScmMergeStrategy scmMergeStrategy; + private final MergeStrategy mergeStrategy; private MergeWorker(Git clone, MergeCommandRequest request) { super(clone); @@ -70,7 +78,7 @@ public class GitMergeCommand extends AbstractGitCommand implements MergeCommand this.toMerge = request.getBranchToMerge(); this.author = request.getAuthor(); this.messageTemplate = request.getMessageTemplate(); - this.scmMergeStrategy = request.getScmMergeStrategy(); + this.mergeStrategy = request.getMergeStrategy(); } @Override @@ -94,7 +102,7 @@ public class GitMergeCommand extends AbstractGitCommand implements MergeCommand .setCommit(false) // we want to set the author manually .include(toMerge, sourceRevision); - if (scmMergeStrategy == ScmMergeStrategy.SQUASH) { + if (mergeStrategy == MergeStrategy.SQUASH) { mergeCommand.setSquash(true); } else { mergeCommand.setFastForward(FastForwardMode.NO_FF); diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitMergeCommandTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitMergeCommandTest.java index 873dd23498..f27b1e3760 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitMergeCommandTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitMergeCommandTest.java @@ -15,7 +15,7 @@ import org.junit.Test; import sonia.scm.NotFoundException; import sonia.scm.repository.Person; import sonia.scm.repository.api.MergeCommandResult; -import sonia.scm.repository.api.ScmMergeStrategy; +import sonia.scm.repository.api.MergeStrategy; import sonia.scm.repository.util.WorkdirProvider; import sonia.scm.user.User; @@ -221,7 +221,7 @@ public class GitMergeCommandTest extends AbstractGitCommandTestBase { request.setBranchToMerge("squash"); request.setTargetBranch("master"); request.setMessageTemplate("this is a squash"); - request.setScmMergeStrategy(ScmMergeStrategy.SQUASH); + request.setMergeStrategy(MergeStrategy.SQUASH); MergeCommandResult mergeCommandResult = command.merge(request); @@ -244,7 +244,7 @@ public class GitMergeCommandTest extends AbstractGitCommandTestBase { request.setBranchToMerge("squash"); request.setTargetBranch("master"); request.setMessageTemplate("squash three commits"); - request.setScmMergeStrategy(ScmMergeStrategy.SQUASH); + request.setMergeStrategy(MergeStrategy.SQUASH); Repository gitRepository = createContext().open(); MergeCommandResult mergeCommandResult = command.merge(request);