CRLF only works for small files, where small is the size of the buffer, i.e. about 8K. This QD fix reallocates the buffer to be large enough. Bug: 369780 Change-Id: Ifc34ad204fbf5986b257a5c616e4a8c601e8261atags/v2.0.0.201206130900-r
} | } | ||||
@Test | @Test | ||||
public void testAddExistingSingleFileWithNewLine() throws IOException, | |||||
public void testAddExistingSingleSmallFileWithNewLine() throws IOException, | |||||
NoFilepatternException { | NoFilepatternException { | ||||
File file = new File(db.getWorkTree(), "a.txt"); | File file = new File(db.getWorkTree(), "a.txt"); | ||||
FileUtils.createNewFile(file); | FileUtils.createNewFile(file); | ||||
indexState(CONTENT)); | indexState(CONTENT)); | ||||
} | } | ||||
@Test | |||||
public void testAddExistingSingleMediumSizeFileWithNewLine() | |||||
throws IOException, NoFilepatternException { | |||||
File file = new File(db.getWorkTree(), "a.txt"); | |||||
FileUtils.createNewFile(file); | |||||
StringBuilder data = new StringBuilder(); | |||||
for (int i = 0; i < 1000; ++i) { | |||||
data.append("row1\r\nrow2"); | |||||
} | |||||
String crData = data.toString(); | |||||
PrintWriter writer = new PrintWriter(file); | |||||
writer.print(crData); | |||||
writer.close(); | |||||
String lfData = data.toString().replaceAll("\r", ""); | |||||
Git git = new Git(db); | |||||
db.getConfig().setString("core", null, "autocrlf", "false"); | |||||
git.add().addFilepattern("a.txt").call(); | |||||
assertEquals("[a.txt, mode:100644, content:" + data + "]", | |||||
indexState(CONTENT)); | |||||
db.getConfig().setString("core", null, "autocrlf", "true"); | |||||
git.add().addFilepattern("a.txt").call(); | |||||
assertEquals("[a.txt, mode:100644, content:" + lfData + "]", | |||||
indexState(CONTENT)); | |||||
db.getConfig().setString("core", null, "autocrlf", "input"); | |||||
git.add().addFilepattern("a.txt").call(); | |||||
assertEquals("[a.txt, mode:100644, content:" + lfData + "]", | |||||
indexState(CONTENT)); | |||||
} | |||||
@Test | @Test | ||||
public void testAddExistingSingleBinaryFile() throws IOException, | public void testAddExistingSingleBinaryFile() throws IOException, | ||||
NoFilepatternException { | NoFilepatternException { |
return tempBuffer; | return tempBuffer; | ||||
} | } | ||||
static private final int tempBufSize; | |||||
static { | |||||
String s = System.getProperty("jgit.tempbufmaxsize"); | |||||
if (s != null) | |||||
tempBufSize = Integer.parseInt(s); | |||||
else | |||||
tempBufSize = 1000000; | |||||
} | |||||
/** | |||||
* @param hintSize | |||||
* @return a temporary byte array for use by the caller | |||||
*/ | |||||
protected byte[] buffer(long hintSize) { | |||||
if (hintSize >= tempBufSize) | |||||
tempBuffer = new byte[0]; | |||||
else if (tempBuffer == null) | |||||
tempBuffer = new byte[(int) hintSize]; | |||||
else if (tempBuffer.length < hintSize) | |||||
tempBuffer = new byte[(int) hintSize]; | |||||
return tempBuffer; | |||||
} | |||||
/** @return digest to help compute an ObjectId */ | /** @return digest to help compute an ObjectId */ | ||||
protected MessageDigest digest() { | protected MessageDigest digest() { | ||||
digest.reset(); | digest.reset(); | ||||
md.update((byte) ' '); | md.update((byte) ' '); | ||||
md.update(Constants.encodeASCII(length)); | md.update(Constants.encodeASCII(length)); | ||||
md.update((byte) 0); | md.update((byte) 0); | ||||
byte[] buf = buffer(); | |||||
byte[] buf = buffer(length); | |||||
while (length > 0) { | while (length > 0) { | ||||
int n = in.read(buf, 0, (int) Math.min(length, buf.length)); | int n = in.read(buf, 0, (int) Math.min(length, buf.length)); | ||||
if (n < 0) | if (n < 0) |
@Override | @Override | ||||
public ObjectId insert(int type, long len, InputStream in) | public ObjectId insert(int type, long len, InputStream in) | ||||
throws IOException { | throws IOException { | ||||
byte[] buf = buffer(); | |||||
byte[] buf = buffer(len); | |||||
if (len <= buf.length) { | if (len <= buf.length) { | ||||
IO.readFully(in, buf, 0, (int) len); | IO.readFully(in, buf, 0, (int) len); | ||||
return insert(type, buf, 0, (int) len); | return insert(type, buf, 0, (int) len); |
@Override | @Override | ||||
public ObjectId insert(final int type, long len, final InputStream is) | public ObjectId insert(final int type, long len, final InputStream is) | ||||
throws IOException { | throws IOException { | ||||
if (len <= buffer().length) { | |||||
byte[] buf = buffer(); | |||||
byte[] buf = buffer(len); | |||||
if (len <= buf.length) { | |||||
int actLen = IO.readFully(is, buf, 0); | int actLen = IO.readFully(is, buf, 0); | ||||
return insert(type, buf, 0, actLen); | return insert(type, buf, 0, actLen); | ||||