public inbox for git@vger.kernel.org 
 help / color / mirror / Atom feed
From: Taylor Blau <me@ttaylorr•com>
To: git@vger•kernel.org
Cc: Jeff King <peff@peff•net>, Junio C Hamano <gitster@pobox•com>,
	Elijah Newren <newren@gmail•com>, Patrick Steinhardt <ps@pks•im>,
	Justin Tobler <jltobler@gmail•com>
Subject: [PATCH v2 39/49] repack: 'write_midx_included_packs' API from the builtin
Date: Wed, 15 Oct 2025 18:29:13 -0400	[thread overview]
Message-ID: <794122266d64ec8fbd21532b0ab080cdf8fc6fa7.1760567210.git.me@ttaylorr.com> (raw)
In-Reply-To: <cover.1760567210.git.me@ttaylorr.com>

Now that we have sufficiently cleaned up the write_midx_included_packs()
function, we can move it (along with the struct repack_write_midx_opts)
out of the builtin, and into the repack.h header.

Since this function (and the static ones that it depends on) are
MIDX-specific details of the repacking process, move them to the
repack-midx.c compilation unit instead of the general repack.c one.

Signed-off-by: Taylor Blau <me@ttaylorr•com>
---
 builtin/repack.c | 305 -----------------------------------------------
 repack-midx.c    | 295 +++++++++++++++++++++++++++++++++++++++++++++
 repack.h         |  12 ++
 3 files changed, 307 insertions(+), 305 deletions(-)

diff --git a/builtin/repack.c b/builtin/repack.c
index fad10be42a..2f49a18283 100644
--- a/builtin/repack.c
+++ b/builtin/repack.c
@@ -107,311 +107,6 @@ static int repack_config(const char *var, const char *value,
 	return git_default_config(var, value, ctx, cb);
 }
 
-struct repack_write_midx_opts {
-	struct existing_packs *existing;
-	struct pack_geometry *geometry;
-	struct string_list *names;
-	const char *refs_snapshot;
-	const char *packdir;
-	int show_progress;
-	int write_bitmaps;
-	int midx_must_contain_cruft;
-};
-
-static int midx_has_unknown_packs(struct string_list *include,
-				  struct pack_geometry *geometry,
-				  struct existing_packs *existing)
-{
-	struct string_list_item *item;
-
-	string_list_sort(include);
-
-	for_each_string_list_item(item, &existing->midx_packs) {
-		const char *pack_name = item->string;
-
-		/*
-		 * Determine whether or not each MIDX'd pack from the existing
-		 * MIDX (if any) is represented in the new MIDX. For each pack
-		 * in the MIDX, it must either be:
-		 *
-		 *  - In the "include" list of packs to be included in the new
-		 *    MIDX. Note this function is called before the include
-		 *    list is populated with any cruft pack(s).
-		 *
-		 *  - Below the geometric split line (if using pack geometry),
-		 *    indicating that the pack won't be included in the new
-		 *    MIDX, but its contents were rolled up as part of the
-		 *    geometric repack.
-		 *
-		 *  - In the existing non-kept packs list (if not using pack
-		 *    geometry), and marked as non-deleted.
-		 */
-		if (string_list_has_string(include, pack_name)) {
-			continue;
-		} else if (geometry) {
-			struct strbuf buf = STRBUF_INIT;
-			uint32_t j;
-
-			for (j = 0; j < geometry->split; j++) {
-				strbuf_reset(&buf);
-				strbuf_addstr(&buf, pack_basename(geometry->pack[j]));
-				strbuf_strip_suffix(&buf, ".pack");
-				strbuf_addstr(&buf, ".idx");
-
-				if (!strcmp(pack_name, buf.buf)) {
-					strbuf_release(&buf);
-					break;
-				}
-			}
-
-			strbuf_release(&buf);
-
-			if (j < geometry->split)
-				continue;
-		} else {
-			struct string_list_item *item;
-
-			item = string_list_lookup(&existing->non_kept_packs,
-						  pack_name);
-			if (item && !existing_pack_is_marked_for_deletion(item))
-				continue;
-		}
-
-		/*
-		 * If we got to this point, the MIDX includes some pack that we
-		 * don't know about.
-		 */
-		return 1;
-	}
-
-	return 0;
-}
-
-static void midx_included_packs(struct string_list *include,
-				struct repack_write_midx_opts *opts)
-{
-	struct existing_packs *existing = opts->existing;
-	struct pack_geometry *geometry = opts->geometry;
-	struct string_list *names = opts->names;
-	struct string_list_item *item;
-	struct strbuf buf = STRBUF_INIT;
-
-	for_each_string_list_item(item, &existing->kept_packs) {
-		strbuf_reset(&buf);
-		strbuf_addf(&buf, "%s.idx", item->string);
-		string_list_insert(include, buf.buf);
-	}
-
-	for_each_string_list_item(item, names) {
-		strbuf_reset(&buf);
-		strbuf_addf(&buf, "pack-%s.idx", item->string);
-		string_list_insert(include, buf.buf);
-	}
-
-	if (geometry->split_factor) {
-		uint32_t i;
-
-		for (i = geometry->split; i < geometry->pack_nr; i++) {
-			struct packed_git *p = geometry->pack[i];
-
-			/*
-			 * The multi-pack index never refers to packfiles part
-			 * of an alternate object database, so we skip these.
-			 * While git-multi-pack-index(1) would silently ignore
-			 * them anyway, this allows us to skip executing the
-			 * command completely when we have only non-local
-			 * packfiles.
-			 */
-			if (!p->pack_local)
-				continue;
-
-			strbuf_reset(&buf);
-			strbuf_addstr(&buf, pack_basename(p));
-			strbuf_strip_suffix(&buf, ".pack");
-			strbuf_addstr(&buf, ".idx");
-
-			string_list_insert(include, buf.buf);
-		}
-	} else {
-		for_each_string_list_item(item, &existing->non_kept_packs) {
-			if (existing_pack_is_marked_for_deletion(item))
-				continue;
-
-			strbuf_reset(&buf);
-			strbuf_addf(&buf, "%s.idx", item->string);
-			string_list_insert(include, buf.buf);
-		}
-	}
-
-	if (opts->midx_must_contain_cruft ||
-	    midx_has_unknown_packs(include, geometry, existing)) {
-		/*
-		 * If there are one or more unknown pack(s) present (see
-		 * midx_has_unknown_packs() for what makes a pack
-		 * "unknown") in the MIDX before the repack, keep them
-		 * as they may be required to form a reachability
-		 * closure if the MIDX is bitmapped.
-		 *
-		 * For example, a cruft pack can be required to form a
-		 * reachability closure if the MIDX is bitmapped and one
-		 * or more of the bitmap's selected commits reaches a
-		 * once-cruft object that was later made reachable.
-		 */
-		for_each_string_list_item(item, &existing->cruft_packs) {
-			/*
-			 * When doing a --geometric repack, there is no
-			 * need to check for deleted packs, since we're
-			 * by definition not doing an ALL_INTO_ONE
-			 * repack (hence no packs will be deleted).
-			 * Otherwise we must check for and exclude any
-			 * packs which are enqueued for deletion.
-			 *
-			 * So we could omit the conditional below in the
-			 * --geometric case, but doing so is unnecessary
-			 *  since no packs are marked as pending
-			 *  deletion (since we only call
-			 *  `existing_packs_mark_for_deletion()` when
-			 *  doing an all-into-one repack).
-			 */
-			if (existing_pack_is_marked_for_deletion(item))
-				continue;
-
-			strbuf_reset(&buf);
-			strbuf_addf(&buf, "%s.idx", item->string);
-			string_list_insert(include, buf.buf);
-		}
-	} else {
-		/*
-		 * Modern versions of Git (with the appropriate
-		 * configuration setting) will write new copies of
-		 * once-cruft objects when doing a --geometric repack.
-		 *
-		 * If the MIDX has no cruft pack, new packs written
-		 * during a --geometric repack will not rely on the
-		 * cruft pack to form a reachability closure, so we can
-		 * avoid including them in the MIDX in that case.
-		 */
-		;
-	}
-
-	strbuf_release(&buf);
-}
-
-static void remove_redundant_bitmaps(struct string_list *include,
-				     const char *packdir)
-{
-	struct strbuf path = STRBUF_INIT;
-	struct string_list_item *item;
-	size_t packdir_len;
-
-	strbuf_addstr(&path, packdir);
-	strbuf_addch(&path, '/');
-	packdir_len = path.len;
-
-	/*
-	 * Remove any pack bitmaps corresponding to packs which are now
-	 * included in the MIDX.
-	 */
-	for_each_string_list_item(item, include) {
-		strbuf_addstr(&path, item->string);
-		strbuf_strip_suffix(&path, ".idx");
-		strbuf_addstr(&path, ".bitmap");
-
-		if (unlink(path.buf) && errno != ENOENT)
-			warning_errno(_("could not remove stale bitmap: %s"),
-				      path.buf);
-
-		strbuf_setlen(&path, packdir_len);
-	}
-	strbuf_release(&path);
-}
-
-static int write_midx_included_packs(struct repack_write_midx_opts *opts)
-{
-	struct child_process cmd = CHILD_PROCESS_INIT;
-	struct string_list include = STRING_LIST_INIT_DUP;
-	struct string_list_item *item;
-	struct packed_git *preferred = pack_geometry_preferred_pack(opts->geometry);
-	FILE *in;
-	int ret = 0;
-
-	midx_included_packs(&include, opts);
-	if (!include.nr)
-		goto done;
-
-	cmd.in = -1;
-	cmd.git_cmd = 1;
-
-	strvec_push(&cmd.args, "multi-pack-index");
-	strvec_pushl(&cmd.args, "write", "--stdin-packs", NULL);
-
-	if (opts->show_progress)
-		strvec_push(&cmd.args, "--progress");
-	else
-		strvec_push(&cmd.args, "--no-progress");
-
-	if (opts->write_bitmaps)
-		strvec_push(&cmd.args, "--bitmap");
-
-	if (preferred)
-		strvec_pushf(&cmd.args, "--preferred-pack=%s",
-			     pack_basename(preferred));
-	else if (opts->names->nr) {
-		/* The largest pack was repacked, meaning that either
-		 * one or two packs exist depending on whether the
-		 * repository has a cruft pack or not.
-		 *
-		 * Select the non-cruft one as preferred to encourage
-		 * pack-reuse among packs containing reachable objects
-		 * over unreachable ones.
-		 *
-		 * (Note we could write multiple packs here if
-		 * `--max-pack-size` was given, but any one of them
-		 * will suffice, so pick the first one.)
-		 */
-		for_each_string_list_item(item, opts->names) {
-			struct generated_pack *pack = item->util;
-			if (generated_pack_has_ext(pack, ".mtimes"))
-				continue;
-
-			strvec_pushf(&cmd.args, "--preferred-pack=pack-%s.pack",
-				     item->string);
-			break;
-		}
-	} else {
-		/*
-		 * No packs were kept, and no packs were written. The
-		 * only thing remaining are .keep packs (unless
-		 * --pack-kept-objects was given).
-		 *
-		 * Set the `--preferred-pack` arbitrarily here.
-		 */
-		;
-	}
-
-	if (opts->refs_snapshot)
-		strvec_pushf(&cmd.args, "--refs-snapshot=%s",
-			     opts->refs_snapshot);
-
-	ret = start_command(&cmd);
-	if (ret)
-		goto done;
-
-	in = xfdopen(cmd.in, "w");
-	for_each_string_list_item(item, &include)
-		fprintf(in, "%s\n", item->string);
-	fclose(in);
-
-	ret = finish_command(&cmd);
-done:
-	if (!ret && opts->write_bitmaps)
-		remove_redundant_bitmaps(&include, opts->packdir);
-
-	string_list_clear(&include, 0);
-
-	return ret;
-}
-
 static int finish_pack_objects_cmd(const struct git_hash_algo *algop,
 				   struct child_process *cmd,
 				   struct string_list *names,
diff --git a/repack-midx.c b/repack-midx.c
index 354df729a5..6f6202c5bc 100644
--- a/repack-midx.c
+++ b/repack-midx.c
@@ -6,6 +6,7 @@
 #include "oidset.h"
 #include "pack-bitmap.h"
 #include "refs.h"
+#include "run-command.h"
 #include "tempfile.h"
 
 struct midx_snapshot_ref_data {
@@ -75,3 +76,297 @@ void midx_snapshot_refs(struct repository *repo, struct tempfile *f)
 
 	oidset_clear(&data.seen);
 }
+
+static int midx_has_unknown_packs(struct string_list *include,
+				  struct pack_geometry *geometry,
+				  struct existing_packs *existing)
+{
+	struct string_list_item *item;
+
+	string_list_sort(include);
+
+	for_each_string_list_item(item, &existing->midx_packs) {
+		const char *pack_name = item->string;
+
+		/*
+		 * Determine whether or not each MIDX'd pack from the existing
+		 * MIDX (if any) is represented in the new MIDX. For each pack
+		 * in the MIDX, it must either be:
+		 *
+		 *  - In the "include" list of packs to be included in the new
+		 *    MIDX. Note this function is called before the include
+		 *    list is populated with any cruft pack(s).
+		 *
+		 *  - Below the geometric split line (if using pack geometry),
+		 *    indicating that the pack won't be included in the new
+		 *    MIDX, but its contents were rolled up as part of the
+		 *    geometric repack.
+		 *
+		 *  - In the existing non-kept packs list (if not using pack
+		 *    geometry), and marked as non-deleted.
+		 */
+		if (string_list_has_string(include, pack_name)) {
+			continue;
+		} else if (geometry) {
+			struct strbuf buf = STRBUF_INIT;
+			uint32_t j;
+
+			for (j = 0; j < geometry->split; j++) {
+				strbuf_reset(&buf);
+				strbuf_addstr(&buf, pack_basename(geometry->pack[j]));
+				strbuf_strip_suffix(&buf, ".pack");
+				strbuf_addstr(&buf, ".idx");
+
+				if (!strcmp(pack_name, buf.buf)) {
+					strbuf_release(&buf);
+					break;
+				}
+			}
+
+			strbuf_release(&buf);
+
+			if (j < geometry->split)
+				continue;
+		} else {
+			struct string_list_item *item;
+
+			item = string_list_lookup(&existing->non_kept_packs,
+						  pack_name);
+			if (item && !existing_pack_is_marked_for_deletion(item))
+				continue;
+		}
+
+		/*
+		 * If we got to this point, the MIDX includes some pack that we
+		 * don't know about.
+		 */
+		return 1;
+	}
+
+	return 0;
+}
+
+static void midx_included_packs(struct string_list *include,
+				struct repack_write_midx_opts *opts)
+{
+	struct existing_packs *existing = opts->existing;
+	struct pack_geometry *geometry = opts->geometry;
+	struct string_list *names = opts->names;
+	struct string_list_item *item;
+	struct strbuf buf = STRBUF_INIT;
+
+	for_each_string_list_item(item, &existing->kept_packs) {
+		strbuf_reset(&buf);
+		strbuf_addf(&buf, "%s.idx", item->string);
+		string_list_insert(include, buf.buf);
+	}
+
+	for_each_string_list_item(item, names) {
+		strbuf_reset(&buf);
+		strbuf_addf(&buf, "pack-%s.idx", item->string);
+		string_list_insert(include, buf.buf);
+	}
+
+	if (geometry->split_factor) {
+		uint32_t i;
+
+		for (i = geometry->split; i < geometry->pack_nr; i++) {
+			struct packed_git *p = geometry->pack[i];
+
+			/*
+			 * The multi-pack index never refers to packfiles part
+			 * of an alternate object database, so we skip these.
+			 * While git-multi-pack-index(1) would silently ignore
+			 * them anyway, this allows us to skip executing the
+			 * command completely when we have only non-local
+			 * packfiles.
+			 */
+			if (!p->pack_local)
+				continue;
+
+			strbuf_reset(&buf);
+			strbuf_addstr(&buf, pack_basename(p));
+			strbuf_strip_suffix(&buf, ".pack");
+			strbuf_addstr(&buf, ".idx");
+
+			string_list_insert(include, buf.buf);
+		}
+	} else {
+		for_each_string_list_item(item, &existing->non_kept_packs) {
+			if (existing_pack_is_marked_for_deletion(item))
+				continue;
+
+			strbuf_reset(&buf);
+			strbuf_addf(&buf, "%s.idx", item->string);
+			string_list_insert(include, buf.buf);
+		}
+	}
+
+	if (opts->midx_must_contain_cruft ||
+	    midx_has_unknown_packs(include, geometry, existing)) {
+		/*
+		 * If there are one or more unknown pack(s) present (see
+		 * midx_has_unknown_packs() for what makes a pack
+		 * "unknown") in the MIDX before the repack, keep them
+		 * as they may be required to form a reachability
+		 * closure if the MIDX is bitmapped.
+		 *
+		 * For example, a cruft pack can be required to form a
+		 * reachability closure if the MIDX is bitmapped and one
+		 * or more of the bitmap's selected commits reaches a
+		 * once-cruft object that was later made reachable.
+		 */
+		for_each_string_list_item(item, &existing->cruft_packs) {
+			/*
+			 * When doing a --geometric repack, there is no
+			 * need to check for deleted packs, since we're
+			 * by definition not doing an ALL_INTO_ONE
+			 * repack (hence no packs will be deleted).
+			 * Otherwise we must check for and exclude any
+			 * packs which are enqueued for deletion.
+			 *
+			 * So we could omit the conditional below in the
+			 * --geometric case, but doing so is unnecessary
+			 *  since no packs are marked as pending
+			 *  deletion (since we only call
+			 *  `existing_packs_mark_for_deletion()` when
+			 *  doing an all-into-one repack).
+			 */
+			if (existing_pack_is_marked_for_deletion(item))
+				continue;
+
+			strbuf_reset(&buf);
+			strbuf_addf(&buf, "%s.idx", item->string);
+			string_list_insert(include, buf.buf);
+		}
+	} else {
+		/*
+		 * Modern versions of Git (with the appropriate
+		 * configuration setting) will write new copies of
+		 * once-cruft objects when doing a --geometric repack.
+		 *
+		 * If the MIDX has no cruft pack, new packs written
+		 * during a --geometric repack will not rely on the
+		 * cruft pack to form a reachability closure, so we can
+		 * avoid including them in the MIDX in that case.
+		 */
+		;
+	}
+
+	strbuf_release(&buf);
+}
+
+static void remove_redundant_bitmaps(struct string_list *include,
+				     const char *packdir)
+{
+	struct strbuf path = STRBUF_INIT;
+	struct string_list_item *item;
+	size_t packdir_len;
+
+	strbuf_addstr(&path, packdir);
+	strbuf_addch(&path, '/');
+	packdir_len = path.len;
+
+	/*
+	 * Remove any pack bitmaps corresponding to packs which are now
+	 * included in the MIDX.
+	 */
+	for_each_string_list_item(item, include) {
+		strbuf_addstr(&path, item->string);
+		strbuf_strip_suffix(&path, ".idx");
+		strbuf_addstr(&path, ".bitmap");
+
+		if (unlink(path.buf) && errno != ENOENT)
+			warning_errno(_("could not remove stale bitmap: %s"),
+				      path.buf);
+
+		strbuf_setlen(&path, packdir_len);
+	}
+	strbuf_release(&path);
+}
+
+int write_midx_included_packs(struct repack_write_midx_opts *opts)
+{
+	struct child_process cmd = CHILD_PROCESS_INIT;
+	struct string_list include = STRING_LIST_INIT_DUP;
+	struct string_list_item *item;
+	struct packed_git *preferred = pack_geometry_preferred_pack(opts->geometry);
+	FILE *in;
+	int ret = 0;
+
+	midx_included_packs(&include, opts);
+	if (!include.nr)
+		goto done;
+
+	cmd.in = -1;
+	cmd.git_cmd = 1;
+
+	strvec_push(&cmd.args, "multi-pack-index");
+	strvec_pushl(&cmd.args, "write", "--stdin-packs", NULL);
+
+	if (opts->show_progress)
+		strvec_push(&cmd.args, "--progress");
+	else
+		strvec_push(&cmd.args, "--no-progress");
+
+	if (opts->write_bitmaps)
+		strvec_push(&cmd.args, "--bitmap");
+
+	if (preferred)
+		strvec_pushf(&cmd.args, "--preferred-pack=%s",
+			     pack_basename(preferred));
+	else if (opts->names->nr) {
+		/* The largest pack was repacked, meaning that either
+		 * one or two packs exist depending on whether the
+		 * repository has a cruft pack or not.
+		 *
+		 * Select the non-cruft one as preferred to encourage
+		 * pack-reuse among packs containing reachable objects
+		 * over unreachable ones.
+		 *
+		 * (Note we could write multiple packs here if
+		 * `--max-pack-size` was given, but any one of them
+		 * will suffice, so pick the first one.)
+		 */
+		for_each_string_list_item(item, opts->names) {
+			struct generated_pack *pack = item->util;
+			if (generated_pack_has_ext(pack, ".mtimes"))
+				continue;
+
+			strvec_pushf(&cmd.args, "--preferred-pack=pack-%s.pack",
+				     item->string);
+			break;
+		}
+	} else {
+		/*
+		 * No packs were kept, and no packs were written. The
+		 * only thing remaining are .keep packs (unless
+		 * --pack-kept-objects was given).
+		 *
+		 * Set the `--preferred-pack` arbitrarily here.
+		 */
+		;
+	}
+
+	if (opts->refs_snapshot)
+		strvec_pushf(&cmd.args, "--refs-snapshot=%s",
+			     opts->refs_snapshot);
+
+	ret = start_command(&cmd);
+	if (ret)
+		goto done;
+
+	in = xfdopen(cmd.in, "w");
+	for_each_string_list_item(item, &include)
+		fprintf(in, "%s\n", item->string);
+	fclose(in);
+
+	ret = finish_command(&cmd);
+done:
+	if (!ret && opts->write_bitmaps)
+		remove_redundant_bitmaps(&include, opts->packdir);
+
+	string_list_clear(&include, 0);
+
+	return ret;
+}
diff --git a/repack.h b/repack.h
index 6aa5b4e0f0..25a31ac0a0 100644
--- a/repack.h
+++ b/repack.h
@@ -101,6 +101,18 @@ void pack_geometry_release(struct pack_geometry *geometry);
 
 struct tempfile;
 
+struct repack_write_midx_opts {
+	struct existing_packs *existing;
+	struct pack_geometry *geometry;
+	struct string_list *names;
+	const char *refs_snapshot;
+	const char *packdir;
+	int show_progress;
+	int write_bitmaps;
+	int midx_must_contain_cruft;
+};
+
 void midx_snapshot_refs(struct repository *repo, struct tempfile *f);
+int write_midx_included_packs(struct repack_write_midx_opts *opts);
 
 #endif /* REPACK_H */
-- 
2.51.0.540.ga7423965ad8


  parent reply	other threads:[~2025-10-15 22:29 UTC|newest]

Thread overview: 163+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-09-28 22:07 [PATCH 00/49] repack: prepare for incremental MIDX-based repacking Taylor Blau
2025-09-28 22:07 ` [PATCH 01/49] builtin/repack.c: avoid "the_repository" in `cmd_repack()` Taylor Blau
2025-09-28 22:07 ` [PATCH 02/49] builtin/repack.c: avoid "the_repository" in existing packs API Taylor Blau
2025-10-10  5:19   ` Jeff King
2025-10-10 22:48     ` Taylor Blau
2025-09-28 22:07 ` [PATCH 03/49] builtin/repack.c: avoid "the_repository" when taking a ref snapshot Taylor Blau
2025-09-28 22:07 ` [PATCH 04/49] builtin/repack.c: avoid "the_repository" when removing packs Taylor Blau
2025-10-10  5:22   ` Jeff King
2025-10-10 22:49     ` Taylor Blau
2025-09-28 22:07 ` [PATCH 05/49] builtin/repack.c: avoid "the_repository" when repacking promisor objects Taylor Blau
2025-09-28 22:07 ` [PATCH 06/49] builtin/repack.c: avoid "the_hash_algo" when deleting packs Taylor Blau
2025-09-28 22:07 ` [PATCH 07/49] builtin/repack.c: avoid "the_hash_algo" in `write_oid()` Taylor Blau
2025-09-29 23:21   ` Patrick Steinhardt
2025-10-07 20:17     ` Taylor Blau
2025-09-28 22:07 ` [PATCH 08/49] builtin/repack: avoid "the_hash_algo" in `repack_promisor_objects()` Taylor Blau
2025-09-28 22:07 ` [PATCH 09/49] builtin/repack.c: avoid "the_hash_algo" in `finish_pack_objects_cmd()` Taylor Blau
2025-10-10  5:31   ` Jeff King
2025-10-10 22:51     ` Taylor Blau
2025-09-28 22:07 ` [PATCH 10/49] builtin/repack.c: avoid using `hash_to_hex()` in pack geometry Taylor Blau
2025-09-29 23:21   ` Patrick Steinhardt
2025-09-28 22:07 ` [PATCH 11/49] repack: introduce new compilation unit Taylor Blau
2025-10-10  5:48   ` Jeff King
2025-10-10 22:52     ` Taylor Blau
2025-09-28 22:07 ` [PATCH 12/49] builtin/repack.c: pass both pack_objects args to repack_config Taylor Blau
2025-09-29 23:21   ` Patrick Steinhardt
2025-09-28 22:08 ` [PATCH 13/49] repack: move 'delta_base_offset' to 'struct pack_objects_args' Taylor Blau
2025-10-10  5:54   ` Jeff King
2025-10-10 22:54     ` Taylor Blau
2025-09-28 22:08 ` [PATCH 14/49] repack: remove 'prepare_pack_objects' from the builtin Taylor Blau
2025-09-28 22:08 ` [PATCH 15/49] builtin/repack.c: rename many 'struct existing_packs' functions Taylor Blau
2025-09-28 22:08 ` [PATCH 16/49] repack: remove 'remove_redundant_pack' from the builtin Taylor Blau
2025-09-28 22:08 ` [PATCH 17/49] builtin/repack.c: pass "packdir" when removing packs Taylor Blau
2025-09-29 23:21   ` Patrick Steinhardt
2025-10-07 20:23     ` Taylor Blau
2025-10-10  6:04   ` Jeff King
2025-10-10 22:56     ` Taylor Blau
2025-09-28 22:08 ` [PATCH 18/49] builtin/repack.c: avoid unnecessary numeric casts in existing_packs Taylor Blau
2025-09-28 22:08 ` [PATCH 19/49] repack: remove 'existing_packs' API from the builtin Taylor Blau
2025-09-29 23:21   ` Patrick Steinhardt
2025-10-07 20:24     ` Taylor Blau
2025-10-10  6:08   ` Jeff King
2025-10-10 22:57     ` Taylor Blau
2025-09-28 22:08 ` [PATCH 20/49] builtin/repack.c: rename "struct generated_pack_data" Taylor Blau
2025-09-28 22:08 ` [PATCH 21/49] builtin/repack.c: factor our "generated_pack_install" Taylor Blau
2025-09-29 23:21   ` Patrick Steinhardt
2025-10-07 20:26     ` Taylor Blau
2025-10-08  4:28       ` Patrick Steinhardt
2025-10-10  6:14       ` Jeff King
2025-10-10 22:58         ` Taylor Blau
2025-09-28 22:08 ` [PATCH 22/49] builtin/repack.c: pass "packtmp" to `generated_pack_populate()` Taylor Blau
2025-09-29 23:21   ` Patrick Steinhardt
2025-10-07 20:29     ` Taylor Blau
2025-10-08  4:27       ` Patrick Steinhardt
2025-09-28 22:08 ` [PATCH 23/49] builtin/repack.c: provide pack locations to `generated_pack_install()` Taylor Blau
2025-09-28 22:08 ` [PATCH 24/49] repack: remove 'generated_pack' API from the builtin Taylor Blau
2025-09-28 22:08 ` [PATCH 25/49] builtin/repack.c: pass "packtmp" to `repack_promisor_objects()` Taylor Blau
2025-09-28 22:08 ` [PATCH 26/49] builtin/repack.c: remove "repack_promisor_objects()" from the builtin Taylor Blau
2025-09-29 23:21   ` Patrick Steinhardt
2025-10-07 20:36     ` Taylor Blau
2025-09-28 22:08 ` [PATCH 27/49] builtin/repack.c: rename various pack_geometry functions Taylor Blau
2025-09-29 23:22   ` Patrick Steinhardt
2025-10-07 20:38     ` Taylor Blau
2025-10-08  4:26       ` Patrick Steinhardt
2025-10-10 23:00         ` Taylor Blau
2025-09-28 22:08 ` [PATCH 28/49] builtin/repack.c: pass 'pack_kept_objects' to `pack_geometry_init()` Taylor Blau
2025-09-28 22:09 ` [PATCH 29/49] builtin/repack.c: pass 'packdir' to `pack_geometry_remove_redundant()` Taylor Blau
2025-09-28 22:09 ` [PATCH 30/49] repack: remove pack_geometry API from the builtin Taylor Blau
2025-09-28 22:09 ` [PATCH 31/49] builtin/repack.c: remove ref snapshotting from builtin Taylor Blau
2025-09-28 22:09 ` [PATCH 32/49] builtin/repack.c: extract opts struct for 'write_midx_included_packs()' Taylor Blau
2025-09-28 22:09 ` [PATCH 33/49] builtin/repack.c: use a string_list for 'midx_pack_names' Taylor Blau
2025-09-28 22:09 ` [PATCH 34/49] repack: keep track of MIDX pack names using existing_packs Taylor Blau
2025-09-28 22:09 ` [PATCH 35/49] builtin/repack.c: reorder `remove_redundant_bitmaps()` Taylor Blau
2025-09-28 22:09 ` [PATCH 36/49] builtin/repack.c: inline `remove_redundant_bitmaps()` Taylor Blau
2025-09-28 22:09 ` [PATCH 37/49] builtin/repack.c: pass `repack_write_midx_opts` to `midx_included_packs` Taylor Blau
2025-09-28 22:09 ` [PATCH 38/49] builtin/repack.c: inline packs within `write_midx_included_packs()` Taylor Blau
2025-10-10 12:28   ` Patrick Steinhardt
2025-10-10 23:02     ` Taylor Blau
2025-10-15 10:26   ` Jeff King
2025-09-28 22:09 ` [PATCH 39/49] repack: 'write_midx_included_packs' API from the builtin Taylor Blau
2025-09-28 22:09 ` [PATCH 40/49] builtin/repack.c: introduce `struct write_pack_opts` Taylor Blau
2025-10-10 12:28   ` Patrick Steinhardt
2025-10-10 23:13     ` Taylor Blau
2025-10-15 10:28   ` Jeff King
2025-10-15 21:18     ` Taylor Blau
2025-09-28 22:09 ` [PATCH 41/49] builtin/repack.c: use `write_pack_opts` within `write_cruft_pack()` Taylor Blau
2025-10-10 12:28   ` Patrick Steinhardt
2025-10-10 23:13     ` Taylor Blau
2025-10-15 10:29   ` Jeff King
2025-09-28 22:10 ` [PATCH 42/49] repack: move `find_pack_prefix()` out of the builtin Taylor Blau
2025-10-15 10:32   ` Jeff King
2025-10-15 21:19     ` Taylor Blau
2025-09-28 22:10 ` [PATCH 43/49] repack: extract `write_pack_opts_is_local()` Taylor Blau
2025-10-10 12:28   ` Patrick Steinhardt
2025-10-15 21:21     ` Taylor Blau
2025-10-15 10:35   ` Jeff King
2025-10-15 21:25     ` Taylor Blau
2025-09-28 22:10 ` [PATCH 44/49] builtin/repack.c: pass `write_pack_opts` to `finish_pack_objects_cmd()` Taylor Blau
2025-10-15 11:01   ` Jeff King
2025-10-15 21:35     ` Taylor Blau
2025-09-28 22:10 ` [PATCH 45/49] repack: move `finish_pack_objects_cmd()` out of the builtin Taylor Blau
2025-09-28 22:10 ` [PATCH 46/49] repack: move `pack_kept_objects` to `struct pack_objects_args` Taylor Blau
2025-09-28 22:10 ` [PATCH 47/49] repack: move `write_filtered_pack()` out of the builtin Taylor Blau
2025-09-28 22:10 ` [PATCH 48/49] repack: move `write_cruft_pack()` " Taylor Blau
2025-09-28 22:10 ` [PATCH 49/49] builtin/repack.c: clean up unused `#include`s Taylor Blau
2025-09-28 22:58 ` [PATCH 00/49] repack: prepare for incremental MIDX-based repacking Junio C Hamano
2025-10-07 20:44   ` Taylor Blau
2025-10-10  6:29 ` Jeff King
2025-10-10 23:15   ` Taylor Blau
2025-10-15 11:06     ` Jeff King
2025-10-15 22:26 ` [PATCH v2 " Taylor Blau
2025-10-15 22:27   ` [PATCH v2 01/49] builtin/repack.c: avoid "the_repository" in `cmd_repack()` Taylor Blau
2025-10-15 22:27   ` [PATCH v2 02/49] builtin/repack.c: avoid "the_repository" in existing packs API Taylor Blau
2025-10-15 22:27   ` [PATCH v2 03/49] builtin/repack.c: avoid "the_repository" when taking a ref snapshot Taylor Blau
2025-10-15 22:27   ` [PATCH v2 04/49] builtin/repack.c: avoid "the_repository" when removing packs Taylor Blau
2025-10-15 22:27   ` [PATCH v2 05/49] builtin/repack.c: avoid "the_repository" when repacking promisor objects Taylor Blau
2025-10-15 22:27   ` [PATCH v2 06/49] builtin/repack.c: avoid "the_hash_algo" when deleting packs Taylor Blau
2025-10-15 22:27   ` [PATCH v2 07/49] builtin/repack.c: avoid "the_hash_algo" in `write_oid()` Taylor Blau
2025-10-15 22:27   ` [PATCH v2 08/49] builtin/repack: avoid "the_hash_algo" in `repack_promisor_objects()` Taylor Blau
2025-10-15 22:27   ` [PATCH v2 09/49] builtin/repack.c: avoid "the_hash_algo" in `finish_pack_objects_cmd()` Taylor Blau
2025-10-15 22:27   ` [PATCH v2 10/49] builtin/repack.c: avoid using `hash_to_hex()` in pack geometry Taylor Blau
2025-10-15 22:27   ` [PATCH v2 11/49] repack: introduce new compilation unit Taylor Blau
2025-10-15 22:27   ` [PATCH v2 12/49] builtin/repack.c: pass both pack_objects args to repack_config Taylor Blau
2025-10-15 22:27   ` [PATCH v2 13/49] repack: move 'delta_base_offset' to 'struct pack_objects_args' Taylor Blau
2025-10-15 22:28   ` [PATCH v2 14/49] repack: remove 'prepare_pack_objects' from the builtin Taylor Blau
2025-10-15 22:28   ` [PATCH v2 15/49] builtin/repack.c: rename many 'struct existing_packs' functions Taylor Blau
2025-10-15 22:28   ` [PATCH v2 16/49] repack: remove 'remove_redundant_pack' from the builtin Taylor Blau
2025-10-15 22:28   ` [PATCH v2 17/49] builtin/repack.c: pass "packdir" when removing packs Taylor Blau
2025-10-15 22:28   ` [PATCH v2 18/49] builtin/repack.c: avoid unnecessary numeric casts in existing_packs Taylor Blau
2025-10-15 22:28   ` [PATCH v2 19/49] repack: remove 'existing_packs' API from the builtin Taylor Blau
2025-10-15 22:28   ` [PATCH v2 20/49] builtin/repack.c: rename "struct generated_pack_data" Taylor Blau
2025-10-15 22:28   ` [PATCH v2 21/49] builtin/repack.c: factor out "generated_pack_install" Taylor Blau
2025-10-15 22:28   ` [PATCH v2 22/49] builtin/repack.c: pass "packtmp" to `generated_pack_populate()` Taylor Blau
2025-10-15 22:28   ` [PATCH v2 23/49] builtin/repack.c: provide pack locations to `generated_pack_install()` Taylor Blau
2025-10-15 22:28   ` [PATCH v2 24/49] repack: remove 'generated_pack' API from the builtin Taylor Blau
2025-10-15 22:28   ` [PATCH v2 25/49] builtin/repack.c: pass "packtmp" to `repack_promisor_objects()` Taylor Blau
2025-10-15 22:28   ` [PATCH v2 26/49] builtin/repack.c: remove "repack_promisor_objects()" from the builtin Taylor Blau
2025-10-15 22:28   ` [PATCH v2 27/49] builtin/repack.c: rename various pack_geometry functions Taylor Blau
2025-10-15 22:28   ` [PATCH v2 28/49] builtin/repack.c: pass 'pack_kept_objects' to `pack_geometry_init()` Taylor Blau
2025-10-15 22:28   ` [PATCH v2 29/49] builtin/repack.c: pass 'packdir' to `pack_geometry_remove_redundant()` Taylor Blau
2025-10-15 22:28   ` [PATCH v2 30/49] repack: remove pack_geometry API from the builtin Taylor Blau
2025-10-15 22:28   ` [PATCH v2 31/49] builtin/repack.c: remove ref snapshotting from builtin Taylor Blau
2025-10-15 22:28   ` [PATCH v2 32/49] builtin/repack.c: extract opts struct for 'write_midx_included_packs()' Taylor Blau
2025-10-15 22:28   ` [PATCH v2 33/49] builtin/repack.c: use a string_list for 'midx_pack_names' Taylor Blau
2025-10-15 22:28   ` [PATCH v2 34/49] repack: keep track of MIDX pack names using existing_packs Taylor Blau
2025-10-15 22:29   ` [PATCH v2 35/49] builtin/repack.c: reorder `remove_redundant_bitmaps()` Taylor Blau
2025-10-15 22:29   ` [PATCH v2 36/49] builtin/repack.c: inline `remove_redundant_bitmaps()` Taylor Blau
2025-10-15 22:29   ` [PATCH v2 37/49] builtin/repack.c: pass `repack_write_midx_opts` to `midx_included_packs` Taylor Blau
2025-10-15 22:29   ` [PATCH v2 38/49] builtin/repack.c: inline packs within `write_midx_included_packs()` Taylor Blau
2025-10-15 22:29   ` Taylor Blau [this message]
2025-10-15 22:29   ` [PATCH v2 40/49] builtin/repack.c: introduce `struct write_pack_opts` Taylor Blau
2025-10-15 22:29   ` [PATCH v2 41/49] builtin/repack.c: use `write_pack_opts` within `write_cruft_pack()` Taylor Blau
2025-10-15 22:29   ` [PATCH v2 42/49] repack: move `find_pack_prefix()` out of the builtin Taylor Blau
2025-10-15 22:29   ` [PATCH v2 43/49] repack: extract `write_pack_opts_is_local()` Taylor Blau
2025-10-15 22:29   ` [PATCH v2 44/49] builtin/repack.c: pass `write_pack_opts` to `finish_pack_objects_cmd()` Taylor Blau
2025-10-15 22:29   ` [PATCH v2 45/49] repack: move `finish_pack_objects_cmd()` out of the builtin Taylor Blau
2025-10-15 22:29   ` [PATCH v2 46/49] repack: move `pack_kept_objects` to `struct pack_objects_args` Taylor Blau
2025-10-15 22:29   ` [PATCH v2 47/49] repack: move `write_filtered_pack()` out of the builtin Taylor Blau
2025-10-15 22:29   ` [PATCH v2 48/49] repack: move `write_cruft_pack()` " Taylor Blau
2025-10-15 22:29   ` [PATCH v2 49/49] builtin/repack.c: clean up unused `#include`s Taylor Blau
2025-10-16 10:31   ` [PATCH v2 00/49] repack: prepare for incremental MIDX-based repacking Patrick Steinhardt
2025-10-16 17:11     ` Junio C Hamano
2025-10-16 19:56       ` Taylor Blau
2025-10-17  8:40       ` Jeff King

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=794122266d64ec8fbd21532b0ab080cdf8fc6fa7.1760567210.git.me@ttaylorr.com \
    --to=me@ttaylorr$(echo .)com \
    --cc=git@vger$(echo .)kernel.org \
    --cc=gitster@pobox$(echo .)com \
    --cc=jltobler@gmail$(echo .)com \
    --cc=newren@gmail$(echo .)com \
    --cc=peff@peff$(echo .)net \
    --cc=ps@pks$(echo .)im \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox