647
return pack_order;
648
}
649
650
-static void write_midx_reverse_index(char *midx_name, unsigned char *midx_hash,
651
- struct write_midx_context *ctx)
650
+static void write_midx_reverse_index(struct write_midx_context *ctx,
651
+ const char *object_dir,
652
+ unsigned char *midx_hash)
653
{
654
struct strbuf buf = STRBUF_INIT;
655
char *tmp_file;
656
657
trace2_region_enter("midx", "write_midx_reverse_index", ctx->repo);
658
658
- strbuf_addf(&buf, "%s-%s.rev", midx_name, hash_to_hex_algop(midx_hash,
659
- ctx->repo->hash_algo));
659
+ if (ctx->incremental)
660
+ get_split_midx_filename_ext(ctx->repo->hash_algo, &buf,
661
+ object_dir, midx_hash,
662
+ MIDX_EXT_REV);
663
+ else
664
+ get_midx_filename_ext(ctx->repo->hash_algo, &buf, object_dir,
665
+ midx_hash, MIDX_EXT_REV);
666
667
tmp_file = write_rev_file_order(ctx->repo->hash_algo, NULL, ctx->pack_order,
668
ctx->entries_nr, midx_hash, WRITE_REV);
835
return cb.commits;
836
}
837
832
-static int write_midx_bitmap(struct repository *r, const char *midx_name,
838
+static int write_midx_bitmap(struct write_midx_context *ctx,
839
+ const char *object_dir,
840
const unsigned char *midx_hash,
841
struct packing_data *pdata,
842
struct commit **commits,
843
uint32_t commits_nr,
837
- uint32_t *pack_order,
844
unsigned flags)
845
{
846
int ret, i;
847
uint16_t options = 0;
848
struct bitmap_writer writer;
849
struct pack_idx_entry **index;
844
- char *bitmap_name = xstrfmt("%s-%s.bitmap", midx_name,
845
- hash_to_hex_algop(midx_hash, r->hash_algo));
850
+ struct strbuf bitmap_name = STRBUF_INIT;
851
+
852
+ trace2_region_enter("midx", "write_midx_bitmap", ctx->repo);
853
847
- trace2_region_enter("midx", "write_midx_bitmap", r);
854
+ if (ctx->incremental)
855
+ get_split_midx_filename_ext(ctx->repo->hash_algo, &bitmap_name,
856
+ object_dir, midx_hash,
857
+ MIDX_EXT_BITMAP);
858
+ else
859
+ get_midx_filename_ext(ctx->repo->hash_algo, &bitmap_name,
860
+ object_dir, midx_hash, MIDX_EXT_BITMAP);
861
862
if (flags & MIDX_WRITE_BITMAP_HASH_CACHE)
863
options |= BITMAP_OPT_HASH_CACHE;
874
for (i = 0; i < pdata->nr_objects; i++)
875
index[i] = &pdata->objects[i].idx;
876
864
- bitmap_writer_init(&writer, r, pdata);
877
+ bitmap_writer_init(&writer, ctx->repo, pdata,
878
+ ctx->incremental ? ctx->base_midx : NULL);
879
bitmap_writer_show_progress(&writer, flags & MIDX_PROGRESS);
880
bitmap_writer_build_type_index(&writer, index);
881
893
* bitmap_writer_finish().
894
*/
895
for (i = 0; i < pdata->nr_objects; i++)
882
- index[pack_order[i]] = &pdata->objects[i].idx;
896
+ index[ctx->pack_order[i]] = &pdata->objects[i].idx;
897
898
bitmap_writer_select_commits(&writer, commits, commits_nr);
899
ret = bitmap_writer_build(&writer);
901
goto cleanup;
902
903
bitmap_writer_set_checksum(&writer, midx_hash);
890
- bitmap_writer_finish(&writer, index, bitmap_name, options);
904
+ bitmap_writer_finish(&writer, index, bitmap_name.buf, options);
905
906
cleanup:
907
free(index);
894
- free(bitmap_name);
908
+ strbuf_release(&bitmap_name);
909
bitmap_writer_free(&writer);
910
897
- trace2_region_leave("midx", "write_midx_bitmap", r);
911
+ trace2_region_leave("midx", "write_midx_bitmap", ctx->repo);
912
913
return ret;
914
}
1091
ctx.repo = r;
1092
1093
ctx.incremental = !!(flags & MIDX_WRITE_INCREMENTAL);
1080
- if (ctx.incremental && (flags & MIDX_WRITE_BITMAP))
1081
- die(_("cannot write incremental MIDX with bitmap"));
1094
1095
if (ctx.incremental)
1096
strbuf_addf(&midx_name,
1131
if (ctx.incremental) {
1132
struct multi_pack_index *m = ctx.base_midx;
1133
while (m) {
1134
+ if (flags & MIDX_WRITE_BITMAP && load_midx_revindex(m)) {
1135
+ error(_("could not load reverse index for MIDX %s"),
1136
+ hash_to_hex_algop(get_midx_checksum(m),
1137
+ m->repo->hash_algo));
1138
+ result = 1;
1139
+ goto cleanup;
1140
+ }
1141
ctx.num_multi_pack_indexes_before++;
1142
m = m->base_midx;
1143
}
1406
1407
if (flags & MIDX_WRITE_REV_INDEX &&
1408
git_env_bool("GIT_TEST_MIDX_WRITE_REV", 0))
1390
- write_midx_reverse_index(midx_name.buf, midx_hash, &ctx);
1409
+ write_midx_reverse_index(&ctx, object_dir, midx_hash);
1410
1411
if (flags & MIDX_WRITE_BITMAP) {
1412
struct packing_data pdata;
1429
FREE_AND_NULL(ctx.entries);
1430
ctx.entries_nr = 0;
1431
1413
- if (write_midx_bitmap(r, midx_name.buf, midx_hash, &pdata,
1414
- commits, commits_nr, ctx.pack_order,
1432
+ if (write_midx_bitmap(&ctx, object_dir,
1433
+ midx_hash, &pdata, commits, commits_nr,
1434
flags) < 0) {
1435
error(_("could not write multi-pack bitmap"));
1436
result = 1;