Extract methods to emphasize flow

This commit is contained in:
René Pfeuffer
2018-11-08 09:32:43 +01:00
parent 1037d8d266
commit 0714d5f960

View File

@@ -11,6 +11,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import sonia.scm.repository.GitWorkdirFactory; import sonia.scm.repository.GitWorkdirFactory;
import sonia.scm.repository.InternalRepositoryException; import sonia.scm.repository.InternalRepositoryException;
import sonia.scm.repository.Person;
import sonia.scm.repository.api.MergeCommandResult; import sonia.scm.repository.api.MergeCommandResult;
import sonia.scm.repository.api.MergeDryRunCommandResult; import sonia.scm.repository.api.MergeDryRunCommandResult;
@@ -36,7 +37,7 @@ public class GitMergeCommand extends AbstractGitCommand implements MergeCommand
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()); logger.debug("cloned repository to folder {}", repository.getWorkTree());
return new MergeWorker(repository).merge(request); return new MergeWorker(repository, request).merge();
} catch (IOException e) { } catch (IOException e) {
throw new InternalRepositoryException("could not clone repository for merge", e); throw new InternalRepositoryException("could not clone repository for merge", e);
} }
@@ -55,19 +56,32 @@ public class GitMergeCommand extends AbstractGitCommand implements MergeCommand
private static class MergeWorker { private static class MergeWorker {
private final String target;
private final String toMerge;
private final Person author;
private final Git clone; private final Git clone;
private MergeWorker(Repository clone) { private MergeWorker(Repository clone, MergeCommandRequest request) {
this.target = request.getTargetBranch();
this.toMerge = request.getBranchToMerge();
this.author = request.getAuthor();
this.clone = new Git(clone); this.clone = new Git(clone);
} }
private MergeCommandResult merge(MergeCommandRequest request) throws IOException { private MergeCommandResult merge() throws IOException {
String target = request.getTargetBranch(); createClone();
String toMerge = request.getBranchToMerge(); MergeResult result = doMergeInClone();
return analyzeResult(result);
}
private void createClone() {
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 for merge: " + target, e); throw new InternalRepositoryException("could not checkout target branch for merge: " + target, e);
} }
}
private MergeResult doMergeInClone() throws IOException {
MergeResult result; MergeResult result;
try { try {
result = clone.merge() result = clone.merge()
@@ -77,11 +91,15 @@ public class GitMergeCommand extends AbstractGitCommand implements MergeCommand
} catch (GitAPIException e) { } catch (GitAPIException e) {
throw new InternalRepositoryException("could not merge branch " + toMerge + " into " + target, e); throw new InternalRepositoryException("could not merge branch " + toMerge + " into " + target, e);
} }
return result;
}
private MergeCommandResult analyzeResult(MergeResult result) {
if (result.getMergeStatus().isSuccessful()) { if (result.getMergeStatus().isSuccessful()) {
logger.debug("merged branch {} into {}", toMerge, target); logger.debug("merged branch {} into {}", toMerge, target);
try { try {
clone.commit() clone.commit()
.setAuthor(request.getAuthor().getName(), request.getAuthor().getMail()) .setAuthor(author.getName(), author.getMail())
.setMessage(String.format(MERGE_COMMIT_MESSAGE_TEMPLATE, toMerge, target)) .setMessage(String.format(MERGE_COMMIT_MESSAGE_TEMPLATE, toMerge, target))
.call(); .call();
} catch (GitAPIException e) { } catch (GitAPIException e) {