midx: extract bitmap write setup

The write_midx_bitmap() method is a long method that does a lot of
steps. It requires the write_midx_context struct for use in
prepare_midx_packing_data() and find_commits_for_midx_bitmap(), but
after that only needs the pack_order array.

This is a messy, but completely non-functional refactoring. The code is
only being moved around to reduce visibility of the write_midx_context
during the longest part of computing reachability bitmaps.

Signed-off-by: Derrick Stolee <derrickstolee@github.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Derrick Stolee 2022-07-19 15:26:05 +00:00 committed by Junio C Hamano
parent 5766524956
commit 90b2bb710d
1 changed files with 32 additions and 24 deletions

56
midx.c
View File

@ -1053,40 +1053,35 @@ static struct commit **find_commits_for_midx_bitmap(uint32_t *indexed_commits_nr
return cb.commits; return cb.commits;
} }


static int write_midx_bitmap(char *midx_name, unsigned char *midx_hash, static int write_midx_bitmap(const char *midx_name,
struct write_midx_context *ctx, const unsigned char *midx_hash,
struct packing_data *pdata,
struct commit **commits,
uint32_t commits_nr,
uint32_t *pack_order,
const char *refs_snapshot, const char *refs_snapshot,
unsigned flags) unsigned flags)
{ {
struct packing_data pdata; int ret, i;
struct pack_idx_entry **index;
struct commit **commits = NULL;
uint32_t i, commits_nr;
uint16_t options = 0; uint16_t options = 0;
char *bitmap_name = xstrfmt("%s-%s.bitmap", midx_name, hash_to_hex(midx_hash)); struct pack_idx_entry **index;
int ret; char *bitmap_name = xstrfmt("%s-%s.bitmap", midx_name,

hash_to_hex(midx_hash));
if (!ctx->entries_nr)
BUG("cannot write a bitmap without any objects");


if (flags & MIDX_WRITE_BITMAP_HASH_CACHE) if (flags & MIDX_WRITE_BITMAP_HASH_CACHE)
options |= BITMAP_OPT_HASH_CACHE; options |= BITMAP_OPT_HASH_CACHE;


prepare_midx_packing_data(&pdata, ctx);

commits = find_commits_for_midx_bitmap(&commits_nr, refs_snapshot, ctx);

/* /*
* Build the MIDX-order index based on pdata.objects (which is already * Build the MIDX-order index based on pdata.objects (which is already
* in MIDX order; c.f., 'midx_pack_order_cmp()' for the definition of * in MIDX order; c.f., 'midx_pack_order_cmp()' for the definition of
* this order). * this order).
*/ */
ALLOC_ARRAY(index, pdata.nr_objects); ALLOC_ARRAY(index, pdata->nr_objects);
for (i = 0; i < pdata.nr_objects; i++) for (i = 0; i < pdata->nr_objects; i++)
index[i] = &pdata.objects[i].idx; index[i] = &pdata->objects[i].idx;


bitmap_writer_show_progress(flags & MIDX_PROGRESS); bitmap_writer_show_progress(flags & MIDX_PROGRESS);
bitmap_writer_build_type_index(&pdata, index, pdata.nr_objects); bitmap_writer_build_type_index(pdata, index, pdata->nr_objects);


/* /*
* bitmap_writer_finish expects objects in lex order, but pack_order * bitmap_writer_finish expects objects in lex order, but pack_order
@ -1101,16 +1096,16 @@ static int write_midx_bitmap(char *midx_name, unsigned char *midx_hash,
* happens between bitmap_writer_build_type_index() and * happens between bitmap_writer_build_type_index() and
* bitmap_writer_finish(). * bitmap_writer_finish().
*/ */
for (i = 0; i < pdata.nr_objects; i++) for (i = 0; i < pdata->nr_objects; i++)
index[ctx->pack_order[i]] = &pdata.objects[i].idx; index[pack_order[i]] = &pdata->objects[i].idx;


bitmap_writer_select_commits(commits, commits_nr, -1); bitmap_writer_select_commits(commits, commits_nr, -1);
ret = bitmap_writer_build(&pdata); ret = bitmap_writer_build(pdata);
if (ret < 0) if (ret < 0)
goto cleanup; goto cleanup;


bitmap_writer_set_checksum(midx_hash); bitmap_writer_set_checksum(midx_hash);
bitmap_writer_finish(index, pdata.nr_objects, bitmap_name, options); bitmap_writer_finish(index, pdata->nr_objects, bitmap_name, options);


cleanup: cleanup:
free(index); free(index);
@ -1443,8 +1438,21 @@ static int write_midx_internal(const char *object_dir,
if (flags & MIDX_WRITE_REV_INDEX && if (flags & MIDX_WRITE_REV_INDEX &&
git_env_bool("GIT_TEST_MIDX_WRITE_REV", 0)) git_env_bool("GIT_TEST_MIDX_WRITE_REV", 0))
write_midx_reverse_index(midx_name.buf, midx_hash, &ctx); write_midx_reverse_index(midx_name.buf, midx_hash, &ctx);

if (flags & MIDX_WRITE_BITMAP) { if (flags & MIDX_WRITE_BITMAP) {
if (write_midx_bitmap(midx_name.buf, midx_hash, &ctx, struct packing_data pdata;
struct commit **commits;
uint32_t commits_nr;

if (!ctx.entries_nr)
BUG("cannot write a bitmap without any objects");

prepare_midx_packing_data(&pdata, &ctx);

commits = find_commits_for_midx_bitmap(&commits_nr, refs_snapshot, &ctx);

if (write_midx_bitmap(midx_name.buf, midx_hash, &pdata,
commits, commits_nr, ctx.pack_order,
refs_snapshot, flags) < 0) { refs_snapshot, flags) < 0) {
error(_("could not write multi-pack bitmap")); error(_("could not write multi-pack bitmap"));
result = 1; result = 1;