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;
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);
MergeDryRunCommandResult dryRun(MergeCommandRequest request);

View File

@@ -186,6 +186,10 @@ class AbstractGitCommand
return context;
}
sonia.scm.repository.Repository getRepository() {
return repository;
}
void checkOutBranch(String branchName) throws IOException {
try {
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.MergeResult;
import org.eclipse.jgit.revwalk.RevCommit;
import sonia.scm.NoChangesMadeException;
import sonia.scm.repository.Repository;
import sonia.scm.repository.api.MergeCommandResult;
@@ -26,7 +27,7 @@ class GitMergeCommit extends GitMergeStrategy {
MergeResult result = doMergeInClone(mergeCommand);
if (result.getMergeStatus().isSuccessful()) {
Optional<RevCommit> revCommit = doCommit();
RevCommit revCommit = doCommit().orElseThrow(() -> new NoChangesMadeException(getRepository()));
push();
return MergeCommandResult.success(extractRevisionFromRevCommit(revCommit));
} else {

View File

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

View File

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

View File

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

View File

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