}
@Override
- boolean insertUnpackedObject(File tmp, ObjectId objectId, boolean force) {
- return wrapped.insertUnpackedObject(tmp, objectId, force);
+ InsertLooseObjectResult insertUnpackedObject(File tmp, ObjectId objectId,
+ boolean createDuplicate) {
+ InsertLooseObjectResult result = wrapped.insertUnpackedObject(tmp,
+ objectId, createDuplicate);
+ switch (result) {
+ case INSERTED:
+ case EXISTS_LOOSE:
+ if (!unpackedObjects.contains(objectId))
+ unpackedObjects.add(objectId);
+ break;
+
+ case EXISTS_PACKED:
+ case FAILURE:
+ break;
+ }
+ return result;
}
@Override
import org.eclipse.jgit.storage.pack.PackWriter;
abstract class FileObjectDatabase extends ObjectDatabase {
+ static enum InsertLooseObjectResult {
+ INSERTED, EXISTS_PACKED, EXISTS_LOOSE, FAILURE;
+ }
+
@Override
public ObjectReader newReader() {
return new WindowCursor(this);
abstract long getObjectSize2(WindowCursor curs, String objectName,
AnyObjectId objectId) throws IOException;
- abstract boolean insertUnpackedObject(File tmp, ObjectId id, boolean force);
+ abstract InsertLooseObjectResult insertUnpackedObject(File tmp,
+ ObjectId id, boolean createDuplicate);
abstract FileObjectDatabase newCachedFileObjectDatabase();
}
@Override
- boolean insertUnpackedObject(File tmp, ObjectId id, boolean force) {
- if (!force && has(id)) {
- // Object is already in the repository, remove temporary file.
- //
+ InsertLooseObjectResult insertUnpackedObject(File tmp, ObjectId id,
+ boolean createDuplicate) {
+ // If the object is already in the repository, remove temporary file.
+ //
+ if (unpackedObjectCache.isUnpacked(id)) {
tmp.delete();
- return true;
+ return InsertLooseObjectResult.EXISTS_LOOSE;
}
+ if (!createDuplicate && has(id)) {
+ tmp.delete();
+ return InsertLooseObjectResult.EXISTS_PACKED;
+ }
+
tmp.setReadOnly();
final File dst = fileFor(id);
- if (force && dst.exists()) {
+ if (dst.exists()) {
+ // We want to be extra careful and avoid replacing an object
+ // that already exists. We can't be sure renameTo() would
+ // fail on all platforms if dst exists, so we check first.
+ //
tmp.delete();
- return true;
+ return InsertLooseObjectResult.EXISTS_LOOSE;
}
if (tmp.renameTo(dst)) {
unpackedObjectCache.add(id);
- return true;
+ return InsertLooseObjectResult.INSERTED;
}
// Maybe the directory doesn't exist yet as the object
dst.getParentFile().mkdir();
if (tmp.renameTo(dst)) {
unpackedObjectCache.add(id);
- return true;
+ return InsertLooseObjectResult.INSERTED;
}
- if (!force && has(id)) {
+ if (!createDuplicate && has(id)) {
tmp.delete();
- return true;
+ return InsertLooseObjectResult.EXISTS_PACKED;
}
// The object failed to be renamed into its proper
// fail.
//
tmp.delete();
- return false;
+ return InsertLooseObjectResult.FAILURE;
}
boolean tryAgain1() {
final MessageDigest md = digest();
final File tmp = toTemp(md, type, len, is);
final ObjectId id = ObjectId.fromRaw(md.digest());
- if (db.insertUnpackedObject(tmp, id, false /* no duplicate */))
+
+ switch (db.insertUnpackedObject(tmp, id, false /* no duplicate */)) {
+ case INSERTED:
+ case EXISTS_PACKED:
+ case EXISTS_LOOSE:
return id;
+ case FAILURE:
+ default:
+ break;
+ }
+
final File dst = db.fileFor(id);
throw new ObjectWritingException("Unable to create new object: " + dst);
}