From d5da106038ca8e269e4c9b27aa54e08a54b764fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Wed, 7 Nov 2018 12:52:40 +0100 Subject: [PATCH] Implement merge using api of class Git --- .../scm/repository/spi/GitMergeCommand.java | 46 +++++++++++++------ 1 file changed, 31 insertions(+), 15 deletions(-) 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 a4b416420d..c9a6e007ab 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 @@ -1,9 +1,12 @@ package sonia.scm.repository.spi; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.MergeResult; +import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.merge.MergeStrategy; import org.eclipse.jgit.merge.ResolveMerger; -import org.eclipse.jgit.lib.Repository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import sonia.scm.repository.GitWorkdirFactory; @@ -47,28 +50,41 @@ public class GitMergeCommand extends AbstractGitCommand implements MergeCommand private static class MergeWorker { - private final Repository clone; + private final Git clone; private MergeWorker(Repository clone) { - this.clone = clone; + this.clone = new Git(clone); } private MergeCommandResult merge(MergeCommandRequest request) throws IOException { - ResolveMerger merger = (ResolveMerger) MergeStrategy.RECURSIVE.newMerger(clone); - boolean mergeResult = merger.merge( - resolveRevision(clone, request.getTargetBranch()), - resolveRevision(clone, request.getBranchToMerge()) - ); - if (mergeResult) { - logger.info("Merged branch {} into {}", request.getBranchToMerge(), request.getTargetBranch()); - // TODO commit, push and verify push was successful + try { + clone.checkout().setName(request.getTargetBranch()).call(); + } catch (GitAPIException e) { + throw new InternalRepositoryException("could not checkout target branch " + request.getTargetBranch(), e); + } + MergeResult result; + try { + result = clone.merge().include(request.getBranchToMerge(), resolveRevision(request.getBranchToMerge())).setCommit(true).call(); + } catch (GitAPIException e) { + throw new InternalRepositoryException("could not merge branch " + request.getBranchToMerge() + " into " + request.getTargetBranch(), e); + } + if (result.getMergeStatus().isSuccessful()) { + logger.info("Merged branch {} into {}", request.getBranchToMerge(), request.getTargetBranch()); + try { + clone.push().call(); + } catch (GitAPIException e) { + throw new InternalRepositoryException("could not push merged branch " + request.getBranchToMerge() + " to origin", e); + } + return new MergeCommandResult(true); + } else { + logger.info("Could not merged branch {} into {}", request.getBranchToMerge(), request.getTargetBranch()); + return new MergeCommandResult(false); } - return new MergeCommandResult(mergeResult); } - private ObjectId resolveRevision(Repository repository, String branchToMerge) throws IOException { - ObjectId resolved = repository.resolve(branchToMerge); + private ObjectId resolveRevision(String branchToMerge) throws IOException { + ObjectId resolved = clone.getRepository().resolve(branchToMerge); if (resolved == null) { - return repository.resolve("origin/" + branchToMerge); + return clone.getRepository().resolve("origin/" + branchToMerge); } else { return resolved; }