mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-12-21 15:59:48 +01:00
Filter git diff stream to decode file names
This commit is contained in:
@@ -33,10 +33,13 @@ package sonia.scm.repository.spi;
|
|||||||
|
|
||||||
import org.eclipse.jgit.diff.DiffEntry;
|
import org.eclipse.jgit.diff.DiffEntry;
|
||||||
import org.eclipse.jgit.diff.DiffFormatter;
|
import org.eclipse.jgit.diff.DiffFormatter;
|
||||||
|
import org.eclipse.jgit.util.QuotedString;
|
||||||
import sonia.scm.repository.Repository;
|
import sonia.scm.repository.Repository;
|
||||||
import sonia.scm.repository.api.DiffCommandBuilder;
|
import sonia.scm.repository.api.DiffCommandBuilder;
|
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@@ -56,7 +59,7 @@ public class GitDiffCommand extends AbstractGitCommand implements DiffCommand {
|
|||||||
Differ.Diff diff = Differ.diff(repository, request);
|
Differ.Diff diff = Differ.diff(repository, request);
|
||||||
|
|
||||||
return output -> {
|
return output -> {
|
||||||
try (DiffFormatter formatter = new DiffFormatter(output)) {
|
try (DiffFormatter formatter = new DiffFormatter(new DequoteOutputStream(output))) {
|
||||||
formatter.setRepository(repository);
|
formatter.setRepository(repository);
|
||||||
|
|
||||||
for (DiffEntry e : diff.getEntries()) {
|
for (DiffEntry e : diff.getEntries()) {
|
||||||
@@ -70,4 +73,68 @@ public class GitDiffCommand extends AbstractGitCommand implements DiffCommand {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static class DequoteOutputStream extends OutputStream {
|
||||||
|
|
||||||
|
private final OutputStream target;
|
||||||
|
|
||||||
|
private boolean afterNL = false;
|
||||||
|
private int minusCount = 0;
|
||||||
|
private int plusCount = 0;
|
||||||
|
private ByteArrayOutputStream buffer;
|
||||||
|
|
||||||
|
private DequoteOutputStream(OutputStream target) {
|
||||||
|
this.target = target;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void write(int i) throws IOException {
|
||||||
|
if (i == (int) '+' && afterNL) {
|
||||||
|
plusCount = 1;
|
||||||
|
afterNL = false;
|
||||||
|
target.write(i);
|
||||||
|
} else if (i == (int) '+' && plusCount > 0) {
|
||||||
|
++plusCount;
|
||||||
|
afterNL = false;
|
||||||
|
target.write(i);
|
||||||
|
} else if (i == (int) '-' && afterNL) {
|
||||||
|
minusCount = 1;
|
||||||
|
afterNL = false;
|
||||||
|
target.write(i);
|
||||||
|
} else if (i == (int) '-' && minusCount > 0) {
|
||||||
|
++minusCount;
|
||||||
|
afterNL = false;
|
||||||
|
target.write(i);
|
||||||
|
} else if (i == (int) ' ' && plusCount == 3) {
|
||||||
|
buffer = new ByteArrayOutputStream();
|
||||||
|
afterNL = false;
|
||||||
|
plusCount = 0;
|
||||||
|
target.write(i);
|
||||||
|
} else if (i == (int) ' ' && minusCount == 3) {
|
||||||
|
minusCount = 0;
|
||||||
|
afterNL = false;
|
||||||
|
buffer = new ByteArrayOutputStream();
|
||||||
|
target.write(i);
|
||||||
|
} else if (buffer != null) {
|
||||||
|
if (i == (int) '\n') {
|
||||||
|
afterNL = true;
|
||||||
|
byte[] bytes = buffer.toByteArray();
|
||||||
|
String dequote = QuotedString.GIT_PATH.dequote(bytes, 0, bytes.length);
|
||||||
|
target.write(dequote.getBytes());
|
||||||
|
target.write(i);
|
||||||
|
buffer = null;
|
||||||
|
} else {
|
||||||
|
buffer.write(i);
|
||||||
|
afterNL = false;
|
||||||
|
}
|
||||||
|
} else if (i == (int) '\n') {
|
||||||
|
afterNL = true;
|
||||||
|
target.write(i);
|
||||||
|
} else {
|
||||||
|
target.write(i);
|
||||||
|
afterNL = false;
|
||||||
|
minusCount = 0;
|
||||||
|
plusCount = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user