pack-objects: thin pack micro-optimization.

Since we sort objects by type, hash, preferredness and then
size, after we have a delta against preferred base, there is no
point trying a delta with non-preferred base.  This seems to
save expensive calls to diff-delta and it also seems to save the
output space as well.

Signed-off-by: Junio C Hamano <junkio@cox.net>
diff --git a/pack-objects.c b/pack-objects.c
index ceb107f..af3bdf5 100644
--- a/pack-objects.c
+++ b/pack-objects.c
@@ -447,7 +447,7 @@
 	struct packed_git *p;
 	unsigned int found_offset = 0;
 	struct packed_git *found_pack = NULL;
-	int ix;
+	int ix, status = 0;
 
 	if (!exclude) {
 		for (p = packed_git; p; p = p->next) {
@@ -493,6 +493,7 @@
 			die("internal error in object hashing.");
 		object_ix[-1 - ix] = idx + 1;
 	}
+	status = 1;
 
  already_added:
 	if (exclude)
@@ -503,7 +504,7 @@
 			entry->in_pack_offset = found_offset;
 		}
 	}
-	return 1;
+	return status;
 }
 
 static void add_pbase_tree(struct tree_desc *tree)
@@ -521,7 +522,10 @@
 			continue;
 		if (sha1_object_info(sha1, type, &size))
 			continue;
-		add_object_entry(sha1, name, 1);
+
+		if (!add_object_entry(sha1, name, 1))
+			continue;
+
 		if (!strcmp(type, "tree")) {
 			struct tree_desc sub;
 			void *elem;
@@ -543,8 +547,8 @@
 	tree.buf = elem;
 	if (!tree.buf)
 		return;
-	add_object_entry(sha1, "", 1);
-	add_pbase_tree(&tree);
+	if (add_object_entry(sha1, "", 1))
+		add_pbase_tree(&tree);
 	free(elem);
 }
 
@@ -774,7 +778,7 @@
 				 * already have a delta based on preferred
 				 * one is pointless.
 				 */
-				return 0;
+				return -1;
 		}
 		else if (!old_preferred)
 			max_size = cur_entry->delta_size-1;