mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-11-07 05:55:44 +01:00
Include dry run in merge command
This commit is contained in:
@@ -28,8 +28,13 @@ public class MergeCommandBuilder {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean execute() {
|
public MergeCommandResult executeMerge() {
|
||||||
Preconditions.checkArgument(request.isValid(), "revision to merge and target revision is required");
|
Preconditions.checkArgument(request.isValid(), "revision to merge and target revision is required");
|
||||||
return mergeCommand.merge(request);
|
return mergeCommand.merge(request);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public MergeDryRunCommandResult dryRun() {
|
||||||
|
Preconditions.checkArgument(request.isValid(), "revision to merge and target revision is required");
|
||||||
|
return mergeCommand.dryRun(request);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package sonia.scm.repository.api;
|
||||||
|
|
||||||
|
public class MergeCommandResult {
|
||||||
|
private final boolean success;
|
||||||
|
|
||||||
|
public MergeCommandResult(boolean success) {
|
||||||
|
this.success = success;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSuccess() {
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
package sonia.scm.repository.api;
|
|
||||||
|
|
||||||
import com.google.common.base.Preconditions;
|
|
||||||
import sonia.scm.repository.spi.MergeCommand;
|
|
||||||
import sonia.scm.repository.spi.MergeCommandRequest;
|
|
||||||
|
|
||||||
public class MergeDryRunCommandBuilder {
|
|
||||||
|
|
||||||
private final MergeCommand mergeCommand;
|
|
||||||
private final MergeCommandRequest request = new MergeCommandRequest();
|
|
||||||
|
|
||||||
public MergeDryRunCommandBuilder(MergeCommand mergeCommand) {
|
|
||||||
this.mergeCommand = mergeCommand;
|
|
||||||
}
|
|
||||||
|
|
||||||
public MergeDryRunCommandBuilder setBranchToMerge(String branchToMerge) {
|
|
||||||
request.setBranchToMerge(branchToMerge);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public MergeDryRunCommandBuilder setTargetBranch(String targetBranch) {
|
|
||||||
request.setTargetBranch(targetBranch);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public MergeDryRunCommandBuilder reset() {
|
|
||||||
request.reset();
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean execute() {
|
|
||||||
Preconditions.checkArgument(request.isValid(), "revision to merge and target revision is required");
|
|
||||||
return mergeCommand.merge(request);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
package sonia.scm.repository.api;
|
||||||
|
|
||||||
|
public class MergeDryRunCommandResult {
|
||||||
|
|
||||||
|
private final boolean mergeable;
|
||||||
|
|
||||||
|
public MergeDryRunCommandResult(boolean mergeable) {
|
||||||
|
this.mergeable = mergeable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isMergeable() {
|
||||||
|
return mergeable;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,10 @@
|
|||||||
package sonia.scm.repository.spi;
|
package sonia.scm.repository.spi;
|
||||||
|
|
||||||
|
import sonia.scm.repository.api.MergeCommandResult;
|
||||||
|
import sonia.scm.repository.api.MergeDryRunCommandResult;
|
||||||
|
|
||||||
public interface MergeCommand {
|
public interface MergeCommand {
|
||||||
boolean merge(MergeCommandRequest request);
|
MergeCommandResult merge(MergeCommandRequest request);
|
||||||
|
|
||||||
|
MergeDryRunCommandResult dryRun(MergeCommandRequest request);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
package sonia.scm.repository.spi;
|
|
||||||
|
|
||||||
public interface MergeDryRunCommand {
|
|
||||||
boolean isMergeable(MergeDryRunCommandRequest request);
|
|
||||||
}
|
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
package sonia.scm.repository.spi;
|
|
||||||
|
|
||||||
import com.google.common.base.MoreObjects;
|
|
||||||
import com.google.common.base.Objects;
|
|
||||||
import com.google.common.base.Strings;
|
|
||||||
import sonia.scm.Validateable;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
|
||||||
|
|
||||||
public class MergeDryRunCommandRequest implements Validateable, Resetable, Serializable, Cloneable {
|
|
||||||
|
|
||||||
private static final long serialVersionUID = -2650236557922431528L;
|
|
||||||
|
|
||||||
private String branchToMerge;
|
|
||||||
private String targetBranch;
|
|
||||||
|
|
||||||
public String getBranchToMerge() {
|
|
||||||
return branchToMerge;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBranchToMerge(String branchToMerge) {
|
|
||||||
this.branchToMerge = branchToMerge;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getTargetBranch() {
|
|
||||||
return targetBranch;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setTargetBranch(String targetBranch) {
|
|
||||||
this.targetBranch = targetBranch;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isValid() {
|
|
||||||
return !Strings.isNullOrEmpty(getBranchToMerge()) && !Strings.isNullOrEmpty(getTargetBranch());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void reset() {
|
|
||||||
this.setBranchToMerge(null);
|
|
||||||
this.setTargetBranch(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object obj) {
|
|
||||||
if (obj == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (getClass() != obj.getClass()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
final MergeDryRunCommandRequest other = (MergeDryRunCommandRequest) obj;
|
|
||||||
|
|
||||||
return Objects.equal(branchToMerge, other.branchToMerge)
|
|
||||||
&& Objects.equal(targetBranch, other.targetBranch);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
return Objects.hashCode(branchToMerge, targetBranch);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return MoreObjects.toStringHelper(this)
|
|
||||||
.add("branchToMerge", branchToMerge)
|
|
||||||
.add("targetBranch", targetBranch)
|
|
||||||
.toString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -6,6 +6,8 @@ import sonia.scm.repository.CloseableWrapper;
|
|||||||
import sonia.scm.repository.GitWorkdirPool;
|
import sonia.scm.repository.GitWorkdirPool;
|
||||||
import sonia.scm.repository.InternalRepositoryException;
|
import sonia.scm.repository.InternalRepositoryException;
|
||||||
import sonia.scm.repository.Repository;
|
import sonia.scm.repository.Repository;
|
||||||
|
import sonia.scm.repository.api.MergeCommandResult;
|
||||||
|
import sonia.scm.repository.api.MergeDryRunCommandResult;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
@@ -19,7 +21,7 @@ public class GitMergeCommand extends AbstractGitCommand implements MergeCommand
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean merge(MergeCommandRequest request) {
|
public MergeCommandResult merge(MergeCommandRequest request) {
|
||||||
try (CloseableWrapper<org.eclipse.jgit.lib.Repository> workingCopy = workdirPool.getWorkingCopy(context.open().getDirectory())) {
|
try (CloseableWrapper<org.eclipse.jgit.lib.Repository> workingCopy = workdirPool.getWorkingCopy(context.open().getDirectory())) {
|
||||||
org.eclipse.jgit.lib.Repository repository = workingCopy.get();
|
org.eclipse.jgit.lib.Repository repository = workingCopy.get();
|
||||||
ResolveMerger merger = (ResolveMerger) MergeStrategy.RECURSIVE.newMerger(repository);
|
ResolveMerger merger = (ResolveMerger) MergeStrategy.RECURSIVE.newMerger(repository);
|
||||||
@@ -27,7 +29,18 @@ public class GitMergeCommand extends AbstractGitCommand implements MergeCommand
|
|||||||
if (mergeResult) {
|
if (mergeResult) {
|
||||||
// TODO push and verify push was successful
|
// TODO push and verify push was successful
|
||||||
}
|
}
|
||||||
return mergeResult;
|
return new MergeCommandResult(mergeResult);
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new InternalRepositoryException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MergeDryRunCommandResult dryRun(MergeCommandRequest request) {
|
||||||
|
try {
|
||||||
|
org.eclipse.jgit.lib.Repository repository = context.open();
|
||||||
|
ResolveMerger merger = (ResolveMerger) MergeStrategy.RECURSIVE.newMerger(repository, true);
|
||||||
|
return new MergeDryRunCommandResult(merger.merge(repository.resolve(request.getBranchToMerge()), repository.resolve(request.getTargetBranch())));
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new InternalRepositoryException(e);
|
throw new InternalRepositoryException(e);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -241,11 +241,6 @@ public class GitRepositoryServiceProvider extends RepositoryServiceProvider
|
|||||||
return new GitTagsCommand(context, repository);
|
return new GitTagsCommand(context, repository);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public MergeDryRunCommand getMergeDryRunCommand() {
|
|
||||||
return new GitMergeDryRunCommand(context, repository);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MergeCommand getMergeCommand() {
|
public MergeCommand getMergeCommand() {
|
||||||
return new GitMergeCommand(context, repository, handler.getWorkdirPool());
|
return new GitMergeCommand(context, repository, handler.getWorkdirPool());
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package sonia.scm.repository.spi;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class GitMergeCommandTest extends AbstractGitCommandTestBase {
|
||||||
|
@Test
|
||||||
|
public void shouldDetectNotMergeableBranches() {
|
||||||
|
GitMergeCommand command = createCommand();
|
||||||
|
MergeCommandRequest request = new MergeCommandRequest();
|
||||||
|
request.setBranchToMerge("test-branch");
|
||||||
|
request.setTargetBranch("master");
|
||||||
|
|
||||||
|
boolean mergeable = command.dryRun(request).isMergeable();
|
||||||
|
|
||||||
|
Assert.assertFalse(mergeable);
|
||||||
|
}
|
||||||
|
|
||||||
|
private GitMergeCommand createCommand() {
|
||||||
|
return new GitMergeCommand(createContext(), repository, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user