Merge "Qualify post-0.9.1 builds" into stable-0.9
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/AbstractFetchCommand.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/AbstractFetchCommand.java
index 356966a..fd7fd44 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/AbstractFetchCommand.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/AbstractFetchCommand.java
@@ -49,6 +49,7 @@
 
 import java.io.IOException;
 import java.io.PrintWriter;
+import java.text.MessageFormat;
 
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.ObjectId;
@@ -104,16 +105,19 @@
 			else if (0 <= cr)
 				s = cr;
 			else {
-				writer.format(CLIText.get().remoteMessage, pkt);
+				writer.print(MessageFormat.format(CLIText.get().remoteMessage,
+						pkt));
 				writer.println();
 				break;
 			}
 
 			if (pkt.charAt(s) == '\r') {
-				writer.format(CLIText.get().remoteMessage, pkt.substring(0, s));
+				writer.print(MessageFormat.format(CLIText.get().remoteMessage,
+						pkt.substring(0, s)));
 				writer.print('\r');
 			} else {
-				writer.format(CLIText.get().remoteMessage, pkt.substring(0, s));
+				writer.print(MessageFormat.format(CLIText.get().remoteMessage,
+						pkt.substring(0, s)));
 				writer.println();
 			}
 
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Clone.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Clone.java
index 1b1a8c2..1b04989 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Clone.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Clone.java
@@ -114,7 +114,9 @@
 		dst.getConfig().save();
 		db = dst;
 
-		out.format(CLIText.get().initializedEmptyGitRepositoryIn, gitdir.getAbsolutePath());
+		out.print(MessageFormat.format(
+				CLIText.get().initializedEmptyGitRepositoryIn, gitdir
+						.getAbsolutePath()));
 		out.println();
 		out.flush();
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/CachedObjectDirectory.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/CachedObjectDirectory.java
index f0159f6..a5762b6 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/CachedObjectDirectory.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/CachedObjectDirectory.java
@@ -213,8 +213,22 @@
 	}
 
 	@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
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/FileObjectDatabase.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/FileObjectDatabase.java
index 29c7a25..8bd3751 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/FileObjectDatabase.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/FileObjectDatabase.java
@@ -57,6 +57,10 @@
 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);
@@ -249,7 +253,8 @@
 	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();
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/ObjectDirectory.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/ObjectDirectory.java
index 372a978..e7ccba0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/ObjectDirectory.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/ObjectDirectory.java
@@ -455,23 +455,33 @@
 	}
 
 	@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
@@ -481,12 +491,12 @@
 		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
@@ -495,7 +505,7 @@
 		// fail.
 		//
 		tmp.delete();
-		return false;
+		return InsertLooseObjectResult.FAILURE;
 	}
 
 	boolean tryAgain1() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/ObjectDirectoryInserter.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/ObjectDirectoryInserter.java
index d92285d..074ebb9 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/ObjectDirectoryInserter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/ObjectDirectoryInserter.java
@@ -83,9 +83,18 @@
 		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);
 	}