Merge "MidxPackList: getAllPlainPacks returns object-lookup order"
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/MidxPackListTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/MidxPackListTest.java
index 7879af9..217f587 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/MidxPackListTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/MidxPackListTest.java
@@ -44,7 +44,7 @@ public void getAllPlainPacks_onlyMidx() {
 		DfsPackFileMidx midx = packPool.midx("midx", null, "a", "b", "c");
 
 		MidxPackList packList = MidxPackList.create(midx);
-		assertEquals(List.of(a, b, c), packList.getAllPlainPacks());
+		assertEquals(List.of(c, b, a), packList.getAllPlainPacks());
 	}
 
 	@Test
@@ -56,7 +56,7 @@ public void getAllPlainPacks_midxPlusOne() {
 		DfsPackFile d = packPool.pack("d");
 
 		MidxPackList packList = MidxPackList.create(d, midx);
-		assertEquals(List.of(d, a, b, c), packList.getAllPlainPacks());
+		assertEquals(List.of(d, c, b, a), packList.getAllPlainPacks());
 	}
 
 	@Test
@@ -74,7 +74,7 @@ public void getAllPlainPacks_nestedMidx() {
 				"f");
 
 		MidxPackList packList = MidxPackList.create(midxTip);
-		assertEquals(List.of(e, f, c, d, a, b), packList.getAllPlainPacks());
+		assertEquals(List.of(f, e, d, c, b, a), packList.getAllPlainPacks());
 	}
 
 	@Test
@@ -304,9 +304,9 @@ public void getPlainPacksNotCoveredBy_midxChain() {
 				"f");
 
 		MidxPackList packList = MidxPackList.create(midxTip);
-		assertEquals(List.of(e, f, c, d),
+		assertEquals(List.of(f, e, d, c),
 				packList.getPlainPacksNotCoveredBy(midxBase));
-		assertEquals(List.of(e, f),
+		assertEquals(List.of(f, e),
 				packList.getPlainPacksNotCoveredBy(midxMiddle));
 		assertEquals(List.of(), packList.getPlainPacksNotCoveredBy(midxTip));
 	}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/MidxPackList.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/MidxPackList.java
index a6c2b76..70c9b85 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/MidxPackList.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/MidxPackList.java
@@ -53,6 +53,11 @@ private MidxPackList(List<DfsPackFile> packs) {
 
 	/**
 	 * Get all plain packs in the list, either top-level or inside midxs
+	 * <p>
+	 * Inside midx, the packs are in reverse lookup order. This code restores
+	 * their original order. i.e. the list with packs [INSERT, midx(COMPACT-2,
+	 * COMPACT-3), midx(GC, COMPACT-1)] becomes [INSERT, COMPACT-3, COMPACT-2,
+	 * COMPACT-1, GC].
 	 *
 	 * @return a list of all "real" packs in this pack list, either top level or
 	 *         inside midxs.
@@ -63,7 +68,11 @@ public List<DfsPackFile> getAllPlainPacks() {
 		while (!pending.isEmpty()) {
 			DfsPackFile pack = pending.poll();
 			if (pack instanceof DfsPackFileMidx midxPack) {
-				plainPacks.addAll(midxPack.getCoveredPacks());
+				// Midx order is the reverse of object lookup order
+				ArrayList<DfsPackFile> coveredPacks = new ArrayList<>(
+						midxPack.getCoveredPacks());
+				Collections.reverse(coveredPacks);
+				plainPacks.addAll(coveredPacks);
 				if (midxPack.getMultipackIndexBase() != null) {
 					pending.add(midxPack.getMultipackIndexBase());
 				}