mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-12-31 20:59:47 +01:00
Buffer output and do not create new temp array streams
This commit is contained in:
@@ -37,10 +37,13 @@ import org.eclipse.jgit.util.QuotedString;
|
||||
import sonia.scm.repository.Repository;
|
||||
import sonia.scm.repository.api.DiffCommandBuilder;
|
||||
|
||||
import java.io.BufferedOutputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
|
||||
import static java.nio.charset.StandardCharsets.UTF_8;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Sebastian Sdorra
|
||||
@@ -73,17 +76,19 @@ public class GitDiffCommand extends AbstractGitCommand implements DiffCommand {
|
||||
};
|
||||
}
|
||||
|
||||
private static class DequoteOutputStream extends OutputStream {
|
||||
static class DequoteOutputStream extends OutputStream {
|
||||
|
||||
private final OutputStream target;
|
||||
|
||||
private boolean afterNL = false;
|
||||
private boolean writeToBuffer = false;
|
||||
private int minusCount = 0;
|
||||
private int plusCount = 0;
|
||||
private ByteArrayOutputStream buffer;
|
||||
|
||||
private DequoteOutputStream(OutputStream target) {
|
||||
this.target = target;
|
||||
private final ByteArrayOutputStream buffer = new ByteArrayOutputStream();
|
||||
|
||||
DequoteOutputStream(OutputStream target) {
|
||||
this.target = new BufferedOutputStream(target);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -105,38 +110,40 @@ public class GitDiffCommand extends AbstractGitCommand implements DiffCommand {
|
||||
afterNL = false;
|
||||
target.write(i);
|
||||
} else if (i == (int) ' ' && plusCount == 3) {
|
||||
buffer = new ByteArrayOutputStream();
|
||||
writeToBuffer = true;
|
||||
buffer.reset();
|
||||
afterNL = false;
|
||||
plusCount = 0;
|
||||
target.write(i);
|
||||
} else if (i == (int) ' ' && minusCount == 3) {
|
||||
minusCount = 0;
|
||||
afterNL = false;
|
||||
buffer = new ByteArrayOutputStream();
|
||||
writeToBuffer = true;
|
||||
buffer.reset();
|
||||
target.write(i);
|
||||
} else if (i == (int) '\n') {
|
||||
if (buffer != null) {
|
||||
afterNL = true;
|
||||
afterNL = true;
|
||||
if (writeToBuffer) {
|
||||
byte[] bytes = buffer.toByteArray();
|
||||
String dequote = QuotedString.GIT_PATH.dequote(bytes, 0, bytes.length);
|
||||
target.write(dequote.getBytes());
|
||||
target.write(i);
|
||||
buffer = null;
|
||||
} else {
|
||||
afterNL = true;
|
||||
target.write(i);
|
||||
target.write(dequote.getBytes(UTF_8));
|
||||
writeToBuffer = false;
|
||||
}
|
||||
target.write(i);
|
||||
} else if (writeToBuffer) {
|
||||
buffer.write(i);
|
||||
afterNL = false;
|
||||
} else {
|
||||
if (buffer != null) {
|
||||
buffer.write(i);
|
||||
afterNL = false;
|
||||
} else {
|
||||
target.write(i);
|
||||
afterNL = false;
|
||||
minusCount = 0;
|
||||
plusCount = 0;
|
||||
}
|
||||
target.write(i);
|
||||
afterNL = false;
|
||||
minusCount = 0;
|
||||
plusCount = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void flush() throws IOException {
|
||||
target.flush();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user