Browse Source

pack-bitmap: factor out 'bitmap_for_commit()'

A couple of callers within pack-bitmap.c duplicate logic to lookup a
given object id in the bitamps khash. Factor this out into a new
function, 'bitmap_for_commit()' to reduce some code duplication.

Make this new function non-static, since it will be used in later
commits from outside of pack-bitmap.c.

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
98c31f366a
  1. 33
      pack-bitmap.c
  2. 2
      pack-bitmap.h

33
pack-bitmap.c

@ -380,6 +380,16 @@ struct include_data {
struct bitmap *seen; struct bitmap *seen;
}; };


struct ewah_bitmap *bitmap_for_commit(struct bitmap_index *bitmap_git,
struct commit *commit)
{
khiter_t hash_pos = kh_get_oid_map(bitmap_git->bitmaps,
commit->object.oid);
if (hash_pos >= kh_end(bitmap_git->bitmaps))
return NULL;
return lookup_stored_bitmap(kh_value(bitmap_git->bitmaps, hash_pos));
}

static inline int bitmap_position_extended(struct bitmap_index *bitmap_git, static inline int bitmap_position_extended(struct bitmap_index *bitmap_git,
const struct object_id *oid) const struct object_id *oid)
{ {
@ -465,10 +475,10 @@ static void show_commit(struct commit *commit, void *data)


static int add_to_include_set(struct bitmap_index *bitmap_git, static int add_to_include_set(struct bitmap_index *bitmap_git,
struct include_data *data, struct include_data *data,
const struct object_id *oid, struct commit *commit,
int bitmap_pos) int bitmap_pos)
{ {
khiter_t hash_pos; struct ewah_bitmap *partial;


if (data->seen && bitmap_get(data->seen, bitmap_pos)) if (data->seen && bitmap_get(data->seen, bitmap_pos))
return 0; return 0;
@ -476,10 +486,9 @@ static int add_to_include_set(struct bitmap_index *bitmap_git,
if (bitmap_get(data->base, bitmap_pos)) if (bitmap_get(data->base, bitmap_pos))
return 0; return 0;


hash_pos = kh_get_oid_map(bitmap_git->bitmaps, *oid); partial = bitmap_for_commit(bitmap_git, commit);
if (hash_pos < kh_end(bitmap_git->bitmaps)) { if (partial) {
struct stored_bitmap *st = kh_value(bitmap_git->bitmaps, hash_pos); bitmap_or_ewah(data->base, partial);
bitmap_or_ewah(data->base, lookup_stored_bitmap(st));
return 0; return 0;
} }


@ -498,8 +507,7 @@ static int should_include(struct commit *commit, void *_data)
(struct object *)commit, (struct object *)commit,
NULL); NULL);


if (!add_to_include_set(data->bitmap_git, data, &commit->object.oid, if (!add_to_include_set(data->bitmap_git, data, commit, bitmap_pos)) {
bitmap_pos)) {
struct commit_list *parent = commit->parents; struct commit_list *parent = commit->parents;


while (parent) { while (parent) {
@ -1282,10 +1290,10 @@ void test_bitmap_walk(struct rev_info *revs)
{ {
struct object *root; struct object *root;
struct bitmap *result = NULL; struct bitmap *result = NULL;
khiter_t pos;
size_t result_popcnt; size_t result_popcnt;
struct bitmap_test_data tdata; struct bitmap_test_data tdata;
struct bitmap_index *bitmap_git; struct bitmap_index *bitmap_git;
struct ewah_bitmap *bm;


if (!(bitmap_git = prepare_bitmap_git(revs->repo))) if (!(bitmap_git = prepare_bitmap_git(revs->repo)))
die("failed to load bitmap indexes"); die("failed to load bitmap indexes");
@ -1297,12 +1305,9 @@ void test_bitmap_walk(struct rev_info *revs)
bitmap_git->version, bitmap_git->entry_count); bitmap_git->version, bitmap_git->entry_count);


root = revs->pending.objects[0].item; root = revs->pending.objects[0].item;
pos = kh_get_oid_map(bitmap_git->bitmaps, root->oid); bm = bitmap_for_commit(bitmap_git, (struct commit *)root);

if (pos < kh_end(bitmap_git->bitmaps)) {
struct stored_bitmap *st = kh_value(bitmap_git->bitmaps, pos);
struct ewah_bitmap *bm = lookup_stored_bitmap(st);


if (bm) {
fprintf(stderr, "Found bitmap for %s. %d bits / %08x checksum\n", fprintf(stderr, "Found bitmap for %s. %d bits / %08x checksum\n",
oid_to_hex(&root->oid), (int)bm->bit_size, ewah_checksum(bm)); oid_to_hex(&root->oid), (int)bm->bit_size, ewah_checksum(bm));



2
pack-bitmap.h

@ -78,6 +78,8 @@ uint32_t *create_bitmap_mapping(struct bitmap_index *bitmap_git,
int rebuild_bitmap(const uint32_t *reposition, int rebuild_bitmap(const uint32_t *reposition,
struct ewah_bitmap *source, struct ewah_bitmap *source,
struct bitmap *dest); struct bitmap *dest);
struct ewah_bitmap *bitmap_for_commit(struct bitmap_index *bitmap_git,
struct commit *commit);
void bitmap_writer_select_commits(struct commit **indexed_commits, void bitmap_writer_select_commits(struct commit **indexed_commits,
unsigned int indexed_commits_nr, int max_bitmaps); unsigned int indexed_commits_nr, int max_bitmaps);
void bitmap_writer_build(struct packing_data *to_pack); void bitmap_writer_build(struct packing_data *to_pack);

Loading…
Cancel
Save