Browse Source

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
stable-2.0
Robin Rosenberg 13 years ago
parent
commit
88fe2836ed
  1. 31
      org.eclipse.jgit.test/tst/org/eclipse/jgit/api/AddCommandTest.java
  2. 25
      org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectInserter.java
  3. 2
      org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsInserter.java
  4. 4
      org.eclipse.jgit/src/org/eclipse/jgit/storage/file/ObjectDirectoryInserter.java

31
org.eclipse.jgit.test/tst/org/eclipse/jgit/api/AddCommandTest.java

@ -111,7 +111,7 @@ public class AddCommandTest extends RepositoryTestCase {
} }
@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);
@ -134,6 +134,35 @@ public class AddCommandTest extends RepositoryTestCase {
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 {

25
org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectInserter.java

@ -109,6 +109,29 @@ public abstract class ObjectInserter {
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();
@ -172,7 +195,7 @@ public abstract class ObjectInserter {
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)

2
org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsInserter.java

@ -116,7 +116,7 @@ public class DfsInserter extends ObjectInserter {
@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);

4
org.eclipse.jgit/src/org/eclipse/jgit/storage/file/ObjectDirectoryInserter.java

@ -95,8 +95,8 @@ class ObjectDirectoryInserter extends ObjectInserter {
@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(len);
byte[] buf = buffer(); 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);

Loading…
Cancel
Save