From 61db0e4787b2f330816d15fe173d7784fae02c60 Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Fri, 3 Dec 2010 13:35:46 -0800 Subject: [PATCH] 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 CC: Chris Aniszczyk CC: Christian Halstrick --- .../eclipse/jgit/dircache/DirCacheCheckout.java | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) 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(); } -- 2.39.5