Browse Source

TemporaryBuffer: Fix reading from in-memory InputStream

I had the conditions wrong here, causing the in-memory InputStream
to always appear to be at EOF.

Change-Id: I6811d6187a34eaf1fd6c5002550d631decdfc391
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
stable-1.2
Shawn O. Pearce 14 years ago
parent
commit
826fb260a3
  1. 15
      org.eclipse.jgit.test/tst/org/eclipse/jgit/util/TemporaryBufferTest.java
  2. 5
      org.eclipse.jgit/src/org/eclipse/jgit/util/TemporaryBuffer.java

15
org.eclipse.jgit.test/tst/org/eclipse/jgit/util/TemporaryBufferTest.java

@ -52,6 +52,7 @@ import static org.junit.Assert.fail;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import org.eclipse.jgit.junit.TestRng;
@ -248,6 +249,20 @@ public class TemporaryBufferTest {
}
}
@Test
public void testInCoreInputStream() throws IOException {
final int cnt = 256;
final byte[] test = new TestRng(getName()).nextBytes(cnt);
final TemporaryBuffer.Heap b = new TemporaryBuffer.Heap(cnt + 4);
b.write(test);
b.close();
InputStream in = b.openInputStream();
byte[] act = new byte[cnt];
IO.readFully(in, act, 0, cnt);
assertTrue(Arrays.equals(test, act));
}
@Test
public void testInCoreLimit_SwitchOnAppendByte() throws IOException {
final TemporaryBuffer b = new TemporaryBuffer.LocalFile();

5
org.eclipse.jgit/src/org/eclipse/jgit/util/TemporaryBuffer.java

@ -548,7 +548,7 @@ public abstract class TemporaryBuffer extends OutputStream {
long skipped = 0;
while (0 < cnt) {
int n = (int) Math.min(block.count - blockPos, cnt);
if (n < 0) {
if (0 < n) {
blockPos += n;
skipped += n;
cnt -= n;
@ -567,11 +567,12 @@ public abstract class TemporaryBuffer extends OutputStream {
int copied = 0;
while (0 < len) {
int c = Math.min(block.count - blockPos, len);
if (c < 0) {
if (0 < c) {
System.arraycopy(block.buffer, blockPos, b, off, c);
blockPos += c;
off += c;
len -= c;
copied += c;
} else if (nextBlock())
continue;
else

Loading…
Cancel
Save