diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/AbstractGitCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/AbstractGitCommand.java index 406c6849f2..adf7878221 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/AbstractGitCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/AbstractGitCommand.java @@ -151,32 +151,6 @@ class AbstractGitCommand } } - > R inCloneWithPostponedClose(Function workerSupplier, GitWorkdirFactory workdirFactory, String initialBranch, WorkingCopyCloser closer) { - try { - WorkingCopy workingCopy = workdirFactory.createWorkingCopy(context, initialBranch); - closer.setWorkingCopy(workingCopy); - Repository repository = workingCopy.getWorkingRepository(); - logger.debug("cloned repository to folder {}", repository.getWorkTree()); - return workerSupplier.apply(new Git(repository)).run(); - } catch (IOException e) { - throw new InternalRepositoryException(context.getRepository(), "could not clone repository", e); - } - } - - static class WorkingCopyCloser { - private WorkingCopy workingCopy; - - private void setWorkingCopy(WorkingCopy workingCopy) { - this.workingCopy = workingCopy; - } - - public void close() { - if (workingCopy != null) { - workingCopy.close(); - } - } - } - ObjectId resolveRevisionOrThrowNotFound(Repository repository, String revision) throws IOException { sonia.scm.repository.Repository scmRepository = context.getRepository(); return resolveRevisionOrThrowNotFound(repository, revision, scmRepository); 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 4d6878d130..9f299c65f0 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 @@ -94,49 +94,35 @@ public class GitMergeCommand extends AbstractGitCommand implements MergeCommand private final Git git; private final MergeCommandRequest request; private final WorkingCopyCloser closer; + private final CanonicalTreeParser treeParser; + private final ObjectId treeId; + private final ByteArrayOutputStream diffBuffer; private ConflictWorker(Git git, MergeCommandRequest request, WorkingCopyCloser closer) { super(git, context, repository); this.git = git; this.request = request; this.closer = closer; + + treeParser = new CanonicalTreeParser(); + treeId = git.getRepository().resolve(request.getTargetBranch() + "^{tree}"); + diffBuffer = new ByteArrayOutputStream(); } @Override MergeConflictResult run() throws IOException { - ObjectId sourceRevision = resolveRevision(request.getBranchToMerge()); - MergeResult mergeResult; - try { - mergeResult = getClone().merge() - .setFastForward(org.eclipse.jgit.api.MergeCommand.FastForwardMode.NO_FF) - .setCommit(false) - .include(request.getBranchToMerge(), sourceRevision) - .call(); - } catch (GitAPIException e) { - throw new InternalRepositoryException(context.getRepository(), "could not merge branch " + request.getBranchToMerge() + " into " + request.getTargetBranch(), e); - } - + MergeResult mergeResult = doTemporaryMerge(); if (mergeResult.getConflicts() == null) { return new MergeConflictResult(); } - Status status; - try { - status = getClone().status().call(); - } catch (GitAPIException e) { - throw new InternalRepositoryException(context.getRepository(), "could not get status", e); - } + + Status status = getStatus(); MergeConflictResult result = new MergeConflictResult(); - CanonicalTreeParser treeParser = new CanonicalTreeParser(); - ObjectId treeId = git.getRepository().resolve(request.getTargetBranch() + "^{tree}"); - ByteArrayOutputStream diffBuffer = new ByteArrayOutputStream(); - - status.getConflictingStageState().entrySet().forEach(conflictEntry -> { - - String path = conflictEntry.getKey(); - switch (conflictEntry.getValue()) { + status.getConflictingStageState().forEach((path, value) -> { + switch (value) { case BOTH_MODIFIED: diffBuffer.reset(); try (ObjectReader reader = git.getRepository().newObjectReader()) { @@ -161,10 +147,35 @@ public class GitMergeCommand extends AbstractGitCommand implements MergeCommand result.addDeletedByUs(path); break; default: - throw new InternalRepositoryException(context.getRepository(), "unexpected conflict type: " + conflictEntry.getValue()); + throw new InternalRepositoryException(context.getRepository(), "unexpected conflict type: " + value); } }); return result; } + + private Status getStatus() { + Status status; + try { + status = getClone().status().call(); + } catch (GitAPIException e) { + throw new InternalRepositoryException(context.getRepository(), "could not get status", e); + } + return status; + } + + private MergeResult doTemporaryMerge() throws IOException { + ObjectId sourceRevision = resolveRevision(request.getBranchToMerge()); + MergeResult mergeResult; + try { + mergeResult = getClone().merge() + .setFastForward(org.eclipse.jgit.api.MergeCommand.FastForwardMode.NO_FF) + .setCommit(false) + .include(request.getBranchToMerge(), sourceRevision) + .call(); + } catch (GitAPIException e) { + throw new InternalRepositoryException(context.getRepository(), "could not merge branch " + request.getBranchToMerge() + " into " + request.getTargetBranch(), e); + } + return mergeResult; + } } }