EolCanonicalizingInputStream: binary detection should be optional
EolCanonicalizingInputStream may also be used in combination with .gitattributes. If .gitattributes states that a file is of type text, line endings have to be canonicalized even if the actual file content seems to be binary. Change-Id: Ie4ccdfc5cb91fbd55e06f51146cf5c7c84b8e18b
This commit is contained in:
parent
755dfdb409
commit
7df17e57d4
|
@ -57,35 +57,46 @@ public class EolCanonicalizingInputStreamTest {
|
|||
@Test
|
||||
public void testLF() throws IOException {
|
||||
final byte[] bytes = asBytes("1\n2\n3");
|
||||
test(bytes, bytes);
|
||||
test(bytes, bytes, false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCR() throws IOException {
|
||||
final byte[] bytes = asBytes("1\r2\r3");
|
||||
test(bytes, bytes);
|
||||
test(bytes, bytes, false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCRLF() throws IOException {
|
||||
test(asBytes("1\r\n2\r\n3"), asBytes("1\n2\n3"));
|
||||
test(asBytes("1\r\n2\r\n3"), asBytes("1\n2\n3"), false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLFCR() throws IOException {
|
||||
final byte[] bytes = asBytes("1\n\r2\n\r3");
|
||||
test(bytes, bytes);
|
||||
test(bytes, bytes, false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEmpty() throws IOException {
|
||||
final byte[] bytes = asBytes("");
|
||||
test(bytes, bytes);
|
||||
test(bytes, bytes, false);
|
||||
}
|
||||
|
||||
private void test(byte[] input, byte[] expected) throws IOException {
|
||||
@Test
|
||||
public void testBinaryDetect() throws IOException {
|
||||
final byte[] bytes = asBytes("1\r\n2\r\n3\0");
|
||||
test(bytes, bytes, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testBinaryDontDetect() throws IOException {
|
||||
test(asBytes("1\r\n2\r\n3\0"), asBytes("1\n2\n3\0"), false);
|
||||
}
|
||||
|
||||
private void test(byte[] input, byte[] expected, boolean detectBinary) throws IOException {
|
||||
final InputStream bis1 = new ByteArrayInputStream(input);
|
||||
final InputStream cis1 = new EolCanonicalizingInputStream(bis1);
|
||||
final InputStream cis1 = new EolCanonicalizingInputStream(bis1, detectBinary);
|
||||
int index1 = 0;
|
||||
for (int b = cis1.read(); b != -1; b = cis1.read()) {
|
||||
assertEquals(expected[index1], (byte) b);
|
||||
|
@ -97,7 +108,7 @@ private void test(byte[] input, byte[] expected) throws IOException {
|
|||
for (int bufferSize = 1; bufferSize < 10; bufferSize++) {
|
||||
final byte[] buffer = new byte[bufferSize];
|
||||
final InputStream bis2 = new ByteArrayInputStream(input);
|
||||
final InputStream cis2 = new EolCanonicalizingInputStream(bis2);
|
||||
final InputStream cis2 = new EolCanonicalizingInputStream(bis2, detectBinary);
|
||||
|
||||
int read = 0;
|
||||
for (int readNow = cis2.read(buffer, 0, buffer.length); readNow != -1
|
||||
|
|
|
@ -402,7 +402,7 @@ private ByteBuffer filterClean(byte[] src, int n)
|
|||
}
|
||||
|
||||
private InputStream filterClean(InputStream in) throws IOException {
|
||||
return new EolCanonicalizingInputStream(in);
|
||||
return new EolCanonicalizingInputStream(in, true);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -500,7 +500,7 @@ public InputStream openEntryStream() throws IOException {
|
|||
InputStream rawis = current().openInputStream();
|
||||
InputStream is;
|
||||
if (getOptions().getAutoCRLF() != AutoCRLF.FALSE)
|
||||
is = new EolCanonicalizingInputStream(rawis);
|
||||
is = new EolCanonicalizingInputStream(rawis, true);
|
||||
else
|
||||
is = rawis;
|
||||
return is;
|
||||
|
|
|
@ -49,10 +49,11 @@
|
|||
import org.eclipse.jgit.diff.RawText;
|
||||
|
||||
/**
|
||||
* An input stream which canonicalizes EOLs bytes on the fly to '\n', unless the
|
||||
* first 8000 bytes indicate the stream is binary.
|
||||
* An input stream which canonicalizes EOLs bytes on the fly to '\n'.
|
||||
*
|
||||
* Note: Make sure to apply this InputStream only to text files!
|
||||
* Optionally, a binary check on the first 8000 bytes is performed
|
||||
* and in case of binary files, canonicalization is turned off
|
||||
* (for the complete file).
|
||||
*/
|
||||
public class EolCanonicalizingInputStream extends InputStream {
|
||||
private final byte[] single = new byte[1];
|
||||
|
@ -67,7 +68,7 @@ public class EolCanonicalizingInputStream extends InputStream {
|
|||
|
||||
private boolean isBinary;
|
||||
|
||||
private boolean modeDetected;
|
||||
private boolean detectBinary;
|
||||
|
||||
/**
|
||||
* Creates a new InputStream, wrapping the specified stream
|
||||
|
@ -75,8 +76,9 @@ public class EolCanonicalizingInputStream extends InputStream {
|
|||
* @param in
|
||||
* raw input stream
|
||||
*/
|
||||
public EolCanonicalizingInputStream(InputStream in) {
|
||||
public EolCanonicalizingInputStream(InputStream in, boolean detectBinary) {
|
||||
this.in = in;
|
||||
this.detectBinary = detectBinary;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -132,9 +134,9 @@ private boolean fillBuffer() throws IOException {
|
|||
cnt = in.read(buf, 0, buf.length);
|
||||
if (cnt < 1)
|
||||
return false;
|
||||
if (!modeDetected) {
|
||||
if (detectBinary) {
|
||||
isBinary = RawText.isBinary(buf, cnt);
|
||||
modeDetected = true;
|
||||
detectBinary = false;
|
||||
}
|
||||
ptr = 0;
|
||||
return true;
|
||||
|
|
Loading…
Reference in New Issue