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
@@ -111,7 +111,7 @@ public class AddCommandTest extends RepositoryTestCase { | |||
} | |||
@Test | |||
public void testAddExistingSingleFileWithNewLine() throws IOException, | |||
public void testAddExistingSingleSmallFileWithNewLine() throws IOException, | |||
NoFilepatternException { | |||
File file = new File(db.getWorkTree(), "a.txt"); | |||
FileUtils.createNewFile(file); | |||
@@ -134,6 +134,35 @@ public class AddCommandTest extends RepositoryTestCase { | |||
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 | |||
public void testAddExistingSingleBinaryFile() throws IOException, | |||
NoFilepatternException { |
@@ -109,6 +109,29 @@ public abstract class ObjectInserter { | |||
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 */ | |||
protected MessageDigest digest() { | |||
digest.reset(); | |||
@@ -172,7 +195,7 @@ public abstract class ObjectInserter { | |||
md.update((byte) ' '); | |||
md.update(Constants.encodeASCII(length)); | |||
md.update((byte) 0); | |||
byte[] buf = buffer(); | |||
byte[] buf = buffer(length); | |||
while (length > 0) { | |||
int n = in.read(buf, 0, (int) Math.min(length, buf.length)); | |||
if (n < 0) |
@@ -116,7 +116,7 @@ public class DfsInserter extends ObjectInserter { | |||
@Override | |||
public ObjectId insert(int type, long len, InputStream in) | |||
throws IOException { | |||
byte[] buf = buffer(); | |||
byte[] buf = buffer(len); | |||
if (len <= buf.length) { | |||
IO.readFully(in, buf, 0, (int) len); | |||
return insert(type, buf, 0, (int) len); |
@@ -95,8 +95,8 @@ class ObjectDirectoryInserter extends ObjectInserter { | |||
@Override | |||
public ObjectId insert(final int type, long len, final InputStream is) | |||
throws IOException { | |||
if (len <= buffer().length) { | |||
byte[] buf = buffer(); | |||
byte[] buf = buffer(len); | |||
if (len <= buf.length) { | |||
int actLen = IO.readFully(is, buf, 0); | |||
return insert(type, buf, 0, actLen); | |||