Include dry run in merge command

This commit is contained in:
René Pfeuffer
2018-11-07 08:32:27 +01:00
parent 23783d43f6
commit fc3e08d612
12 changed files with 76 additions and 167 deletions

View File

@@ -6,6 +6,8 @@ import sonia.scm.repository.CloseableWrapper;
import sonia.scm.repository.GitWorkdirPool;
import sonia.scm.repository.InternalRepositoryException;
import sonia.scm.repository.Repository;
import sonia.scm.repository.api.MergeCommandResult;
import sonia.scm.repository.api.MergeDryRunCommandResult;
import java.io.IOException;
@@ -19,7 +21,7 @@ public class GitMergeCommand extends AbstractGitCommand implements MergeCommand
}
@Override
public boolean merge(MergeCommandRequest request) {
public MergeCommandResult merge(MergeCommandRequest request) {
try (CloseableWrapper<org.eclipse.jgit.lib.Repository> workingCopy = workdirPool.getWorkingCopy(context.open().getDirectory())) {
org.eclipse.jgit.lib.Repository repository = workingCopy.get();
ResolveMerger merger = (ResolveMerger) MergeStrategy.RECURSIVE.newMerger(repository);
@@ -27,7 +29,18 @@ public class GitMergeCommand extends AbstractGitCommand implements MergeCommand
if (mergeResult) {
// 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) {
throw new InternalRepositoryException(e);
}

View File

@@ -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);
}
}
}

View File

@@ -241,11 +241,6 @@ public class GitRepositoryServiceProvider extends RepositoryServiceProvider
return new GitTagsCommand(context, repository);
}
@Override
public MergeDryRunCommand getMergeDryRunCommand() {
return new GitMergeDryRunCommand(context, repository);
}
@Override
public MergeCommand getMergeCommand() {
return new GitMergeCommand(context, repository, handler.getWorkdirPool());

View File

@@ -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);
}
}

View File

@@ -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);
}
}