From 88fe2836edab8d8ce82d28acd9d07b061988ff3a Mon Sep 17 00:00:00 2001 From: Robin Rosenberg Date: Sat, 3 Mar 2012 08:22:48 +0100 Subject: [PATCH] Quickfix for AutoCRLF handling 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: Ifc34ad204fbf5986b257a5c616e4a8c601e8261a --- .../org/eclipse/jgit/api/AddCommandTest.java | 31 ++++++++++++++++++- .../org/eclipse/jgit/lib/ObjectInserter.java | 25 ++++++++++++++- .../eclipse/jgit/storage/dfs/DfsInserter.java | 2 +- .../storage/file/ObjectDirectoryInserter.java | 4 +-- 4 files changed, 57 insertions(+), 5 deletions(-) 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);