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());
}