From e3787fd764f92cd3ee9d104870d83d3b241e9cfd Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Tue, 30 Jul 2019 08:06:10 +0200 Subject: [PATCH] simplify Differ api and use the new api in GitDiffCommand --- .../java/sonia/scm/repository/spi/Differ.java | 13 ++-- .../scm/repository/spi/GitDiffCommand.java | 72 ++----------------- .../repository/spi/GitDiffResultCommand.java | 15 ++-- .../scm/repository/spi/GitHunkParser.java | 3 +- 4 files changed, 20 insertions(+), 83 deletions(-) diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/Differ.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/Differ.java index 67d503aeff..ca417550f4 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/Differ.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/Differ.java @@ -15,7 +15,6 @@ import sonia.scm.util.Util; import java.io.IOException; import java.util.List; -import java.util.function.Consumer; final class Differ implements AutoCloseable { @@ -29,7 +28,13 @@ final class Differ implements AutoCloseable { this.treeWalk = treeWalk; } - public static Differ create(Repository repository, DiffCommandRequest request) throws IOException { + static Diff diff(Repository repository, DiffCommandRequest request) throws IOException { + try (Differ differ = create(repository, request)) { + return differ.diff(); + } + } + + private static Differ create(Repository repository, DiffCommandRequest request) throws IOException { RevWalk walk = new RevWalk(repository); ObjectId revision = repository.resolve(request.getRevision()); @@ -81,9 +86,9 @@ final class Differ implements AutoCloseable { return GitUtil.computeCommonAncestor(repository, revision1, revision2); } - public void process(Consumer diffConsumer) throws IOException { + private Diff diff() throws IOException { List entries = DiffEntry.scan(treeWalk); - diffConsumer.accept(new Diff(commit, entries)); + return new Diff(commit, entries); } @Override diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitDiffCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitDiffCommand.java index 2d56c8e786..7d5e45a5c2 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitDiffCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitDiffCommand.java @@ -34,26 +34,15 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- -import com.google.common.base.Strings; import org.eclipse.jgit.diff.DiffEntry; import org.eclipse.jgit.diff.DiffFormatter; -import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.revwalk.RevCommit; -import org.eclipse.jgit.revwalk.RevTree; -import org.eclipse.jgit.revwalk.RevWalk; -import org.eclipse.jgit.treewalk.EmptyTreeIterator; -import org.eclipse.jgit.treewalk.TreeWalk; -import org.eclipse.jgit.treewalk.filter.PathFilter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import sonia.scm.repository.GitUtil; import sonia.scm.repository.Repository; -import sonia.scm.util.Util; import java.io.BufferedOutputStream; -import java.io.IOException; import java.io.OutputStream; -import java.util.List; /** * @@ -78,7 +67,7 @@ public class GitDiffCommand extends AbstractGitCommand implements DiffCommand * @param context * @param repository */ - public GitDiffCommand(GitContext context, Repository repository) + GitDiffCommand(GitContext context, Repository repository) { super(context, repository); } @@ -95,63 +84,18 @@ public class GitDiffCommand extends AbstractGitCommand implements DiffCommand @Override public void getDiffResult(DiffCommandRequest request, OutputStream output) { - RevWalk walk = null; - TreeWalk treeWalk = null; DiffFormatter formatter = null; try { - org.eclipse.jgit.lib.Repository gr = open(); + org.eclipse.jgit.lib.Repository repository = open(); - walk = new RevWalk(gr); - - ObjectId revision = gr.resolve(request.getRevision()); - RevCommit commit = walk.parseCommit(revision); - - walk.markStart(commit); - commit = walk.next(); - treeWalk = new TreeWalk(gr); - treeWalk.reset(); - treeWalk.setRecursive(true); - - if (Util.isNotEmpty(request.getPath())) - { - treeWalk.setFilter(PathFilter.create(request.getPath())); - } - - - if (!Strings.isNullOrEmpty(request.getAncestorChangeset())) - { - ObjectId otherRevision = gr.resolve(request.getAncestorChangeset()); - ObjectId ancestorId = computeCommonAncestor(gr, revision, otherRevision); - RevTree tree = walk.parseCommit(ancestorId).getTree(); - treeWalk.addTree(tree); - } - else if (commit.getParentCount() > 0) - { - RevTree tree = commit.getParent(0).getTree(); - - if (tree != null) - { - treeWalk.addTree(tree); - } - else - { - treeWalk.addTree(new EmptyTreeIterator()); - } - } - else - { - treeWalk.addTree(new EmptyTreeIterator()); - } - - treeWalk.addTree(commit.getTree()); formatter = new DiffFormatter(new BufferedOutputStream(output)); - formatter.setRepository(gr); + formatter.setRepository(repository); - List entries = DiffEntry.scan(treeWalk); + Differ.Diff diff = Differ.diff(repository, request); - for (DiffEntry e : entries) + for (DiffEntry e : diff.getEntries()) { if (!e.getOldId().equals(e.getNewId())) { @@ -168,14 +112,8 @@ public class GitDiffCommand extends AbstractGitCommand implements DiffCommand } finally { - GitUtil.release(walk); - GitUtil.release(treeWalk); GitUtil.release(formatter); } } - private ObjectId computeCommonAncestor(org.eclipse.jgit.lib.Repository repository, ObjectId revision1, ObjectId revision2) throws IOException { - return GitUtil.computeCommonAncestor(repository, revision1, revision2); - } - } diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitDiffResultCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitDiffResultCommand.java index de7c8483f5..0d5f4f7b9e 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitDiffResultCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitDiffResultCommand.java @@ -22,23 +22,16 @@ public class GitDiffResultCommand extends AbstractGitCommand implements DiffResu public DiffResult getDiffResult(DiffCommandRequest diffCommandRequest) throws IOException { org.eclipse.jgit.lib.Repository repository = open(); - try (Differ differ = Differ.create(repository, diffCommandRequest)) { - GitDiffResult result = new GitDiffResult(repository); - differ.process(result::process); - return result; - } + return new GitDiffResult(repository, Differ.diff(repository, diffCommandRequest)); } private class GitDiffResult implements DiffResult { private final org.eclipse.jgit.lib.Repository repository; - private Differ.Diff diff; + private final Differ.Diff diff; - private GitDiffResult(org.eclipse.jgit.lib.Repository repository) { + private GitDiffResult(org.eclipse.jgit.lib.Repository repository, Differ.Diff diff) { this.repository = repository; - } - - void process(Differ.Diff diff) { this.diff = diff; } @@ -96,7 +89,7 @@ public class GitDiffResultCommand extends AbstractGitCommand implements DiffResu } private String format(org.eclipse.jgit.lib.Repository repository, DiffEntry entry) { - try(ByteArrayOutputStream baos = new ByteArrayOutputStream()) { + try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) { DiffFormatter formatter = new DiffFormatter(baos); formatter.setRepository(repository); formatter.format(entry); diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitHunkParser.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitHunkParser.java index caedc6605f..b7594bb5d6 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitHunkParser.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitHunkParser.java @@ -51,6 +51,7 @@ final class GitHunkParser { FileRange oldFileRange = createFileRange(split[0]); // TODO merge contains two two block which starts with "-" e.g. -1,3 -2,4 +3,6 + // check if it is relevant for our use case FileRange newFileRange = createFileRange(split[1]); currentGitHunk = new GitHunk(oldFileRange, newFileRange); @@ -137,7 +138,7 @@ final class GitHunkParser { private final int oldLineNumber; private final String content; - public UnchangedGitDiffLine(int newLineNumber, int oldLineNumber, String content) { + private UnchangedGitDiffLine(int newLineNumber, int oldLineNumber, String content) { this.newLineNumber = newLineNumber; this.oldLineNumber = oldLineNumber; this.content = content;