mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-11-10 15:35:49 +01:00
Let merges without effect throw an exception
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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("");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user