DfsMidxWriter: Pass the PackIndexMerger instead of a Map of sources The first thing the writer does is putting the map into a PackIndexMerger. Let callers do that. The PackIndexMerger.Builder is more explicit than the map, we save an intermediate transformation and this enables adding midxs as input to the merger. Change-Id: I3dd0f116a7779c34b2be278d46716e306a6a6964
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/MultiPackIndex.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/MultiPackIndex.java index a7df4fa..d91f713 100644 --- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/MultiPackIndex.java +++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/MultiPackIndex.java
@@ -16,14 +16,13 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; -import java.util.LinkedHashMap; import org.eclipse.jgit.internal.storage.file.ObjectDirectory; import org.eclipse.jgit.internal.storage.file.Pack; import org.eclipse.jgit.internal.storage.file.PackFile; -import org.eclipse.jgit.internal.storage.file.PackIndex; import org.eclipse.jgit.internal.storage.midx.MultiPackIndexPrettyPrinter; import org.eclipse.jgit.internal.storage.midx.MultiPackIndexWriter; +import org.eclipse.jgit.internal.storage.midx.PackIndexMerger; import org.eclipse.jgit.internal.storage.pack.PackExt; import org.eclipse.jgit.lib.NullProgressMonitor; import org.kohsuke.args4j.Argument; @@ -86,11 +85,11 @@ private void writeMultiPackIndex() throws IOException { ObjectDirectory odb = (ObjectDirectory) db.getObjectDatabase(); - LinkedHashMap<String, PackIndex> indexes = new LinkedHashMap<>(); + PackIndexMerger.Builder builder = PackIndexMerger.builder(); for (Pack pack : odb.getPacks()) { PackFile packFile = pack.getPackFile().create(PackExt.INDEX); try { - indexes.put(packFile.getName(), pack.getIndex()); + builder.addPack(packFile.getName(), pack.getIndex()); } catch (IOException e) { throw die("Cannot open index in pack", e); } @@ -98,7 +97,7 @@ private void writeMultiPackIndex() throws IOException { MultiPackIndexWriter writer = new MultiPackIndexWriter(); try (FileOutputStream out = new FileOutputStream(midxPath)) { - writer.write(NullProgressMonitor.INSTANCE, out, indexes); + writer.write(NullProgressMonitor.INSTANCE, out, builder.build()); } catch (IOException e) { throw die("Cannot write midx " + midxPath, e); }
diff --git a/org.eclipse.jgit.test/exttst/org/eclipse/jgit/internal/storage/midx/CgitMidxCompatibilityTest.java b/org.eclipse.jgit.test/exttst/org/eclipse/jgit/internal/storage/midx/CgitMidxCompatibilityTest.java index 334e52b..3aa6d69 100644 --- a/org.eclipse.jgit.test/exttst/org/eclipse/jgit/internal/storage/midx/CgitMidxCompatibilityTest.java +++ b/org.eclipse.jgit.test/exttst/org/eclipse/jgit/internal/storage/midx/CgitMidxCompatibilityTest.java
@@ -25,13 +25,10 @@ import java.nio.file.Files; import java.util.ArrayList; import java.util.Arrays; -import java.util.HashMap; import java.util.List; -import java.util.Map; import org.eclipse.jgit.internal.storage.file.Pack; import org.eclipse.jgit.internal.storage.file.PackFile; -import org.eclipse.jgit.internal.storage.file.PackIndex; import org.eclipse.jgit.internal.storage.pack.PackExt; import org.eclipse.jgit.lib.NullProgressMonitor; import org.eclipse.jgit.test.resources.SampleDataRepositoryTestCase; @@ -93,15 +90,15 @@ public void jgit_loadsCgitMidx() } private byte[] generateJGitMidx() throws IOException { - Map<String, PackIndex> indexes = new HashMap<>(); + PackIndexMerger.Builder builder = PackIndexMerger.builder(); for (Pack pack : db.getObjectDatabase().getPacks()) { PackFile packFile = pack.getPackFile().create(PackExt.INDEX); - indexes.put(packFile.getName(), pack.getIndex()); + builder.addPack(packFile.getName(), pack.getIndex()); } MultiPackIndexWriter writer = new MultiPackIndexWriter(); ByteArrayOutputStream out = new ByteArrayOutputStream(); - writer.write(NullProgressMonitor.INSTANCE, out, indexes); + writer.write(NullProgressMonitor.INSTANCE, out, builder.build()); return out.toByteArray(); }
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/midx/MultiPackIndexLoaderTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/midx/MultiPackIndexLoaderTest.java index 3c7e27d..a59e874 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/midx/MultiPackIndexLoaderTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/midx/MultiPackIndexLoaderTest.java
@@ -17,7 +17,6 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.util.LinkedHashMap; import java.util.List; import org.eclipse.jgit.internal.storage.file.PackIndex; @@ -64,13 +63,11 @@ public void load_validFile_basic_jgit() throws Exception { new FakeIndexFactory.IndexObject( "0000000000000000000000000000000000000012", 1502))); - LinkedHashMap<String, PackIndex> packs = new LinkedHashMap<>(3); - packs.put("p1", idxOne); - packs.put("p2", idxTwo); - packs.put("p3", idxThree); + PackIndexMerger data = PackIndexMerger.builder().addPack("p1", idxOne) + .addPack("p2", idxTwo).addPack("p3", idxThree).build(); MultiPackIndexWriter writer = new MultiPackIndexWriter(); ByteArrayOutputStream out = new ByteArrayOutputStream(); - writer.write(NullProgressMonitor.INSTANCE, out, packs); + writer.write(NullProgressMonitor.INSTANCE, out, data); MultiPackIndex midx = MultiPackIndexLoader .read(new ByteArrayInputStream(out.toByteArray()));
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/midx/MultiPackIndexTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/midx/MultiPackIndexTest.java index a2c86f3..75a5a95 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/midx/MultiPackIndexTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/midx/MultiPackIndexTest.java
@@ -22,7 +22,6 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; -import java.util.LinkedHashMap; import java.util.List; import java.util.Set; @@ -114,7 +113,7 @@ public void jgit_largeOffsetChunk() throws IOException { "0000000000000000000000000000000000000002", (1L << 35)), new FakeIndexFactory.IndexObject( "0000000000000000000000000000000000000003", 13))); - LinkedHashMap<String, PackIndex> packs = orderedMapOf("p1", idxOne, + PackIndexMerger packs = midxDataFor("p1", idxOne, "p2", idxTwo); MultiPackIndexWriter writer = new MultiPackIndexWriter(); ByteArrayOutputStream out = new ByteArrayOutputStream(); @@ -145,7 +144,7 @@ public void jgit_largeOffset_noChunk() throws IOException { "0000000000000000000000000000000000000002", 501), new FakeIndexFactory.IndexObject( "0000000000000000000000000000000000000003", 13))); - LinkedHashMap<String, PackIndex> packs = orderedMapOf("p1", idxOne, + PackIndexMerger packs = midxDataFor("p1", idxOne, "p2", idxTwo); MultiPackIndexWriter writer = new MultiPackIndexWriter(); ByteArrayOutputStream out = new ByteArrayOutputStream(); @@ -182,7 +181,7 @@ public void jgit_resolve() throws IOException { // Match "32fe829a1c000000000000000000000000000010"); - LinkedHashMap<String, PackIndex> packs = orderedMapOf("p1", idxOne, + PackIndexMerger packs = midxDataFor("p1", idxOne, "p2", idxTwo); MultiPackIndexWriter writer = new MultiPackIndexWriter(); ByteArrayOutputStream out = new ByteArrayOutputStream(); @@ -226,7 +225,7 @@ public void jgit_resolve_matchLimit() throws IOException { // Match "32fe829a1c000000000000000000000000000010"); - LinkedHashMap<String, PackIndex> packs = orderedMapOf("r1", idxOne, + PackIndexMerger packs = midxDataFor("r1", idxOne, "r2", idxTwo); MultiPackIndexWriter writer = new MultiPackIndexWriter(); ByteArrayOutputStream out = new ByteArrayOutputStream(); @@ -261,7 +260,7 @@ public void jgit_resolve_noMatches() throws IOException { "bbbbbb0000000000000000000000000000000003", "32fe829a1c000000000000000000000000000010"); - LinkedHashMap<String, PackIndex> packs = orderedMapOf("p1", idxOne, + PackIndexMerger packs = midxDataFor("p1", idxOne, "p2", idxTwo); MultiPackIndexWriter writer = new MultiPackIndexWriter(); ByteArrayOutputStream out = new ByteArrayOutputStream(); @@ -292,7 +291,7 @@ public void jgit_resolve_noMatches_last() throws IOException { "bbbbbb0000000000000000000000000000000003", "32fe829a1c000000000000000000000000000010"); - LinkedHashMap<String, PackIndex> packs = orderedMapOf("p1", idxOne, + PackIndexMerger packs = midxDataFor("p1", idxOne, "p2", idxTwo); MultiPackIndexWriter writer = new MultiPackIndexWriter(); ByteArrayOutputStream out = new ByteArrayOutputStream(); @@ -314,11 +313,11 @@ public void jgit_resolve_empty() throws IOException { PackIndex idxOne = FakeIndexFactory.indexOf(List.of()); PackIndex idxTwo = FakeIndexFactory.indexOf(List.of()); - LinkedHashMap<String, PackIndex> packs = orderedMapOf("p1", idxOne, + PackIndexMerger data = midxDataFor("p1", idxOne, "p2", idxTwo); MultiPackIndexWriter writer = new MultiPackIndexWriter(); ByteArrayOutputStream out = new ByteArrayOutputStream(); - writer.write(NullProgressMonitor.INSTANCE, out, packs); + writer.write(NullProgressMonitor.INSTANCE, out, data); MultiPackIndex midx = MultiPackIndexLoader .read(new ByteArrayInputStream(out.toByteArray())); @@ -377,11 +376,11 @@ private static MultiPackIndex createMultiPackIndex() throws IOException { new FakeIndexFactory.IndexObject( "0000000000000000000000000000000000000012", 1502))); - LinkedHashMap<String, PackIndex> packs = orderedMapOf("p1", idxOne, + PackIndexMerger data = midxDataFor("p1", idxOne, "p2", idxTwo, "p3", idxThree); MultiPackIndexWriter writer = new MultiPackIndexWriter(); ByteArrayOutputStream out = new ByteArrayOutputStream(); - writer.write(NullProgressMonitor.INSTANCE, out, packs); + writer.write(NullProgressMonitor.INSTANCE, out, data); return MultiPackIndexLoader .read(new ByteArrayInputStream(out.toByteArray())); @@ -398,11 +397,11 @@ public void jgit_getObjectCount_emtpy() throws IOException { PackIndex idxOne = FakeIndexFactory.indexOf(List.of()); PackIndex idxTwo = FakeIndexFactory.indexOf(List.of()); - LinkedHashMap<String, PackIndex> packs = orderedMapOf("p1", idxOne, + PackIndexMerger data = midxDataFor("p1", idxOne, "p2", idxTwo); MultiPackIndexWriter writer = new MultiPackIndexWriter(); ByteArrayOutputStream out = new ByteArrayOutputStream(); - writer.write(NullProgressMonitor.INSTANCE, out, packs); + writer.write(NullProgressMonitor.INSTANCE, out, data); MultiPackIndex midx = MultiPackIndexLoader .read(new ByteArrayInputStream(out.toByteArray())); @@ -433,11 +432,11 @@ public void jgit_findBitmapPosition() throws IOException { new FakeIndexFactory.IndexObject( "0000000000000000000000000000000000000012", 1502))); - LinkedHashMap<String, PackIndex> packs = orderedMapOf("p1", idxOne, + PackIndexMerger data = midxDataFor("p1", idxOne, "p2", idxTwo, "p3", idxThree); MultiPackIndexWriter writer = new MultiPackIndexWriter(); ByteArrayOutputStream out = new ByteArrayOutputStream(); - writer.write(NullProgressMonitor.INSTANCE, out, packs); + writer.write(NullProgressMonitor.INSTANCE, out, data); MultiPackIndex midx = MultiPackIndexLoader .read(new ByteArrayInputStream(out.toByteArray())); @@ -495,11 +494,11 @@ public void jgit_getObjectAtBitmapPosition() throws IOException { new FakeIndexFactory.IndexObject( "0000000000000000000000000000000000000012", 1502))); - LinkedHashMap<String, PackIndex> packs = orderedMapOf("p1", idxOne, + PackIndexMerger data = midxDataFor("p1", idxOne, "p2", idxTwo, "p3", idxThree); MultiPackIndexWriter writer = new MultiPackIndexWriter(); ByteArrayOutputStream out = new ByteArrayOutputStream(); - writer.write(NullProgressMonitor.INSTANCE, out, packs); + writer.write(NullProgressMonitor.INSTANCE, out, data); MultiPackIndex midx = MultiPackIndexLoader .read(new ByteArrayInputStream(out.toByteArray())); @@ -563,11 +562,11 @@ public void jgit_iterator_emtpy() throws IOException { PackIndex idxOne = FakeIndexFactory.indexOf(List.of()); PackIndex idxTwo = FakeIndexFactory.indexOf(List.of()); - LinkedHashMap<String, PackIndex> packs = orderedMapOf("p1", idxOne, + PackIndexMerger data = midxDataFor("p1", idxOne, "p2", idxTwo); MultiPackIndexWriter writer = new MultiPackIndexWriter(); ByteArrayOutputStream out = new ByteArrayOutputStream(); - writer.write(NullProgressMonitor.INSTANCE, out, packs); + writer.write(NullProgressMonitor.INSTANCE, out, data); MultiPackIndex midx = MultiPackIndexLoader .read(new ByteArrayInputStream(out.toByteArray())); @@ -591,11 +590,11 @@ public void jgit_iterator_peek() throws IOException { new FakeIndexFactory.IndexObject( "0000000000000000000000000000000000000015", 1501))); - LinkedHashMap<String, PackIndex> packs = orderedMapOf("p1", idxOne, + PackIndexMerger data = midxDataFor("p1", idxOne, "p2", idxTwo); MultiPackIndexWriter writer = new MultiPackIndexWriter(); ByteArrayOutputStream out = new ByteArrayOutputStream(); - writer.write(NullProgressMonitor.INSTANCE, out, packs); + writer.write(NullProgressMonitor.INSTANCE, out, data); MultiPackIndex midx = MultiPackIndexLoader .read(new ByteArrayInputStream(out.toByteArray())); @@ -662,21 +661,16 @@ private static void assertEntry(MultiPackIndex.MutableEntry e, String oid, assertEquals(expectedOffset, e.packOffset.getOffset()); } - private static LinkedHashMap<String, PackIndex> orderedMapOf(String s1, - PackIndex pi1, String s2, PackIndex pi2) { - LinkedHashMap<String, PackIndex> map = new LinkedHashMap<>(2); - map.put(s1, pi1); - map.put(s2, pi2); - return map; + private static PackIndexMerger midxDataFor(String s1, PackIndex pi1, + String s2, PackIndex pi2) { + return PackIndexMerger.builder().addPack(s1, pi1).addPack(s2, pi2) + .build(); } - private static LinkedHashMap<String, PackIndex> orderedMapOf(String s1, + private static PackIndexMerger midxDataFor(String s1, PackIndex pi1, String s2, PackIndex pi2, String s3, PackIndex pi3) { - LinkedHashMap<String, PackIndex> map = new LinkedHashMap<>(3); - map.put(s1, pi1); - map.put(s2, pi2); - map.put(s3, pi3); - return map; + return PackIndexMerger.builder().addPack(s1, pi1).addPack(s2, pi2) + .addPack(s3, pi3).build(); } private static ObjectId oid(String last3chars) {
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/midx/MultiPackIndexWriterTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/midx/MultiPackIndexWriterTest.java index 5971dceb..1ca8aaf 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/midx/MultiPackIndexWriterTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/midx/MultiPackIndexWriterTest.java
@@ -23,7 +23,6 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; -import java.util.LinkedHashMap; import java.util.List; import org.eclipse.jgit.internal.storage.file.PackIndex; @@ -47,9 +46,9 @@ public void write_allSmallOffsets() throws IOException { object("0000000000000000000000000000000000000004", 1500), object("0000000000000000000000000000000000000006", 3000)); - LinkedHashMap<String, PackIndex> data = new LinkedHashMap<>(); - data.put("packname1", index1); - data.put("packname2", index2); + PackIndexMerger data = PackIndexMerger.builder() + .addPack("packname1", index1).addPack("packname2", index2) + .build(); MultiPackIndexWriter writer = new MultiPackIndexWriter(); ByteArrayOutputStream out = new ByteArrayOutputStream(); @@ -85,9 +84,9 @@ public void write_smallOffset_limit() throws IOException { object("0000000000000000000000000000000000000002", 500), object("0000000000000000000000000000000000000004", 1500), object("0000000000000000000000000000000000000006", 3000)); - LinkedHashMap<String, PackIndex> data = new LinkedHashMap<>(2); - data.put("packname1", index1); - data.put("packname2", index2); + PackIndexMerger data = PackIndexMerger.builder() + .addPack("packname1", index1).addPack("packname2", index2) + .build(); MultiPackIndexWriter writer = new MultiPackIndexWriter(); ByteArrayOutputStream out = new ByteArrayOutputStream(); @@ -122,9 +121,9 @@ public void write_largeOffset() throws IOException { object("0000000000000000000000000000000000000002", 500), object("0000000000000000000000000000000000000004", 1500), object("0000000000000000000000000000000000000006", 3000)); - LinkedHashMap<String, PackIndex> data = new LinkedHashMap<>(2); - data.put("bbbbbbbbb", index1); - data.put("aaaaaaaaa", index2); + PackIndexMerger data = PackIndexMerger.builder() + .addPack("bbbbbbbbb", index1).addPack("aaaaaaaaa", index2) + .build(); MultiPackIndexWriter writer = new MultiPackIndexWriter(); ByteArrayOutputStream out = new ByteArrayOutputStream(); @@ -159,9 +158,8 @@ public void write_largeOffset() throws IOException { public void jgit_emptyMidx() throws IOException { PackIndex idxOne = FakeIndexFactory.indexOf(List.of()); PackIndex idxTwo = FakeIndexFactory.indexOf(List.of()); - LinkedHashMap<String, PackIndex> packs = new LinkedHashMap<>(2); - packs.put("p1", idxOne); - packs.put("p2", idxTwo); + PackIndexMerger packs = PackIndexMerger.builder().addPack("p1", idxOne) + .addPack("p2", idxTwo).build(); MultiPackIndexWriter writer = new MultiPackIndexWriter(); ByteArrayOutputStream out = new ByteArrayOutputStream(); writer.write(NullProgressMonitor.INSTANCE, out, packs);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsMidxWriter.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsMidxWriter.java index 654bc30..0cdb304 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsMidxWriter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsMidxWriter.java
@@ -17,7 +17,6 @@ import java.io.IOException; import java.util.ArrayList; import java.util.HashSet; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; @@ -26,8 +25,8 @@ import org.eclipse.jgit.annotations.Nullable; import org.eclipse.jgit.internal.storage.file.PackBitmapIndexBuilder; -import org.eclipse.jgit.internal.storage.file.PackIndex; import org.eclipse.jgit.internal.storage.midx.MultiPackIndexWriter; +import org.eclipse.jgit.internal.storage.midx.PackIndexMerger; import org.eclipse.jgit.internal.storage.pack.PackBitmapCalculator; import org.eclipse.jgit.internal.storage.pack.PackBitmapIndexWriter; import org.eclipse.jgit.lib.Constants; @@ -92,11 +91,10 @@ public static DfsPackDescription writeMidx(ProgressMonitor pm, DfsObjDatabase objdb, List<DfsPackFile> packs, @Nullable DfsPackDescription base, PackConfig packConfig) throws IOException { - LinkedHashMap<String, PackIndex> inputs = new LinkedHashMap<>( - packs.size()); + PackIndexMerger.Builder dataBuilder = PackIndexMerger.builder(); try (DfsReader ctx = objdb.newReader()) { for (DfsPackFile pack : packs) { - inputs.put(pack.getPackDescription().getPackName(), + dataBuilder.addPack(pack.getPackDescription().getPackName(), pack.getPackIndex(ctx)); } } @@ -105,7 +103,8 @@ public static DfsPackDescription writeMidx(ProgressMonitor pm, try (DfsOutputStream out = objdb.writeFile(midxPackDesc, MULTI_PACK_INDEX)) { MultiPackIndexWriter w = new MultiPackIndexWriter(); - MultiPackIndexWriter.Result result = w.write(pm, out, inputs); + MultiPackIndexWriter.Result result = w.write(pm, out, + dataBuilder.build()); midxPackDesc.addFileExt(MULTI_PACK_INDEX); midxPackDesc.setFileSize(MULTI_PACK_INDEX, result.bytesWritten()); midxPackDesc.setObjectCount(result.objectCount());
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/midx/MultiPackIndexWriter.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/midx/MultiPackIndexWriter.java index 37b81cd..7c69b78 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/midx/MultiPackIndexWriter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/midx/MultiPackIndexWriter.java
@@ -35,7 +35,6 @@ import java.util.Map; import org.eclipse.jgit.internal.JGitText; -import org.eclipse.jgit.internal.storage.file.PackIndex; import org.eclipse.jgit.internal.storage.io.CancellableDigestOutputStream; import org.eclipse.jgit.internal.storage.midx.MultiPackIndex.MutableEntry; import org.eclipse.jgit.lib.ProgressMonitor; @@ -78,22 +77,15 @@ public record Result(long bytesWritten, int objectCount, * progress monitor * @param outputStream * stream to write the multipack index file - * @param inputs - * pairs of name and index for each pack to include in the - * multipack index. + * @param data + * a pack index merger with the data sources (in order) for this + * midx * @return data about the write (e.g. bytes written) * @throws IOException * Error writing to the stream */ public Result write(ProgressMonitor monitor, OutputStream outputStream, - Map<String, PackIndex> inputs) throws IOException { - // TODO(ifrade): Pass the PackIndexMerger as parameter instead of making - // a map to them make the merger. - PackIndexMerger.Builder builder = PackIndexMerger.builder(); - inputs.entrySet().stream() - .forEach(e -> builder.addPack(e.getKey(), e.getValue())); - PackIndexMerger data = builder.build(); - + PackIndexMerger data) throws IOException { // List of chunks in the order they need to be written List<ChunkHeader> chunkHeaders = createChunkHeaders(data); long expectedSize = calculateExpectedSize(chunkHeaders);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/midx/PackIndexMerger.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/midx/PackIndexMerger.java index 0f35d67..0a00885 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/midx/PackIndexMerger.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/midx/PackIndexMerger.java
@@ -30,7 +30,7 @@ * entries. The stats of the combined index are calculated in an iteration at * construction time. */ -class PackIndexMerger { +public class PackIndexMerger { private static final int LIMIT_31_BITS = (1 << 31) - 1; @@ -48,21 +48,45 @@ class PackIndexMerger { private final List<String> packnames; - static class Builder { + /** + * Builder collecting the inputs for the merger. + * <p> + * Order matters. Packs will appear in the midx in the order they are added. + */ + public static class Builder { private final List<MidxIterator> packIndexes = new ArrayList<>(); + /** + * Add a regular pack to the midx + * + * @param name + * name of the pack + * @param idx + * primary index of the pack + * @return this builder + */ public Builder addPack(String name, PackIndex idx) { packIndexes.add(MidxIterators.fromPackIndexIterator(name, idx)); return this; } + /** + * Build the merger instance + * + * @return a merger instance + */ public PackIndexMerger build() { return new PackIndexMerger( MidxIterators.dedup(MidxIterators.join(packIndexes))); } } + /** + * Create a builder + * + * @return an empty builder + */ public static Builder builder() { return new Builder(); } @@ -78,7 +102,8 @@ private PackIndexMerger(MidxIterator midxIterator) { this.packnames = midxIterator.getPackNames(); objectsPerPack = new int[packnames.size()]; - // Iterate for duplicates + // Iterate for duplicates and counts that we need to build the chunk + // headers. int objectCount = 0; boolean hasLargeOffsets = false; int over31bits = 0; @@ -97,6 +122,8 @@ private PackIndexMerger(MidxIterator midxIterator) { lastSeen.fromObjectId(entry.oid); objectCount++; + // TODO(ifrade): we can calculate the fanout table already here. + // It saves an iteration over all objects for only 1Kb of memory objectsPerPack[entry.getPackId()]++; } uniqueObjectCount = objectCount;