]> git.ipfire.org Git - thirdparty/git.git/commitdiff
pack-bitmap.c: introduce 'bitmap_num_objects()'
authorTaylor Blau <me@ttaylorr.com>
Tue, 31 Aug 2021 20:52:12 +0000 (16:52 -0400)
committerJunio C Hamano <gitster@pobox.com>
Wed, 1 Sep 2021 20:56:43 +0000 (13:56 -0700)
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>
pack-bitmap.c

index 9b11af87aaa9a878701bd0f2776bde3af9afef13..65356f965763da20747975400119405c2d0188a5 100644 (file)
@@ -136,6 +136,11 @@ static struct ewah_bitmap *read_bitmap_1(struct bitmap_index *index)
        return b;
 }
 
+static uint32_t bitmap_num_objects(struct bitmap_index *index)
+{
+       return index->pack->num_objects;
+}
+
 static int load_bitmap_header(struct bitmap_index *index)
 {
        struct bitmap_disk_header *header = (void *)index->map;
@@ -154,7 +159,7 @@ static int load_bitmap_header(struct bitmap_index *index)
        /* Parse known bitmap format options */
        {
                uint32_t flags = ntohs(header->options);
-               size_t cache_size = st_mult(index->pack->num_objects, sizeof(uint32_t));
+               size_t cache_size = st_mult(bitmap_num_objects(index), sizeof(uint32_t));
                unsigned char *index_end = index->map + index->map_size - the_hash_algo->rawsz;
 
                if ((flags & BITMAP_OPT_FULL_DAG) == 0)
@@ -404,7 +409,7 @@ static inline int bitmap_position_extended(struct bitmap_index *bitmap_git,
 
        if (pos < kh_end(positions)) {
                int bitmap_pos = kh_value(positions, pos);
-               return bitmap_pos + bitmap_git->pack->num_objects;
+               return bitmap_pos + bitmap_num_objects(bitmap_git);
        }
 
        return -1;
@@ -456,7 +461,7 @@ static int ext_index_add_object(struct bitmap_index *bitmap_git,
                bitmap_pos = kh_value(eindex->positions, hash_pos);
        }
 
-       return bitmap_pos + bitmap_git->pack->num_objects;
+       return bitmap_pos + bitmap_num_objects(bitmap_git);
 }
 
 struct bitmap_show_data {
@@ -673,7 +678,7 @@ static void show_extended_objects(struct bitmap_index *bitmap_git,
        for (i = 0; i < eindex->count; ++i) {
                struct object *obj;
 
-               if (!bitmap_get(objects, bitmap_git->pack->num_objects + i))
+               if (!bitmap_get(objects, bitmap_num_objects(bitmap_git) + i))
                        continue;
 
                obj = eindex->objects[i];
@@ -832,7 +837,7 @@ static void filter_bitmap_exclude_type(struct bitmap_index *bitmap_git,
         * them individually.
         */
        for (i = 0; i < eindex->count; i++) {
-               uint32_t pos = i + bitmap_git->pack->num_objects;
+               uint32_t pos = i + bitmap_num_objects(bitmap_git);
                if (eindex->objects[i]->type == type &&
                    bitmap_get(to_filter, pos) &&
                    !bitmap_get(tips, pos))
@@ -859,7 +864,7 @@ static unsigned long get_size_by_pos(struct bitmap_index *bitmap_git,
 
        oi.sizep = &size;
 
-       if (pos < pack->num_objects) {
+       if (pos < bitmap_num_objects(bitmap_git)) {
                off_t ofs = pack_pos_to_offset(pack, pos);
                if (packed_object_info(the_repository, pack, ofs, &oi) < 0) {
                        struct object_id oid;
@@ -869,7 +874,7 @@ static unsigned long get_size_by_pos(struct bitmap_index *bitmap_git,
                }
        } else {
                struct eindex *eindex = &bitmap_git->ext_index;
-               struct object *obj = eindex->objects[pos - pack->num_objects];
+               struct object *obj = eindex->objects[pos - bitmap_num_objects(bitmap_git)];
                if (oid_object_info_extended(the_repository, &obj->oid, &oi, 0) < 0)
                        die(_("unable to get size of %s"), oid_to_hex(&obj->oid));
        }
@@ -911,7 +916,7 @@ static void filter_bitmap_blob_limit(struct bitmap_index *bitmap_git,
        }
 
        for (i = 0; i < eindex->count; i++) {
-               uint32_t pos = i + bitmap_git->pack->num_objects;
+               uint32_t pos = i + bitmap_num_objects(bitmap_git);
                if (eindex->objects[i]->type == OBJ_BLOB &&
                    bitmap_get(to_filter, pos) &&
                    !bitmap_get(tips, pos) &&
@@ -1137,8 +1142,8 @@ static void try_partial_reuse(struct bitmap_index *bitmap_git,
        enum object_type type;
        unsigned long size;
 
-       if (pos >= bitmap_git->pack->num_objects)
-               return; /* not actually in the pack */
+       if (pos >= bitmap_num_objects(bitmap_git))
+               return; /* not actually in the pack or MIDX */
 
        offset = header = pack_pos_to_offset(bitmap_git->pack, pos);
        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,
        struct pack_window *w_curs = NULL;
        size_t i = 0;
        uint32_t offset;
+       uint32_t objects_nr = bitmap_num_objects(bitmap_git);
 
        assert(result);
 
@@ -1211,8 +1217,8 @@ int reuse_partial_packfile_from_bitmap(struct bitmap_index *bitmap_git,
                i++;
 
        /* Don't mark objects not in the packfile */
-       if (i > bitmap_git->pack->num_objects / BITS_IN_EWORD)
-               i = bitmap_git->pack->num_objects / BITS_IN_EWORD;
+       if (i > objects_nr / BITS_IN_EWORD)
+               i = objects_nr / BITS_IN_EWORD;
 
        reuse = bitmap_word_alloc(i);
        memset(reuse->words, 0xFF, i * sizeof(eword_t));
@@ -1296,7 +1302,7 @@ static uint32_t count_object_type(struct bitmap_index *bitmap_git,
 
        for (i = 0; i < eindex->count; ++i) {
                if (eindex->objects[i]->type == type &&
-                       bitmap_get(objects, bitmap_git->pack->num_objects + i))
+                       bitmap_get(objects, bitmap_num_objects(bitmap_git) + i))
                        count++;
        }
 
@@ -1517,7 +1523,7 @@ uint32_t *create_bitmap_mapping(struct bitmap_index *bitmap_git,
        uint32_t i, num_objects;
        uint32_t *reposition;
 
-       num_objects = bitmap_git->pack->num_objects;
+       num_objects = bitmap_num_objects(bitmap_git);
        CALLOC_ARRAY(reposition, num_objects);
 
        for (i = 0; i < num_objects; ++i) {
@@ -1600,7 +1606,6 @@ static off_t get_disk_usage_for_type(struct bitmap_index *bitmap_git,
 static off_t get_disk_usage_for_extended(struct bitmap_index *bitmap_git)
 {
        struct bitmap *result = bitmap_git->result;
-       struct packed_git *pack = bitmap_git->pack;
        struct eindex *eindex = &bitmap_git->ext_index;
        off_t total = 0;
        struct object_info oi = OBJECT_INFO_INIT;
@@ -1612,7 +1617,7 @@ static off_t get_disk_usage_for_extended(struct bitmap_index *bitmap_git)
        for (i = 0; i < eindex->count; i++) {
                struct object *obj = eindex->objects[i];
 
-               if (!bitmap_get(result, pack->num_objects + i))
+               if (!bitmap_get(result, bitmap_num_objects(bitmap_git) + i))
                        continue;
 
                if (oid_object_info_extended(the_repository, &obj->oid, &oi, 0) < 0)