From: Shawn O. Pearce Date: Fri, 3 Dec 2010 21:35:46 +0000 (-0800) Subject: Fix checking out large files X-Git-Tag: v0.10.1~50^2 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=61db0e4787b2f330816d15fe173d7784fae02c60;p=jgit.git 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 --- 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(); }