*/
package org.eclipse.jgit.api;
-import java.io.File;
import java.io.IOException;
+import java.io.InputStream;
import java.util.Collection;
import java.util.LinkedList;
import org.eclipse.jgit.dircache.DirCacheBuilder;
import org.eclipse.jgit.dircache.DirCacheEntry;
import org.eclipse.jgit.dircache.DirCacheIterator;
-import org.eclipse.jgit.lib.ObjectWriter;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.ObjectInserter;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.treewalk.FileTreeIterator;
import org.eclipse.jgit.treewalk.TreeWalk;
if (filepatterns.contains("."))
addAll = true;
+ ObjectInserter inserter = repo.newObjectInserter();
try {
dc = repo.lockDirCache();
- ObjectWriter ow = new ObjectWriter(repo);
DirCacheIterator c;
DirCacheBuilder builder = dc.builder();
while (tw.next()) {
String path = tw.getPathString();
- final File file = new File(repo.getWorkTree(), path);
WorkingTreeIterator f = tw.getTree(1, WorkingTreeIterator.class);
if (tw.getTree(0, DirCacheIterator.class) == null &&
f != null && f.isEntryIgnored()) {
else if (!(path.equals(lastAddedFile))) {
if (!(update && tw.getTree(0, DirCacheIterator.class) == null)) {
if (f != null) { // the file exists
+ long sz = f.getEntryLength();
DirCacheEntry entry = new DirCacheEntry(path);
- entry.setLength((int)f.getEntryLength());
+ entry.setLength(sz);
entry.setLastModified(f.getEntryLastModified());
entry.setFileMode(f.getEntryFileMode());
- entry.setObjectId(ow.writeBlob(file));
+
+ InputStream in = f.openEntryStream();
+ try {
+ entry.setObjectId(inserter.insert(
+ Constants.OBJ_BLOB, sz, in));
+ } finally {
+ in.close();
+ }
builder.add(entry);
lastAddedFile = path;
}
}
}
+ inserter.flush();
builder.commit();
setCallable(false);
} catch (IOException e) {
throw new JGitInternalException(
JGitText.get().exceptionCaughtDuringExecutionOfAddCommand, e);
} finally {
+ inserter.release();
if (dc != null)
dc.unlock();
}
return current().getLastModified();
}
+ /**
+ * Obtain an input stream to read the file content.
+ * <p>
+ * Efficient implementations are not required. The caller will usually
+ * obtain the stream only once per entry, if at all.
+ * <p>
+ * The input stream should not use buffering if the implementation can avoid
+ * it. The caller will buffer as necessary to perform efficient block IO
+ * operations.
+ * <p>
+ * The caller will close the stream once complete.
+ *
+ * @return a stream to read from the file.
+ * @throws IOException
+ * the file could not be opened for reading.
+ */
+ public InputStream openEntryStream() throws IOException {
+ return current().openInputStream();
+ }
+
/**
* Determine if the current entry path is ignored by an ignore rule.
*