| 657 | } |
| 658 | |
| 659 | static uint32_t *midx_pack_order(struct write_midx_context *ctx) |
| 660 | { |
| 661 | struct midx_pack_order_data *data; |
| 662 | uint32_t *pack_order, base_objects = 0; |
| 663 | uint32_t i; |
| 664 | |
| 665 | trace2_region_enter("midx", "midx_pack_order", ctx->repo); |
| 666 | |
| 667 | if (ctx->incremental && ctx->base_midx) |
| 668 | base_objects = ctx->base_midx->num_objects + |
| 669 | ctx->base_midx->num_objects_in_base; |
| 670 | |
| 671 | ALLOC_ARRAY(pack_order, ctx->entries_nr); |
| 672 | ALLOC_ARRAY(data, ctx->entries_nr); |
| 673 | |
| 674 | for (i = 0; i < ctx->entries_nr; i++) { |
| 675 | struct pack_midx_entry *e = &ctx->entries[i]; |
| 676 | data[i].nr = i; |
| 677 | data[i].pack = midx_pack_perm(ctx, e->pack_int_id); |
| 678 | if (!e->preferred || ctx->compact) |
| 679 | data[i].pack |= (1U << 31); |
| 680 | data[i].offset = e->offset; |
| 681 | } |
| 682 | |
| 683 | QSORT(data, ctx->entries_nr, midx_pack_order_cmp); |
| 684 | |
| 685 | for (i = 0; i < ctx->entries_nr; i++) { |
| 686 | struct pack_midx_entry *e = &ctx->entries[data[i].nr]; |
| 687 | struct pack_info *pack = &ctx->info[midx_pack_perm(ctx, e->pack_int_id)]; |
| 688 | if (pack->bitmap_pos == BITMAP_POS_UNKNOWN) |
| 689 | pack->bitmap_pos = i + base_objects; |
| 690 | pack->bitmap_nr++; |
| 691 | pack_order[i] = data[i].nr; |
| 692 | } |
| 693 | for (i = 0; i < ctx->nr; i++) { |
| 694 | struct pack_info *pack = &ctx->info[i]; |
| 695 | if (pack->bitmap_pos == BITMAP_POS_UNKNOWN) |
| 696 | pack->bitmap_pos = 0; |
| 697 | } |
| 698 | free(data); |
| 699 | |
| 700 | trace2_region_leave("midx", "midx_pack_order", ctx->repo); |
| 701 | |
| 702 | return pack_order; |
| 703 | } |
| 704 | |
| 705 | static void write_midx_reverse_index(struct write_midx_context *ctx, |
| 706 | unsigned char *midx_hash) |
no test coverage detected