diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/AddCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/AddCommandTest.java index 632288ec6..2fb228e01 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/AddCommandTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/AddCommandTest.java @@ -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 { diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectInserter.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectInserter.java index 0355e56f5..e03fe3571 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectInserter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectInserter.java @@ -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) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsInserter.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsInserter.java index 335e284e2..e80a32475 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsInserter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsInserter.java @@ -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); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/ObjectDirectoryInserter.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/ObjectDirectoryInserter.java index ffd5c4149..75f6b0bda 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/ObjectDirectoryInserter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/ObjectDirectoryInserter.java @@ -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);