|
|
@ -14,7 +14,6 @@ package org.eclipse.jgit.internal.storage.file; |
|
|
|
|
|
|
|
|
|
|
|
import java.io.EOFException; |
|
|
|
import java.io.EOFException; |
|
|
|
import java.io.File; |
|
|
|
import java.io.File; |
|
|
|
import java.io.FileNotFoundException; |
|
|
|
|
|
|
|
import java.io.FileOutputStream; |
|
|
|
import java.io.FileOutputStream; |
|
|
|
import java.io.FilterOutputStream; |
|
|
|
import java.io.FilterOutputStream; |
|
|
|
import java.io.IOException; |
|
|
|
import java.io.IOException; |
|
|
@ -116,7 +115,7 @@ class ObjectDirectoryInserter extends ObjectInserter { |
|
|
|
|
|
|
|
|
|
|
|
private ObjectId insertOneObject( |
|
|
|
private ObjectId insertOneObject( |
|
|
|
File tmp, ObjectId id, boolean createDuplicate) |
|
|
|
File tmp, ObjectId id, boolean createDuplicate) |
|
|
|
throws IOException, ObjectWritingException { |
|
|
|
throws IOException { |
|
|
|
switch (db.insertUnpackedObject(tmp, id, createDuplicate)) { |
|
|
|
switch (db.insertUnpackedObject(tmp, id, createDuplicate)) { |
|
|
|
case INSERTED: |
|
|
|
case INSERTED: |
|
|
|
case EXISTS_PACKED: |
|
|
|
case EXISTS_PACKED: |
|
|
@ -163,18 +162,16 @@ class ObjectDirectoryInserter extends ObjectInserter { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@SuppressWarnings("resource" /* java 7 */) |
|
|
|
|
|
|
|
private File toTemp(final SHA1 md, final int type, long len, |
|
|
|
private File toTemp(final SHA1 md, final int type, long len, |
|
|
|
final InputStream is) throws IOException, FileNotFoundException, |
|
|
|
final InputStream is) throws IOException { |
|
|
|
Error { |
|
|
|
|
|
|
|
boolean delete = true; |
|
|
|
boolean delete = true; |
|
|
|
File tmp = newTempFile(); |
|
|
|
File tmp = newTempFile(); |
|
|
|
try { |
|
|
|
try (FileOutputStream fOut = new FileOutputStream(tmp)) { |
|
|
|
FileOutputStream fOut = new FileOutputStream(tmp); |
|
|
|
|
|
|
|
try { |
|
|
|
try { |
|
|
|
OutputStream out = fOut; |
|
|
|
OutputStream out = fOut; |
|
|
|
if (config.getFSyncObjectFiles()) |
|
|
|
if (config.getFSyncObjectFiles()) { |
|
|
|
out = Channels.newOutputStream(fOut.getChannel()); |
|
|
|
out = Channels.newOutputStream(fOut.getChannel()); |
|
|
|
|
|
|
|
} |
|
|
|
DeflaterOutputStream cOut = compress(out); |
|
|
|
DeflaterOutputStream cOut = compress(out); |
|
|
|
SHA1OutputStream dOut = new SHA1OutputStream(cOut, md); |
|
|
|
SHA1OutputStream dOut = new SHA1OutputStream(cOut, md); |
|
|
|
writeHeader(dOut, type, len); |
|
|
|
writeHeader(dOut, type, len); |
|
|
@ -182,55 +179,56 @@ class ObjectDirectoryInserter extends ObjectInserter { |
|
|
|
final byte[] buf = buffer(); |
|
|
|
final byte[] buf = buffer(); |
|
|
|
while (len > 0) { |
|
|
|
while (len > 0) { |
|
|
|
int n = is.read(buf, 0, (int) Math.min(len, buf.length)); |
|
|
|
int n = is.read(buf, 0, (int) Math.min(len, buf.length)); |
|
|
|
if (n <= 0) |
|
|
|
if (n <= 0) { |
|
|
|
throw shortInput(len); |
|
|
|
throw shortInput(len); |
|
|
|
|
|
|
|
} |
|
|
|
dOut.write(buf, 0, n); |
|
|
|
dOut.write(buf, 0, n); |
|
|
|
len -= n; |
|
|
|
len -= n; |
|
|
|
} |
|
|
|
} |
|
|
|
dOut.flush(); |
|
|
|
dOut.flush(); |
|
|
|
cOut.finish(); |
|
|
|
cOut.finish(); |
|
|
|
} finally { |
|
|
|
} finally { |
|
|
|
if (config.getFSyncObjectFiles()) |
|
|
|
if (config.getFSyncObjectFiles()) { |
|
|
|
fOut.getChannel().force(true); |
|
|
|
fOut.getChannel().force(true); |
|
|
|
fOut.close(); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
delete = false; |
|
|
|
delete = false; |
|
|
|
return tmp; |
|
|
|
return tmp; |
|
|
|
} finally { |
|
|
|
} finally { |
|
|
|
if (delete) |
|
|
|
if (delete) { |
|
|
|
FileUtils.delete(tmp, FileUtils.RETRY); |
|
|
|
FileUtils.delete(tmp, FileUtils.RETRY); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@SuppressWarnings("resource" /* java 7 */) |
|
|
|
|
|
|
|
private File toTemp(final int type, final byte[] buf, final int pos, |
|
|
|
private File toTemp(final int type, final byte[] buf, final int pos, |
|
|
|
final int len) throws IOException, FileNotFoundException { |
|
|
|
final int len) throws IOException { |
|
|
|
boolean delete = true; |
|
|
|
boolean delete = true; |
|
|
|
File tmp = newTempFile(); |
|
|
|
File tmp = newTempFile(); |
|
|
|
try { |
|
|
|
try (FileOutputStream fOut = new FileOutputStream(tmp)) { |
|
|
|
FileOutputStream fOut = new FileOutputStream(tmp); |
|
|
|
|
|
|
|
try { |
|
|
|
try { |
|
|
|
OutputStream out = fOut; |
|
|
|
OutputStream out = fOut; |
|
|
|
if (config.getFSyncObjectFiles()) |
|
|
|
if (config.getFSyncObjectFiles()) { |
|
|
|
out = Channels.newOutputStream(fOut.getChannel()); |
|
|
|
out = Channels.newOutputStream(fOut.getChannel()); |
|
|
|
|
|
|
|
} |
|
|
|
DeflaterOutputStream cOut = compress(out); |
|
|
|
DeflaterOutputStream cOut = compress(out); |
|
|
|
writeHeader(cOut, type, len); |
|
|
|
writeHeader(cOut, type, len); |
|
|
|
cOut.write(buf, pos, len); |
|
|
|
cOut.write(buf, pos, len); |
|
|
|
cOut.finish(); |
|
|
|
cOut.finish(); |
|
|
|
} finally { |
|
|
|
} finally { |
|
|
|
if (config.getFSyncObjectFiles()) |
|
|
|
if (config.getFSyncObjectFiles()) { |
|
|
|
fOut.getChannel().force(true); |
|
|
|
fOut.getChannel().force(true); |
|
|
|
fOut.close(); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
delete = false; |
|
|
|
delete = false; |
|
|
|
return tmp; |
|
|
|
return tmp; |
|
|
|
} finally { |
|
|
|
} finally { |
|
|
|
if (delete) |
|
|
|
if (delete) { |
|
|
|
FileUtils.delete(tmp, FileUtils.RETRY); |
|
|
|
FileUtils.delete(tmp, FileUtils.RETRY); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void writeHeader(OutputStream out, int type, long len) |
|
|
|
void writeHeader(OutputStream out, int type, long len) |
|
|
|
throws IOException { |
|
|
|
throws IOException { |
|
|
|