Browse Source

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>
maint
Taylor Blau 4 years ago committed by Junio C Hamano
parent
commit
ed184620f5
  1. 37
      pack-bitmap.c

37
pack-bitmap.c

@ -136,6 +136,11 @@ static struct ewah_bitmap *read_bitmap_1(struct bitmap_index *index)
return b; 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) static int load_bitmap_header(struct bitmap_index *index)
{ {
struct bitmap_disk_header *header = (void *)index->map; 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 */ /* Parse known bitmap format options */
{ {
uint32_t flags = ntohs(header->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; unsigned char *index_end = index->map + index->map_size - the_hash_algo->rawsz;


if ((flags & BITMAP_OPT_FULL_DAG) == 0) 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)) { if (pos < kh_end(positions)) {
int bitmap_pos = kh_value(positions, pos); 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; 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); 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 { 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) { for (i = 0; i < eindex->count; ++i) {
struct object *obj; struct object *obj;


if (!bitmap_get(objects, bitmap_git->pack->num_objects + i)) if (!bitmap_get(objects, bitmap_num_objects(bitmap_git) + i))
continue; continue;


obj = eindex->objects[i]; obj = eindex->objects[i];
@ -832,7 +837,7 @@ static void filter_bitmap_exclude_type(struct bitmap_index *bitmap_git,
* them individually. * them individually.
*/ */
for (i = 0; i < eindex->count; i++) { 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 && if (eindex->objects[i]->type == type &&
bitmap_get(to_filter, pos) && bitmap_get(to_filter, pos) &&
!bitmap_get(tips, pos)) !bitmap_get(tips, pos))
@ -859,7 +864,7 @@ static unsigned long get_size_by_pos(struct bitmap_index *bitmap_git,


oi.sizep = &size; oi.sizep = &size;


if (pos < pack->num_objects) { if (pos < bitmap_num_objects(bitmap_git)) {
off_t ofs = pack_pos_to_offset(pack, pos); off_t ofs = pack_pos_to_offset(pack, pos);
if (packed_object_info(the_repository, pack, ofs, &oi) < 0) { if (packed_object_info(the_repository, pack, ofs, &oi) < 0) {
struct object_id oid; struct object_id oid;
@ -869,7 +874,7 @@ static unsigned long get_size_by_pos(struct bitmap_index *bitmap_git,
} }
} else { } else {
struct eindex *eindex = &bitmap_git->ext_index; 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) if (oid_object_info_extended(the_repository, &obj->oid, &oi, 0) < 0)
die(_("unable to get size of %s"), oid_to_hex(&obj->oid)); 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++) { 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 && if (eindex->objects[i]->type == OBJ_BLOB &&
bitmap_get(to_filter, pos) && bitmap_get(to_filter, pos) &&
!bitmap_get(tips, pos) && !bitmap_get(tips, pos) &&
@ -1137,8 +1142,8 @@ static void try_partial_reuse(struct bitmap_index *bitmap_git,
enum object_type type; enum object_type type;
unsigned long size; unsigned long size;


if (pos >= bitmap_git->pack->num_objects) if (pos >= bitmap_num_objects(bitmap_git))
return; /* not actually in the pack */ return; /* not actually in the pack or MIDX */


offset = header = pack_pos_to_offset(bitmap_git->pack, pos); offset = header = pack_pos_to_offset(bitmap_git->pack, pos);
type = unpack_object_header(bitmap_git->pack, w_curs, &offset, &size); 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; struct pack_window *w_curs = NULL;
size_t i = 0; size_t i = 0;
uint32_t offset; uint32_t offset;
uint32_t objects_nr = bitmap_num_objects(bitmap_git);


assert(result); assert(result);


@ -1211,8 +1217,8 @@ int reuse_partial_packfile_from_bitmap(struct bitmap_index *bitmap_git,
i++; i++;


/* Don't mark objects not in the packfile */ /* Don't mark objects not in the packfile */
if (i > bitmap_git->pack->num_objects / BITS_IN_EWORD) if (i > objects_nr / BITS_IN_EWORD)
i = bitmap_git->pack->num_objects / BITS_IN_EWORD; i = objects_nr / BITS_IN_EWORD;


reuse = bitmap_word_alloc(i); reuse = bitmap_word_alloc(i);
memset(reuse->words, 0xFF, i * sizeof(eword_t)); 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) { for (i = 0; i < eindex->count; ++i) {
if (eindex->objects[i]->type == type && 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++; count++;
} }


@ -1517,7 +1523,7 @@ uint32_t *create_bitmap_mapping(struct bitmap_index *bitmap_git,
uint32_t i, num_objects; uint32_t i, num_objects;
uint32_t *reposition; uint32_t *reposition;


num_objects = bitmap_git->pack->num_objects; num_objects = bitmap_num_objects(bitmap_git);
CALLOC_ARRAY(reposition, num_objects); CALLOC_ARRAY(reposition, num_objects);


for (i = 0; i < num_objects; ++i) { 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) static off_t get_disk_usage_for_extended(struct bitmap_index *bitmap_git)
{ {
struct bitmap *result = bitmap_git->result; struct bitmap *result = bitmap_git->result;
struct packed_git *pack = bitmap_git->pack;
struct eindex *eindex = &bitmap_git->ext_index; struct eindex *eindex = &bitmap_git->ext_index;
off_t total = 0; off_t total = 0;
struct object_info oi = OBJECT_INFO_INIT; 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++) { for (i = 0; i < eindex->count; i++) {
struct object *obj = eindex->objects[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; continue;


if (oid_object_info_extended(the_repository, &obj->oid, &oi, 0) < 0) if (oid_object_info_extended(the_repository, &obj->oid, &oi, 0) < 0)

Loading…
Cancel
Save