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 024e7bbc89..c5a4a57d42 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 @@ -1,13 +1,31 @@ package sonia.scm.repository.api; -public class MergeCommandResult { - private final boolean success; +import java.util.Collection; +import java.util.HashSet; - public MergeCommandResult(boolean success) { - this.success = success; +import static java.util.Collections.emptyList; +import static java.util.Collections.unmodifiableCollection; + +public class MergeCommandResult { + private final Collection filesWithConflict; + + private MergeCommandResult(Collection filesWithConflict) { + this.filesWithConflict = filesWithConflict; + } + + public static MergeCommandResult success() { + return new MergeCommandResult(emptyList()); + } + + public static MergeCommandResult failure(Collection filesWithConflict) { + return new MergeCommandResult(new HashSet<>(filesWithConflict)); } public boolean isSuccess() { - return success; + return filesWithConflict.isEmpty(); + } + + public Collection getFilesWithConflict() { + return unmodifiableCollection(filesWithConflict); } } 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 c2b903e57f..800317ef67 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 @@ -35,9 +35,10 @@ public class GitMergeCommand extends AbstractGitCommand implements MergeCommand public MergeCommandResult merge(MergeCommandRequest request) { try (WorkingCopy workingCopy = workdirFactory.createWorkingCopy(context)) { Repository repository = workingCopy.get(); + logger.debug("cloned repository to folder {}", repository.getWorkTree()); return new MergeWorker(repository).merge(request); } catch (IOException e) { - throw new InternalRepositoryException(e); + throw new InternalRepositoryException("could not clone repository for merge", e); } } @@ -48,7 +49,7 @@ public class GitMergeCommand extends AbstractGitCommand implements MergeCommand 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); + throw new InternalRepositoryException("could not clone repository for merge", e); } } @@ -65,7 +66,7 @@ public class GitMergeCommand extends AbstractGitCommand implements MergeCommand try { clone.checkout().setName(target).call(); } catch (GitAPIException e) { - throw new InternalRepositoryException("could not checkout target branch " + target, e); + throw new InternalRepositoryException("could not checkout target branch for merge: " + target, e); } MergeResult result; try { @@ -78,16 +79,17 @@ public class GitMergeCommand extends AbstractGitCommand implements MergeCommand throw new InternalRepositoryException("could not merge branch " + toMerge + " into " + target, e); } if (result.getMergeStatus().isSuccessful()) { - logger.info("merged branch {} into {}", toMerge, target); + logger.debug("merged branch {} into {}", toMerge, target); try { clone.push().call(); } catch (GitAPIException e) { throw new InternalRepositoryException("could not push merged branch " + toMerge + " to origin", e); } - return new MergeCommandResult(true); + logger.debug("pushed merged branch {}", target); + return MergeCommandResult.success(); } else { - logger.info("could not merged branch {} into {} due to {}", toMerge, target, result.getConflicts().keySet()); - return new MergeCommandResult(false); + logger.info("could not merged branch {} into {} due to conflict in paths {}", toMerge, target, result.getConflicts().keySet()); + return MergeCommandResult.failure(result.getConflicts().keySet()); } } 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 bd140c68cb..c6949a3a11 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 @@ -1,9 +1,11 @@ package sonia.scm.repository.spi; -import org.junit.Assert; +import org.assertj.core.api.Assertions; import org.junit.Test; +import sonia.scm.repository.api.MergeCommandResult; + +import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; public class GitMergeCommandTest extends AbstractGitCommandTestBase { @@ -38,9 +40,9 @@ public class GitMergeCommandTest extends AbstractGitCommandTestBase { request.setTargetBranch("master"); request.setBranchToMerge("mergeable"); - boolean mergeable = command.merge(request).isSuccess(); + MergeCommandResult mergeCommandResult = command.merge(request); - assertThat(mergeable).isTrue(); + assertThat(mergeCommandResult.isSuccess()).isTrue(); } @Test @@ -50,9 +52,10 @@ public class GitMergeCommandTest extends AbstractGitCommandTestBase { request.setBranchToMerge("test-branch"); request.setTargetBranch("master"); - boolean mergeable = command.merge(request).isSuccess(); + MergeCommandResult mergeCommandResult = command.merge(request); - assertThat(mergeable).isFalse(); + assertThat(mergeCommandResult.isSuccess()).isFalse(); + assertThat(mergeCommandResult.getFilesWithConflict()).containsExactly("a.txt"); } private GitMergeCommand createCommand() {