pgm.MultiPackIndex: Move writing code to MidxWriter This mirrors DfsMidxWriter and paves the way to add bitmap writing. Change-Id: I1587ade397fdebbaab50de395237ddd06a6a6964
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 d91f713..81fc0e8 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
@@ -13,18 +13,13 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; -import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; +import org.eclipse.jgit.internal.storage.file.MidxWriter; 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.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.eclipse.jgit.lib.TextProgressMonitor; import org.kohsuke.args4j.Argument; import org.kohsuke.args4j.Option; @@ -84,22 +79,7 @@ private void writeMultiPackIndex() throws IOException { errw.println("Writing " + midx.getAbsolutePath()); ObjectDirectory odb = (ObjectDirectory) db.getObjectDatabase(); - - PackIndexMerger.Builder builder = PackIndexMerger.builder(); - for (Pack pack : odb.getPacks()) { - PackFile packFile = pack.getPackFile().create(PackExt.INDEX); - try { - builder.addPack(packFile.getName(), pack.getIndex()); - } catch (IOException e) { - throw die("Cannot open index in pack", e); - } - } - - MultiPackIndexWriter writer = new MultiPackIndexWriter(); - try (FileOutputStream out = new FileOutputStream(midxPath)) { - writer.write(NullProgressMonitor.INSTANCE, out, builder.build()); - } catch (IOException e) { - throw die("Cannot write midx " + midxPath, e); - } + MidxWriter.writeMidx(new TextProgressMonitor(errw), odb.getPacks(), + midx); } }
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/MidxWriter.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/MidxWriter.java new file mode 100644 index 0000000..91f60b6 --- /dev/null +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/MidxWriter.java
@@ -0,0 +1,61 @@ +/* + * Copyright (C) 2026, Google LLC + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Distribution License v. 1.0 which is available at + * https://www.eclipse.org/org/documents/edl-v10.php. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +package org.eclipse.jgit.internal.storage.file; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.Collection; +import java.util.Comparator; + +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.ProgressMonitor; + +/** + * Helper to write multipack indexes. + */ +public class MidxWriter { + + /** + * Write a mdix over the packs + * + * @param pm + * a progress monitor + * @param packs + * packs to cover with the midx + * @param midxOut + * file to write the resulting midx + * @throws IOException + * an error reading any of the input packs or indexes + */ + public static void writeMidx(ProgressMonitor pm, Collection<Pack> packs, + File midxOut) throws IOException { + PackIndexMerger.Builder builder = PackIndexMerger.builder(); + builder.setProgressMonitor(pm); + + Collection<Pack> packList = packs.stream() + .sorted(Comparator.comparing(Pack::getPackName)).toList(); + pm.beginTask("Adding packs to midx", packList.size()); + for (Pack pack : packList) { + PackFile packFile = pack.getPackFile().create(PackExt.INDEX); + builder.addPack(packFile.getName(), pack.getIndex()); + pm.update(1); + } + pm.endTask(); + + MultiPackIndexWriter writer = new MultiPackIndexWriter(); + try (FileOutputStream out = new FileOutputStream( + midxOut.getAbsolutePath())) { + writer.write(pm, out, builder.build()); + } + } +}