fix show diff in git format for svn repo

This commit is contained in:
Mohamed Karray
2018-10-26 16:26:55 +02:00
parent c214c9e1e4
commit 0360694052
15 changed files with 4137 additions and 169 deletions

View File

@@ -43,6 +43,26 @@ import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
/**
* This is a copy of the SvnDiffGenerator class from the patched SVNKit library used in SCM-Manager
* (a fork of SVNKit from TMate Software (http://svnkit.com/)).
*
* The original class can be found here: https://bitbucket.org/sdorra/svnkit/src/default/svnkit/src/main/java/org/tmatesoft/svn/core/internal/wc2/ng/SvnDiffGenerator.java
*
* The folowing modifications are applied when using the git format
* <ul>
* <il>
* remove the svn header
* </il>
* <il>
* use the git diff code 100644 on the new file and deleted file actions
* </il>
* <il>
* remove the labels in the added and deleted file headers eg. [+++ a/a.txt (revision 4)] will replaced with [+++ a/a.txt]
* </il>
* </ul>
*/
@SuppressWarnings("all")
public class SCMSvnDiffGenerator implements ISvnDiffGenerator {
protected static final String WC_REVISION_LABEL = "(working copy)";
@@ -439,20 +459,21 @@ public class SCMSvnDiffGenerator implements ISvnDiffGenerator {
}
if (!forcedBinaryDiff && (leftIsBinary || rightIsBinary)) {
boolean shouldStopDisplaying = displayHeader(outputStream, displayPath, rightFile == null, leftFile == null, operation);
if (useGitFormat) {
displayGitDiffHeader(outputStream, operation,
getRelativeToRootPath(target, originalTarget1),
getRelativeToRootPath(target, originalTarget2),
null);
boolean shouldStopDisplaying = false;
if (!useGitFormat) {
shouldStopDisplaying = displayHeader(outputStream, displayPath, rightFile == null, leftFile == null, operation);
} else {
String path1 = getRelativeToRootPath(target, originalTarget1);
String path2 = getRelativeToRootPath(target, originalTarget2);
displayGitDiffHeader(outputStream, operation,path1,path2,null);
}
visitedPaths.add(displayPath);
if (shouldStopDisplaying) {
return;
}
displayBinary(mimeType1, mimeType2, outputStream, leftIsBinary, rightIsBinary);
if (!useGitFormat){
displayBinary(mimeType1, mimeType2, outputStream, leftIsBinary, rightIsBinary);
}
return;
}
@@ -588,6 +609,7 @@ public class SCMSvnDiffGenerator implements ISvnDiffGenerator {
final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
try {
if (!useGitFormat) {
// display the svn header only if the git format is not required
displayHeader(byteArrayOutputStream, displayPath, deleted, added, operation);
} else {
displayGitDiffHeader(byteArrayOutputStream, operation,
@@ -888,6 +910,7 @@ public class SCMSvnDiffGenerator implements ISvnDiffGenerator {
displayString(outputStream, " ");
displaySecondGitPath(outputStream, path2);
displayEOL(outputStream);
// 100644 is the mode code used from git for new and deleted file mode
displayString(outputStream, "new file mode 100644");
displayEOL(outputStream);
} catch (IOException e) {
@@ -902,6 +925,7 @@ public class SCMSvnDiffGenerator implements ISvnDiffGenerator {
displayString(outputStream, " ");
displaySecondGitPath(outputStream, path2);
displayEOL(outputStream);
// 100644 is the mode code used from git for new and deleted file mode
displayString(outputStream, "deleted file mode 100644");
displayEOL(outputStream);
} catch (IOException e) {
@@ -958,11 +982,11 @@ public class SCMSvnDiffGenerator implements ISvnDiffGenerator {
}
private void displayFirstGitPath(OutputStream outputStream, String path1) throws IOException {
displayGitPath(outputStream, path1, "a/", false);
displayGitPath(outputStream, path1, "a/");
}
private void displaySecondGitPath(OutputStream outputStream, String path2) throws IOException {
displayGitPath(outputStream, path2, "b/", false);
displayGitPath(outputStream, path2, "b/");
}
private void displayFirstGitLabelPath(OutputStream outputStream, String path1, String revision1, SvnDiffCallback.OperationKind operation) throws IOException {
@@ -971,7 +995,7 @@ public class SCMSvnDiffGenerator implements ISvnDiffGenerator {
path1 = "/dev/null";
pathPrefix = "";
}
displayGitPath(outputStream, getLabel(path1, revision1), pathPrefix, true);
displayGitPath(outputStream, getLabel(path1, revision1), pathPrefix);
}
private void displaySecondGitLabelPath(OutputStream outputStream, String path2, String revision2, SvnDiffCallback.OperationKind operation) throws IOException {
@@ -980,16 +1004,12 @@ public class SCMSvnDiffGenerator implements ISvnDiffGenerator {
path2 = "/dev/null";
pathPrefix = "";
}
displayGitPath(outputStream, getLabel(path2, revision2), pathPrefix, true);
displayGitPath(outputStream, getLabel(path2, revision2), pathPrefix);
}
private void displayGitPath(OutputStream outputStream, String path1, String pathPrefix, boolean label) throws IOException {
// if (!label && path1.length() == 0) {
// displayString(outputStream, ".");
// } else {
private void displayGitPath(OutputStream outputStream, String path1, String pathPrefix) throws IOException {
displayString(outputStream, pathPrefix);
displayString(outputStream, path1);
// }
}
private String getAdjustedPathWithLabel(String displayPath, String path, String revision, String commonAncestor) {
@@ -1013,6 +1033,7 @@ public class SCMSvnDiffGenerator implements ISvnDiffGenerator {
protected String getLabel(String path, String revToken) {
if (useGitFormat){
// the label in the git format contains only the path
return path;
}
revToken = revToken == null ? WC_REVISION_LABEL : revToken;

View File

@@ -1,19 +1,19 @@
/**
/*
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* <p>
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* <p>
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
* <p>
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
@@ -24,13 +24,11 @@
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* <p>
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.repository.spi;
//~--- non-JDK imports --------------------------------------------------------
@@ -41,14 +39,12 @@ import org.slf4j.LoggerFactory;
import org.tmatesoft.svn.core.SVNDepth;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.wc.DefaultSVNDiffGenerator;
import org.tmatesoft.svn.core.wc.ISVNDiffGenerator;
import org.tmatesoft.svn.core.internal.wc2.ng.SvnNewDiffGenerator;
import org.tmatesoft.svn.core.wc.SVNClientManager;
import org.tmatesoft.svn.core.wc.SVNDiffClient;
import org.tmatesoft.svn.core.wc.SVNRevision;
import sonia.scm.repository.InternalRepositoryException;
import sonia.scm.repository.Repository;
import sonia.scm.repository.RevisionNotFoundException;
import sonia.scm.repository.SvnUtil;
import sonia.scm.repository.api.DiffFormat;
import sonia.scm.util.Util;
@@ -61,8 +57,7 @@ import java.io.OutputStream;
*
* @author Sebastian Sdorra
*/
public class SvnDiffCommand extends AbstractSvnCommand implements DiffCommand
{
public class SvnDiffCommand extends AbstractSvnCommand implements DiffCommand {
/**
* the logger for SvnDiffCommand
@@ -70,46 +65,26 @@ public class SvnDiffCommand extends AbstractSvnCommand implements DiffCommand
private static final Logger logger =
LoggerFactory.getLogger(SvnDiffCommand.class);
public SvnDiffCommand(SvnContext context, Repository repository)
{
public SvnDiffCommand(SvnContext context, Repository repository) {
super(context, repository);
}
@Override
public void getDiffResult(DiffCommandRequest request, OutputStream output) throws RevisionNotFoundException {
if (logger.isDebugEnabled())
{
logger.debug("create diff for {}", request);
}
public void getDiffResult(DiffCommandRequest request, OutputStream output) {
logger.debug("create diff for {}", request);
Preconditions.checkNotNull(request, "request is required");
Preconditions.checkNotNull(output, "outputstream is required");
String path = request.getPath();
SVNClientManager clientManager = null;
try
{
try {
SVNURL svnurl = context.createUrl();
if (Util.isNotEmpty(path))
{
if (Util.isNotEmpty(path)) {
svnurl = svnurl.appendPath(path, true);
}
clientManager = SVNClientManager.newInstance();
SVNDiffClient diffClient = clientManager.getDiffClient();
ISVNDiffGenerator diffGenerator = diffClient.getDiffGenerator();
if (diffGenerator == null)
{
diffGenerator = new DefaultSVNDiffGenerator();
}
diffGenerator.setDiffAdded(true);
diffGenerator.setDiffDeleted(true);
diffClient.setDiffGenerator(diffGenerator);
diffClient.setDiffGenerator(new SvnNewDiffGenerator(new SCMSvnDiffGenerator()));
long currentRev = SvnUtil.getRevisionNumber(request.getRevision());
@@ -118,13 +93,9 @@ public class SvnDiffCommand extends AbstractSvnCommand implements DiffCommand
diffClient.doDiff(svnurl, SVNRevision.HEAD,
SVNRevision.create(currentRev - 1), SVNRevision.create(currentRev),
SVNDepth.INFINITY, false, output);
}
catch (SVNException ex)
{
} catch (SVNException ex) {
throw new InternalRepositoryException("could not create diff", ex);
}
finally
{
} finally {
SvnUtil.dispose(clientManager);
}
}