Specify not mergeable files in merge result

This commit is contained in:
René Pfeuffer
2018-11-07 13:34:35 +01:00
parent 26d5e6e062
commit 2d04e6c2f0
3 changed files with 41 additions and 18 deletions

View File

@@ -1,13 +1,31 @@
package sonia.scm.repository.api; package sonia.scm.repository.api;
public class MergeCommandResult { import java.util.Collection;
private final boolean success; import java.util.HashSet;
public MergeCommandResult(boolean success) { import static java.util.Collections.emptyList;
this.success = success; import static java.util.Collections.unmodifiableCollection;
public class MergeCommandResult {
private final Collection<String> filesWithConflict;
private MergeCommandResult(Collection<String> filesWithConflict) {
this.filesWithConflict = filesWithConflict;
}
public static MergeCommandResult success() {
return new MergeCommandResult(emptyList());
}
public static MergeCommandResult failure(Collection<String> filesWithConflict) {
return new MergeCommandResult(new HashSet<>(filesWithConflict));
} }
public boolean isSuccess() { public boolean isSuccess() {
return success; return filesWithConflict.isEmpty();
}
public Collection<String> getFilesWithConflict() {
return unmodifiableCollection(filesWithConflict);
} }
} }

View File

@@ -35,9 +35,10 @@ public class GitMergeCommand extends AbstractGitCommand implements MergeCommand
public MergeCommandResult merge(MergeCommandRequest request) { public MergeCommandResult merge(MergeCommandRequest request) {
try (WorkingCopy workingCopy = workdirFactory.createWorkingCopy(context)) { try (WorkingCopy workingCopy = workdirFactory.createWorkingCopy(context)) {
Repository repository = workingCopy.get(); Repository repository = workingCopy.get();
logger.debug("cloned repository to folder {}", repository.getWorkTree());
return new MergeWorker(repository).merge(request); return new MergeWorker(repository).merge(request);
} catch (IOException e) { } 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); ResolveMerger merger = (ResolveMerger) MergeStrategy.RECURSIVE.newMerger(repository, true);
return new MergeDryRunCommandResult(merger.merge(repository.resolve(request.getBranchToMerge()), repository.resolve(request.getTargetBranch()))); return new MergeDryRunCommandResult(merger.merge(repository.resolve(request.getBranchToMerge()), repository.resolve(request.getTargetBranch())));
} catch (IOException e) { } 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 { try {
clone.checkout().setName(target).call(); clone.checkout().setName(target).call();
} catch (GitAPIException e) { } 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; MergeResult result;
try { try {
@@ -78,16 +79,17 @@ public class GitMergeCommand extends AbstractGitCommand implements MergeCommand
throw new InternalRepositoryException("could not merge branch " + toMerge + " into " + target, e); throw new InternalRepositoryException("could not merge branch " + toMerge + " into " + target, e);
} }
if (result.getMergeStatus().isSuccessful()) { if (result.getMergeStatus().isSuccessful()) {
logger.info("merged branch {} into {}", toMerge, target); logger.debug("merged branch {} into {}", toMerge, target);
try { try {
clone.push().call(); clone.push().call();
} catch (GitAPIException e) { } catch (GitAPIException e) {
throw new InternalRepositoryException("could not push merged branch " + toMerge + " to origin", 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 { } else {
logger.info("could not merged branch {} into {} due to {}", toMerge, target, result.getConflicts().keySet()); logger.info("could not merged branch {} into {} due to conflict in paths {}", toMerge, target, result.getConflicts().keySet());
return new MergeCommandResult(false); return MergeCommandResult.failure(result.getConflicts().keySet());
} }
} }

View File

@@ -1,9 +1,11 @@
package sonia.scm.repository.spi; package sonia.scm.repository.spi;
import org.junit.Assert; import org.assertj.core.api.Assertions;
import org.junit.Test; 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 { public class GitMergeCommandTest extends AbstractGitCommandTestBase {
@@ -38,9 +40,9 @@ public class GitMergeCommandTest extends AbstractGitCommandTestBase {
request.setTargetBranch("master"); request.setTargetBranch("master");
request.setBranchToMerge("mergeable"); request.setBranchToMerge("mergeable");
boolean mergeable = command.merge(request).isSuccess(); MergeCommandResult mergeCommandResult = command.merge(request);
assertThat(mergeable).isTrue(); assertThat(mergeCommandResult.isSuccess()).isTrue();
} }
@Test @Test
@@ -50,9 +52,10 @@ public class GitMergeCommandTest extends AbstractGitCommandTestBase {
request.setBranchToMerge("test-branch"); request.setBranchToMerge("test-branch");
request.setTargetBranch("master"); 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() { private GitMergeCommand createCommand() {