Let merges without effect throw an exception

This commit is contained in:
Rene Pfeuffer
2019-12-19 09:47:31 +01:00
parent 1d3e51ce7b
commit f7c4894fb2
7 changed files with 21 additions and 26 deletions

View File

@@ -7,6 +7,12 @@ import sonia.scm.repository.api.MergeStrategy;
import java.util.Set; import java.util.Set;
public interface MergeCommand { public interface MergeCommand {
/**
* Executes the merge.
* @param request The parameters specifying the merge.
* @return Result holding either the new revision or a list of conflicting files.
* @throws sonia.scm.NoChangesMadeException If the merge neither had a conflict nor made any change.
*/
MergeCommandResult merge(MergeCommandRequest request); MergeCommandResult merge(MergeCommandRequest request);
MergeDryRunCommandResult dryRun(MergeCommandRequest request); MergeDryRunCommandResult dryRun(MergeCommandRequest request);

View File

@@ -186,6 +186,10 @@ class AbstractGitCommand
return context; return context;
} }
sonia.scm.repository.Repository getRepository() {
return repository;
}
void checkOutBranch(String branchName) throws IOException { void checkOutBranch(String branchName) throws IOException {
try { try {
clone.checkout().setName(branchName).call(); clone.checkout().setName(branchName).call();

View File

@@ -4,6 +4,7 @@ import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.MergeCommand; import org.eclipse.jgit.api.MergeCommand;
import org.eclipse.jgit.api.MergeResult; import org.eclipse.jgit.api.MergeResult;
import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevCommit;
import sonia.scm.NoChangesMadeException;
import sonia.scm.repository.Repository; import sonia.scm.repository.Repository;
import sonia.scm.repository.api.MergeCommandResult; import sonia.scm.repository.api.MergeCommandResult;
@@ -26,7 +27,7 @@ class GitMergeCommit extends GitMergeStrategy {
MergeResult result = doMergeInClone(mergeCommand); MergeResult result = doMergeInClone(mergeCommand);
if (result.getMergeStatus().isSuccessful()) { if (result.getMergeStatus().isSuccessful()) {
Optional<RevCommit> revCommit = doCommit(); RevCommit revCommit = doCommit().orElseThrow(() -> new NoChangesMadeException(getRepository()));
push(); push();
return MergeCommandResult.success(extractRevisionFromRevCommit(revCommit)); return MergeCommandResult.success(extractRevisionFromRevCommit(revCommit));
} else { } else {

View File

@@ -4,6 +4,7 @@ import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.MergeCommand; import org.eclipse.jgit.api.MergeCommand;
import org.eclipse.jgit.api.MergeResult; import org.eclipse.jgit.api.MergeResult;
import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevCommit;
import sonia.scm.NoChangesMadeException;
import sonia.scm.repository.Repository; import sonia.scm.repository.Repository;
import sonia.scm.repository.api.MergeCommandResult; import sonia.scm.repository.api.MergeCommandResult;
@@ -26,7 +27,7 @@ class GitMergeWithSquash extends GitMergeStrategy {
MergeResult result = doMergeInClone(mergeCommand); MergeResult result = doMergeInClone(mergeCommand);
if (result.getMergeStatus().isSuccessful()) { if (result.getMergeStatus().isSuccessful()) {
Optional<RevCommit> revCommit = doCommit(); RevCommit revCommit = doCommit().orElseThrow(() -> new NoChangesMadeException(getRepository()));
push(); push();
return MergeCommandResult.success(extractRevisionFromRevCommit(revCommit)); return MergeCommandResult.success(extractRevisionFromRevCommit(revCommit));
} else { } else {

View File

@@ -6,10 +6,7 @@ import java.util.Optional;
public class GitRevisionExtractor { public class GitRevisionExtractor {
static String extractRevisionFromRevCommit(Optional<RevCommit> revCommit) { static String extractRevisionFromRevCommit(RevCommit revCommit) {
if (revCommit.isPresent()) { return revCommit.toString().split(" ")[1];
return revCommit.get().toString().split(" ")[1];
}
return "";
} }
} }

View File

@@ -12,6 +12,7 @@ import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevCommit;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import sonia.scm.NoChangesMadeException;
import sonia.scm.NotFoundException; import sonia.scm.NotFoundException;
import sonia.scm.repository.Person; import sonia.scm.repository.Person;
import sonia.scm.repository.api.MergeCommandResult; import sonia.scm.repository.api.MergeCommandResult;
@@ -106,7 +107,7 @@ public class GitMergeCommandTest extends AbstractGitCommandTestBase {
assertThat(mergeCommit.getParent(1).name()).isEqualTo("d81ad6c63d7e2162308d69637b339dedd1d9201c"); assertThat(mergeCommit.getParent(1).name()).isEqualTo("d81ad6c63d7e2162308d69637b339dedd1d9201c");
} }
@Test @Test(expected = NoChangesMadeException.class)
public void shouldNotMergeTwice() throws IOException, GitAPIException { public void shouldNotMergeTwice() throws IOException, GitAPIException {
GitMergeCommand command = createCommand(); GitMergeCommand command = createCommand();
MergeCommandRequest request = new MergeCommandRequest(); MergeCommandRequest request = new MergeCommandRequest();
@@ -120,15 +121,9 @@ public class GitMergeCommandTest extends AbstractGitCommandTestBase {
assertThat(mergeCommandResult.isSuccess()).isTrue(); assertThat(mergeCommandResult.isSuccess()).isTrue();
Repository repository = createContext().open(); Repository repository = createContext().open();
ObjectId firstMergeCommit = new Git(repository).log().add(repository.resolve("master")).setMaxCount(1).call().iterator().next().getId(); new Git(repository).log().add(repository.resolve("master")).setMaxCount(1).call().iterator().next().getId();
MergeCommandResult secondMergeCommandResult = command.merge(request); command.merge(request);
assertThat(secondMergeCommandResult.isSuccess()).isTrue();
ObjectId secondMergeCommit = new Git(repository).log().add(repository.resolve("master")).setMaxCount(1).call().iterator().next().getId();
assertThat(secondMergeCommit).isEqualTo(firstMergeCommit);
} }
@Test @Test

View File

@@ -14,17 +14,8 @@ public class GitRevisionExtractorTest {
@Test @Test
void shouldReturnRevisionFromRevCommit() { void shouldReturnRevisionFromRevCommit() {
RevCommit revCommit = mock(RevCommit.class); RevCommit revCommit = mock(RevCommit.class);
Optional<RevCommit> optionalRevCommit = Optional.of(revCommit);
when(revCommit.toString()).thenReturn("commit 123456abcdef -t 4561"); when(revCommit.toString()).thenReturn("commit 123456abcdef -t 4561");
String revision = GitRevisionExtractor.extractRevisionFromRevCommit(optionalRevCommit); String revision = GitRevisionExtractor.extractRevisionFromRevCommit(revCommit);
assertThat(revision).isEqualTo("123456abcdef"); assertThat(revision).isEqualTo("123456abcdef");
} }
@Test
void shouldReturnEmptyStringIfRevCommitNotAvailable() {
Optional<RevCommit> optionalRevCommit = Optional.empty();
String revision = GitRevisionExtractor.extractRevisionFromRevCommit(optionalRevCommit);
assertThat(revision).isEqualTo("");
}
} }