Browse Source

Revert "Throw BinaryBlobException from RawParseUtils#lineMap."

This reverts commit f2e64cd895.

The newly added throws clause breaks backward compatibility. 

Change-Id: Ifa76a1b95935e52640b81cd53c171eb17da175c2
Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
tags/v4.10.0.201712302008-r
Han-Wen NIenhuys 6 years ago
parent
commit
dc24383b6b

+ 0
- 10
org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/RawTextTest.java View File

assertEquals(0, r.size()); assertEquals(0, r.size());
} }


@Test
public void testBinary() {
String input = "foo-a\nf\0o-b\n";
byte[] data = Constants.encodeASCII(input);
final RawText a = new RawText(data);
assertEquals(a.content, data);
assertEquals(a.size(), 1);
assertEquals(a.getString(0, 1, false), input);
}

@Test @Test
public void testEquals() { public void testEquals() {
final RawText a = new RawText(Constants.encodeASCII("foo-a\nfoo-b\n")); final RawText a = new RawText(Constants.encodeASCII("foo-a\nfoo-b\n"));

+ 9
- 9
org.eclipse.jgit.test/tst/org/eclipse/jgit/util/RawParseUtils_LineMapTest.java View File



import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;


import org.eclipse.jgit.errors.BinaryBlobException;
import org.junit.Test; import org.junit.Test;


public class RawParseUtils_LineMapTest { public class RawParseUtils_LineMapTest {
@Test @Test
public void testEmpty() throws Exception {
public void testEmpty() {
final IntList map = RawParseUtils.lineMap(new byte[] {}, 0, 0); final IntList map = RawParseUtils.lineMap(new byte[] {}, 0, 0);
assertNotNull(map); assertNotNull(map);
assertArrayEquals(new int[]{Integer.MIN_VALUE, 0}, asInts(map)); assertArrayEquals(new int[]{Integer.MIN_VALUE, 0}, asInts(map));
} }


@Test @Test
public void testOneBlankLine() throws Exception {
public void testOneBlankLine() {
final IntList map = RawParseUtils.lineMap(new byte[] { '\n' }, 0, 1); final IntList map = RawParseUtils.lineMap(new byte[] { '\n' }, 0, 1);
assertArrayEquals(new int[]{Integer.MIN_VALUE, 0, 1}, asInts(map)); assertArrayEquals(new int[]{Integer.MIN_VALUE, 0, 1}, asInts(map));
} }


@Test @Test
public void testTwoLineFooBar() throws Exception {
public void testTwoLineFooBar() throws UnsupportedEncodingException {
final byte[] buf = "foo\nbar\n".getBytes("ISO-8859-1"); final byte[] buf = "foo\nbar\n".getBytes("ISO-8859-1");
final IntList map = RawParseUtils.lineMap(buf, 0, buf.length); final IntList map = RawParseUtils.lineMap(buf, 0, buf.length);
assertArrayEquals(new int[]{Integer.MIN_VALUE, 0, 4, buf.length}, asInts(map)); assertArrayEquals(new int[]{Integer.MIN_VALUE, 0, 4, buf.length}, asInts(map));
} }


@Test @Test
public void testTwoLineNoLF() throws Exception {
public void testTwoLineNoLF() throws UnsupportedEncodingException {
final byte[] buf = "foo\nbar".getBytes("ISO-8859-1"); final byte[] buf = "foo\nbar".getBytes("ISO-8859-1");
final IntList map = RawParseUtils.lineMap(buf, 0, buf.length); final IntList map = RawParseUtils.lineMap(buf, 0, buf.length);
assertArrayEquals(new int[]{Integer.MIN_VALUE, 0, 4, buf.length}, asInts(map)); assertArrayEquals(new int[]{Integer.MIN_VALUE, 0, 4, buf.length}, asInts(map));
} }


@Test(expected = BinaryBlobException.class)
public void testBinary() throws Exception {
@Test
public void testBinary() throws UnsupportedEncodingException {
final byte[] buf = "xxxfoo\nb\0ar".getBytes("ISO-8859-1"); final byte[] buf = "xxxfoo\nb\0ar".getBytes("ISO-8859-1");
RawParseUtils.lineMap(buf, 3, buf.length);
final IntList map = RawParseUtils.lineMap(buf, 3, buf.length);
assertArrayEquals(new int[]{Integer.MIN_VALUE, 3, buf.length}, asInts(map));
} }


@Test @Test
public void testFourLineBlanks() throws Exception {
public void testFourLineBlanks() throws UnsupportedEncodingException {
final byte[] buf = "foo\n\n\nbar\n".getBytes("ISO-8859-1"); final byte[] buf = "foo\n\n\nbar\n".getBytes("ISO-8859-1");
final IntList map = RawParseUtils.lineMap(buf, 0, buf.length); final IntList map = RawParseUtils.lineMap(buf, 0, buf.length);



+ 2
- 25
org.eclipse.jgit/src/org/eclipse/jgit/diff/RawText.java View File

*/ */
public RawText(final byte[] input) { public RawText(final byte[] input) {
content = input; content = input;
IntList map;
try {
map = RawParseUtils.lineMap(content, 0, content.length);
} catch (BinaryBlobException e) {
map = new IntList(3);
map.add(Integer.MIN_VALUE);
map.add(0);
map.add(content.length);
}
lines = map;
}

/**
* Construct a new RawText if the line map is already known.
*
* @param data
* the blob data.
* @param lineMap
* Indices of line starts, with indexed by base-1 linenumber.
*/
private RawText(final byte[] data, final IntList lineMap) {
content = data;
lines = lineMap;
lines = RawParseUtils.lineMap(content, 0, content.length);
} }


/** /**


System.arraycopy(head, 0, data, 0, head.length); System.arraycopy(head, 0, data, 0, head.length);
IO.readFully(stream, data, off, (int) (sz-off)); IO.readFully(stream, data, off, (int) (sz-off));
IntList lineMap = RawParseUtils.lineMap(data, 0, data.length);
return new RawText(data, lineMap);
return new RawText(data);
} }
} }
} }

+ 11
- 4
org.eclipse.jgit/src/org/eclipse/jgit/util/RawParseUtils.java View File

import java.util.Map; import java.util.Map;


import org.eclipse.jgit.annotations.Nullable; import org.eclipse.jgit.annotations.Nullable;
import org.eclipse.jgit.errors.BinaryBlobException;
import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.lib.PersonIdent;


* <p> * <p>
* The last element (index <code>map.size()-1</code>) always contains * The last element (index <code>map.size()-1</code>) always contains
* <code>end</code>. * <code>end</code>.
* <p>
* If the data contains a '\0' anywhere, the whole region is considered binary
* and a LineMap corresponding to a single line is returned.
* </p> * </p>
* *
* @param buf * @param buf
* @param end * @param end
* 1 past the end of the content within <code>buf</code>. * 1 past the end of the content within <code>buf</code>.
* @return a line map indexing the start position of each line. * @return a line map indexing the start position of each line.
* @throws BinaryBlobException if any '\0' is found.
*/ */
public static final IntList lineMap(final byte[] buf, int ptr, int end) throws BinaryBlobException {
public static final IntList lineMap(final byte[] buf, int ptr, int end) {
int start = ptr;

// Experimentally derived from multiple source repositories // Experimentally derived from multiple source repositories
// the average number of bytes/line is 36. Its a rough guess // the average number of bytes/line is 36. Its a rough guess
// to initially size our map close to the target. // to initially size our map close to the target.
} }


if (buf[ptr] == '\0') { if (buf[ptr] == '\0') {
throw new BinaryBlobException();
// binary data.
map = new IntList(3);
map.add(Integer.MIN_VALUE);
map.add(start);
break;
} }


foundLF = (buf[ptr] == '\n'); foundLF = (buf[ptr] == '\n');

Loading…
Cancel
Save