Merge "Cluster UNREACHABLE_GARBAGE packs at the end of the search list"
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsObjDatabase.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsObjDatabase.java
index 3163955..da67221 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsObjDatabase.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsObjDatabase.java
@@ -65,7 +65,7 @@ public abstract class DfsObjDatabase extends ObjectDatabase {
 	/** Sources for a pack file. */
 	public static enum PackSource {
 		/** The pack is created by ObjectInserter due to local activity. */
-		INSERT,
+		INSERT(0),
 
 		/**
 		 * The pack is created by PackParser due to a network event.
@@ -76,7 +76,7 @@ public static enum PackSource {
 		 * storage layout preferred by this version. Received packs are likely
 		 * to be either compacted or garbage collected in the future.
 		 */
-		RECEIVE,
+		RECEIVE(0),
 
 		/**
 		 * Pack was created by Git garbage collection by this implementation.
@@ -87,7 +87,7 @@ public static enum PackSource {
 		 *
 		 * @see DfsGarbageCollector
 		 */
-		GC,
+		GC(1),
 
 		/**
 		 * The pack was created by compacting multiple packs together.
@@ -98,7 +98,7 @@ public static enum PackSource {
 		 *
 		 * @see DfsPackCompactor
 		 */
-		COMPACT,
+		COMPACT(1),
 
 		/**
 		 * Pack was created by Git garbage collection.
@@ -107,7 +107,13 @@ public static enum PackSource {
 		 * last GC pass. It is retained in a new pack until it is safe to prune
 		 * these objects from the repository.
 		 */
-		UNREACHABLE_GARBAGE;
+		UNREACHABLE_GARBAGE(2);
+
+		final int category;
+
+		PackSource(int category) {
+			this.category = category;
+		}
 	}
 
 	private final AtomicReference<PackList> packList;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsPackDescription.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsPackDescription.java
index 2aa81d9..746a64a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsPackDescription.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsPackDescription.java
@@ -303,6 +303,15 @@ public boolean equals(Object b) {
 	 *            the other pack.
 	 */
 	public int compareTo(DfsPackDescription b) {
+		// Cluster by PackSource, pushing UNREACHABLE_GARBAGE to the end.
+		PackSource as = getPackSource();
+		PackSource bs = b.getPackSource();
+		if (as != null && bs != null) {
+			int cmp = as.category - bs.category;
+			if (cmp != 0)
+				return cmp;
+		}
+
 		// Newer packs should sort first.
 		int cmp = Long.signum(b.getLastModified() - getLastModified());
 		if (cmp != 0)