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