pack-bitmap.c: introduce 'bitmap_num_objects()'

A subsequent patch to support reading MIDX bitmaps will be less noisy after extracting a generic function to return how many objects are contained in a bitmap. Signed-off-by: Taylor Blau <me@ttaylorr.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Taylor Blau committed Aug 31, 2021 at 16:52 UTC ed184620f5b82a5edd33fa08e93e1ac116138c29
1 file changed +21 -16
pack-bitmap.c
+21 -16
@@ -136,6 +136,11 @@ static struct ewah_bitmap *read_bitmap_1(struct bitmap_index *index)
136 return b;
137 }
138
139 +static uint32_t bitmap_num_objects(struct bitmap_index *index)
140 +{
141 + return index->pack->num_objects;
142 +}
143 +
144 static int load_bitmap_header(struct bitmap_index *index)
145 {
146 struct bitmap_disk_header *header = (void *)index->map;
@@ -154,7 +159,7 @@ static int load_bitmap_header(struct bitmap_index *index)
159 /* Parse known bitmap format options */
160 {
161 uint32_t flags = ntohs(header->options);
157 - size_t cache_size = st_mult(index->pack->num_objects, sizeof(uint32_t));
162 + size_t cache_size = st_mult(bitmap_num_objects(index), sizeof(uint32_t));
163 unsigned char *index_end = index->map + index->map_size - the_hash_algo->rawsz;
164
165 if ((flags & BITMAP_OPT_FULL_DAG) == 0)
@@ -404,7 +409,7 @@ static inline int bitmap_position_extended(struct bitmap_index *bitmap_git,
409
410 if (pos < kh_end(positions)) {
411 int bitmap_pos = kh_value(positions, pos);
407 - return bitmap_pos + bitmap_git->pack->num_objects;
412 + return bitmap_pos + bitmap_num_objects(bitmap_git);
413 }
414
415 return -1;
@@ -456,7 +461,7 @@ static int ext_index_add_object(struct bitmap_index *bitmap_git,
461 bitmap_pos = kh_value(eindex->positions, hash_pos);
462 }
463
459 - return bitmap_pos + bitmap_git->pack->num_objects;
464 + return bitmap_pos + bitmap_num_objects(bitmap_git);
465 }
466
467 struct bitmap_show_data {
@@ -673,7 +678,7 @@ static void show_extended_objects(struct bitmap_index *bitmap_git,
678 for (i = 0; i < eindex->count; ++i) {
679 struct object *obj;
680
676 - if (!bitmap_get(objects, bitmap_git->pack->num_objects + i))
681 + if (!bitmap_get(objects, bitmap_num_objects(bitmap_git) + i))
682 continue;
683
684 obj = eindex->objects[i];
@@ -832,7 +837,7 @@ static void filter_bitmap_exclude_type(struct bitmap_index *bitmap_git,
837 * them individually.
838 */
839 for (i = 0; i < eindex->count; i++) {
835 - uint32_t pos = i + bitmap_git->pack->num_objects;
840 + uint32_t pos = i + bitmap_num_objects(bitmap_git);
841 if (eindex->objects[i]->type == type &&
842 bitmap_get(to_filter, pos) &&
843 !bitmap_get(tips, pos))
@@ -859,7 +864,7 @@ static unsigned long get_size_by_pos(struct bitmap_index *bitmap_git,
864
865 oi.sizep = &size;
866
862 - if (pos < pack->num_objects) {
867 + if (pos < bitmap_num_objects(bitmap_git)) {
868 off_t ofs = pack_pos_to_offset(pack, pos);
869 if (packed_object_info(the_repository, pack, ofs, &oi) < 0) {
870 struct object_id oid;
@@ -869,7 +874,7 @@ static unsigned long get_size_by_pos(struct bitmap_index *bitmap_git,
874 }
875 } else {
876 struct eindex *eindex = &bitmap_git->ext_index;
872 - struct object *obj = eindex->objects[pos - pack->num_objects];
877 + struct object *obj = eindex->objects[pos - bitmap_num_objects(bitmap_git)];
878 if (oid_object_info_extended(the_repository, &obj->oid, &oi, 0) < 0)
879 die(_("unable to get size of %s"), oid_to_hex(&obj->oid));
880 }
@@ -911,7 +916,7 @@ static void filter_bitmap_blob_limit(struct bitmap_index *bitmap_git,
916 }
917
918 for (i = 0; i < eindex->count; i++) {
914 - uint32_t pos = i + bitmap_git->pack->num_objects;
919 + uint32_t pos = i + bitmap_num_objects(bitmap_git);
920 if (eindex->objects[i]->type == OBJ_BLOB &&
921 bitmap_get(to_filter, pos) &&
922 !bitmap_get(tips, pos) &&
@@ -1137,8 +1142,8 @@ static void try_partial_reuse(struct bitmap_index *bitmap_git,
1142 enum object_type type;
1143 unsigned long size;
1144
1140 - if (pos >= bitmap_git->pack->num_objects)
1141 - return; /* not actually in the pack */
1145 + if (pos >= bitmap_num_objects(bitmap_git))
1146 + return; /* not actually in the pack or MIDX */
1147
1148 offset = header = pack_pos_to_offset(bitmap_git->pack, pos);
1149 type = unpack_object_header(bitmap_git->pack, w_curs, &offset, &size);
@@ -1204,6 +1209,7 @@ int reuse_partial_packfile_from_bitmap(struct bitmap_index *bitmap_git,
1209 struct pack_window *w_curs = NULL;
1210 size_t i = 0;
1211 uint32_t offset;
1212 + uint32_t objects_nr = bitmap_num_objects(bitmap_git);
1213
1214 assert(result);
1215
@@ -1211,8 +1217,8 @@ int reuse_partial_packfile_from_bitmap(struct bitmap_index *bitmap_git,
1217 i++;
1218
1219 /* Don't mark objects not in the packfile */
1214 - if (i > bitmap_git->pack->num_objects / BITS_IN_EWORD)
1215 - i = bitmap_git->pack->num_objects / BITS_IN_EWORD;
1220 + if (i > objects_nr / BITS_IN_EWORD)
1221 + i = objects_nr / BITS_IN_EWORD;
1222
1223 reuse = bitmap_word_alloc(i);
1224 memset(reuse->words, 0xFF, i * sizeof(eword_t));
@@ -1296,7 +1302,7 @@ static uint32_t count_object_type(struct bitmap_index *bitmap_git,
1302
1303 for (i = 0; i < eindex->count; ++i) {
1304 if (eindex->objects[i]->type == type &&
1299 - bitmap_get(objects, bitmap_git->pack->num_objects + i))
1305 + bitmap_get(objects, bitmap_num_objects(bitmap_git) + i))
1306 count++;
1307 }
1308
@@ -1517,7 +1523,7 @@ uint32_t *create_bitmap_mapping(struct bitmap_index *bitmap_git,
1523 uint32_t i, num_objects;
1524 uint32_t *reposition;
1525
1520 - num_objects = bitmap_git->pack->num_objects;
1526 + num_objects = bitmap_num_objects(bitmap_git);
1527 CALLOC_ARRAY(reposition, num_objects);
1528
1529 for (i = 0; i < num_objects; ++i) {
@@ -1600,7 +1606,6 @@ static off_t get_disk_usage_for_type(struct bitmap_index *bitmap_git,
1606 static off_t get_disk_usage_for_extended(struct bitmap_index *bitmap_git)
1607 {
1608 struct bitmap *result = bitmap_git->result;
1603 - struct packed_git *pack = bitmap_git->pack;
1609 struct eindex *eindex = &bitmap_git->ext_index;
1610 off_t total = 0;
1611 struct object_info oi = OBJECT_INFO_INIT;
@@ -1612,7 +1617,7 @@ static off_t get_disk_usage_for_extended(struct bitmap_index *bitmap_git)
1617 for (i = 0; i < eindex->count; i++) {
1618 struct object *obj = eindex->objects[i];
1619
1615 - if (!bitmap_get(result, pack->num_objects + i))
1620 + if (!bitmap_get(result, bitmap_num_objects(bitmap_git) + i))
1621 continue;
1622
1623 if (oid_object_info_extended(the_repository, &obj->oid, &oi, 0) < 0)