path: root/builtin
diff options
authorTaylor Blau <>2021-09-29 01:55:04 (GMT)
committerJunio C Hamano <>2021-09-29 04:20:55 (GMT)
commit6fb22ca463077a07f42675be52e68891f319b5c2 (patch)
tree94ae60bd5cf107855df15f9fa3e743bb0af8e450 /builtin
parent56d863e9799c9d440eba3e61346662745a58ab21 (diff)
builtin/multi-pack-index.c: support `--stdin-packs` mode
To power a new `--write-midx` mode, `git repack` will want to write a multi-pack index containing a certain set of packs in the repository. This new option will be used by `git repack` to write a MIDX which contains only the packs which will survive after the repack (that is, it will exclude any packs which are about to be deleted). This patch effectively exposes the function implemented in the previous commit via the `git multi-pack-index` builtin. An alternative approach would have been to call that function from the `git repack` builtin directly, but this introduces awkward problems around closing and reopening the object store, so the MIDX will be written out-of-process. Signed-off-by: Taylor Blau <> Signed-off-by: Junio C Hamano <>
Diffstat (limited to 'builtin')
1 files changed, 27 insertions, 0 deletions
diff --git a/builtin/multi-pack-index.c b/builtin/multi-pack-index.c
index 73c0113..047647b 100644
--- a/builtin/multi-pack-index.c
+++ b/builtin/multi-pack-index.c
@@ -47,6 +47,7 @@ static struct opts_multi_pack_index {
const char *preferred_pack;
unsigned long batch_size;
unsigned flags;
+ int stdin_packs;
} opts;
static struct option common_opts[] = {
@@ -61,6 +62,16 @@ static struct option *add_common_options(struct option *prev)
return parse_options_concat(common_opts, prev);
+static void read_packs_from_stdin(struct string_list *to)
+ struct strbuf buf = STRBUF_INIT;
+ while (strbuf_getline(&buf, stdin) != EOF)
+ string_list_append(to, buf.buf);
+ string_list_sort(to);
+ strbuf_release(&buf);
static int cmd_multi_pack_index_write(int argc, const char **argv)
struct option *options;
@@ -70,6 +81,8 @@ static int cmd_multi_pack_index_write(int argc, const char **argv)
N_("pack for reuse when computing a multi-pack bitmap")),
OPT_BIT(0, "bitmap", &opts.flags, N_("write multi-pack bitmap"),
+ OPT_BOOL(0, "stdin-packs", &opts.stdin_packs,
+ N_("write multi-pack index containing only given indexes")),
@@ -86,6 +99,20 @@ static int cmd_multi_pack_index_write(int argc, const char **argv)
+ if (opts.stdin_packs) {
+ struct string_list packs = STRING_LIST_INIT_DUP;
+ int ret;
+ read_packs_from_stdin(&packs);
+ ret = write_midx_file_only(opts.object_dir, &packs,
+ opts.preferred_pack, opts.flags);
+ string_list_clear(&packs, 0);
+ return ret;
+ }
return write_midx_file(opts.object_dir, opts.preferred_pack,