From cf90654e24d734fe784f806009ccde9a5da32dbb Mon Sep 17 00:00:00 2001 From: Eduard Heimbuch Date: Wed, 6 Nov 2019 15:26:20 +0100 Subject: [PATCH] implement fast forward if possible --- .../repository/api/MergeCommandResult.java | 9 +++++++ .../scm/repository/spi/GitMergeCommand.java | 15 ++++++++--- .../repository/spi/GitMergeCommandTest.java | 25 +++++++++++++++++++ 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/scm-core/src/main/java/sonia/scm/repository/api/MergeCommandResult.java b/scm-core/src/main/java/sonia/scm/repository/api/MergeCommandResult.java index 53f712cddc..5088fcad1c 100644 --- a/scm-core/src/main/java/sonia/scm/repository/api/MergeCommandResult.java +++ b/scm-core/src/main/java/sonia/scm/repository/api/MergeCommandResult.java @@ -13,6 +13,7 @@ import static java.util.Collections.unmodifiableCollection; */ public class MergeCommandResult { private final Collection filesWithConflict; + private boolean aborted = false; private MergeCommandResult(Collection filesWithConflict) { this.filesWithConflict = filesWithConflict; @@ -41,4 +42,12 @@ public class MergeCommandResult { public Collection getFilesWithConflict() { return unmodifiableCollection(filesWithConflict); } + + public boolean isAborted() { + return aborted; + } + + public void setAborted(boolean aborted) { + this.aborted = aborted; + } } diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitMergeCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitMergeCommand.java index ff882b4f20..6d5c33f874 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitMergeCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitMergeCommand.java @@ -3,7 +3,6 @@ package sonia.scm.repository.spi; import com.google.common.base.Strings; import com.google.common.collect.ImmutableSet; import org.eclipse.jgit.api.Git; -import org.eclipse.jgit.api.MergeCommand.FastForwardMode; import org.eclipse.jgit.api.MergeResult; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.lib.ObjectId; @@ -20,6 +19,7 @@ import sonia.scm.repository.api.MergeStrategy; import java.io.IOException; import java.text.MessageFormat; +import java.util.Collections; import java.util.Set; public class GitMergeCommand extends AbstractGitCommand implements MergeCommand { @@ -93,10 +93,17 @@ public class GitMergeCommand extends AbstractGitCommand implements MergeCommand @Override MergeCommandResult run() throws IOException { MergeResult result = doMergeInClone(); + if (result.getMergeStatus().isSuccessful()) { - doCommit(); + if (mergeStrategy != MergeStrategy.FAST_FORWARD_IF_POSSIBLE) { + doCommit(); + } push(); return MergeCommandResult.success(); + } else if (mergeStrategy == MergeStrategy.FAST_FORWARD_IF_POSSIBLE) { + MergeCommandResult failure = MergeCommandResult.failure(Collections.emptyList()); + failure.setAborted(true); + return failure; } else { return analyseFailure(result); } @@ -113,8 +120,10 @@ public class GitMergeCommand extends AbstractGitCommand implements MergeCommand if (mergeStrategy == MergeStrategy.SQUASH) { mergeCommand.setSquash(true); + } else if (mergeStrategy == MergeStrategy.FAST_FORWARD_IF_POSSIBLE) { + mergeCommand.setFastForward(org.eclipse.jgit.api.MergeCommand.FastForwardMode.FF_ONLY); } else { - mergeCommand.setFastForward(FastForwardMode.NO_FF); + mergeCommand.setFastForward(org.eclipse.jgit.api.MergeCommand.FastForwardMode.NO_FF); } result = mergeCommand.call(); diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitMergeCommandTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitMergeCommandTest.java index f27b1e3760..4f04205202 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitMergeCommandTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitMergeCommandTest.java @@ -262,6 +262,31 @@ public class GitMergeCommandTest extends AbstractGitCommandTestBase { assertThat(changes.size()).isEqualTo(3); } + + @Test + public void shouldMergeWithFastForward() throws IOException, GitAPIException { + Repository repository = createContext().open(); + + ObjectId featureBranchHead = new Git(repository).log().add(repository.resolve("squash")).setMaxCount(1).call().iterator().next().getId(); + + GitMergeCommand command = createCommand(); + MergeCommandRequest request = new MergeCommandRequest(); + request.setBranchToMerge("squash"); + request.setTargetBranch("master"); + request.setMergeStrategy(MergeStrategy.FAST_FORWARD_IF_POSSIBLE); + request.setAuthor(new Person("Dirk Gently", "dirk@holistic.det")); + + MergeCommandResult mergeCommandResult = command.merge(request); + + assertThat(mergeCommandResult.isSuccess()).isTrue(); + + Iterable commits = new Git(repository).log().add(repository.resolve("master")).setMaxCount(1).call(); + RevCommit mergeCommit = commits.iterator().next(); + PersonIdent mergeAuthor = mergeCommit.getAuthorIdent(); + assertThat(mergeAuthor.getName()).isEqualTo("Philip J Fry"); + assertThat(mergeCommit.getId()).isEqualTo(featureBranchHead); + } + @Test(expected = NotFoundException.class) public void shouldHandleNotExistingSourceBranchInMerge() { GitMergeCommand command = createCommand();