From 61db0e4787b2f330816d15fe173d7784fae02c60 Mon Sep 17 00:00:00 2001
From: "Shawn O. Pearce" <spearce@spearce.org>
Date: Fri, 3 Dec 2010 13:35:46 -0800
Subject: Fix checking out large files

DirCacheCheckout needs to use ObjectLoader.copyTo to avoid loading the
complete content of a large file into the JVM heap.

Bug: 321097
Change-Id: I967590b6f233fd1c83d873075db01d653208b3b9
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
CC: Chris Aniszczyk <caniszczyk@gmail.com>
CC: Christian Halstrick <christian.halstrick@sap.com>
---
 .../src/org/eclipse/jgit/dircache/DirCacheCheckout.java | 17 ++---------------
 1 file changed, 2 insertions(+), 15 deletions(-)

(limited to 'org.eclipse.jgit')

diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java
index 07f97d9b68..e4d5b76988 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java
@@ -45,8 +45,6 @@ package org.eclipse.jgit.dircache;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.channels.FileChannel;
 import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -59,7 +57,6 @@ import org.eclipse.jgit.errors.CorruptObjectException;
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
 import org.eclipse.jgit.errors.IndexWriteException;
 import org.eclipse.jgit.errors.MissingObjectException;
-import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.FileMode;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.ObjectLoader;
@@ -836,21 +833,11 @@ public class DirCacheCheckout {
 	public static void checkoutEntry(final Repository repo, File f, DirCacheEntry entry,
 			boolean config_filemode) throws IOException {
 		ObjectLoader ol = repo.open(entry.getObjectId());
-		if (ol == null)
-			throw new MissingObjectException(entry.getObjectId(),
-					Constants.TYPE_BLOB);
-
-		byte[] bytes = ol.getCachedBytes();
-
 		File parentDir = f.getParentFile();
 		File tmpFile = File.createTempFile("._" + f.getName(), null, parentDir);
-		FileChannel channel = new FileOutputStream(tmpFile).getChannel();
-		ByteBuffer buffer = ByteBuffer.wrap(bytes);
+		FileOutputStream channel = new FileOutputStream(tmpFile);
 		try {
-			int j = channel.write(buffer);
-			if (j != bytes.length)
-				throw new IOException(MessageFormat.format(
-						JGitText.get().couldNotWriteFile, tmpFile));
+			ol.copyTo(channel);
 		} finally {
 			channel.close();
 		}
-- 
cgit v1.2.3