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)