]> git.ipfire.org Git - thirdparty/git.git/commitdiff
pack-bitmap: factor out 'bitmap_for_commit()'
authorTaylor Blau <me@ttaylorr.com>
Tue, 8 Dec 2020 22:05:09 +0000 (17:05 -0500)
committerJunio C Hamano <gitster@pobox.com>
Tue, 8 Dec 2020 22:49:04 +0000 (14:49 -0800)
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>
pack-bitmap.c
pack-bitmap.h

index d1368b69bb3f4118eab2fdfa221bf96af715b889..5efb8af12106607fca6f0544e227764b78a4d9ee 100644 (file)
@@ -380,6 +380,16 @@ struct include_data {
        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,
                                           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,
                              struct include_data *data,
-                             const struct object_id *oid,
+                             struct commit *commit,
                              int bitmap_pos)
 {
-       khiter_t hash_pos;
+       struct ewah_bitmap *partial;
 
        if (data->seen && bitmap_get(data->seen, bitmap_pos))
                return 0;
@@ -476,10 +486,9 @@ static int add_to_include_set(struct bitmap_index *bitmap_git,
        if (bitmap_get(data->base, bitmap_pos))
                return 0;
 
-       hash_pos = kh_get_oid_map(bitmap_git->bitmaps, *oid);
-       if (hash_pos < kh_end(bitmap_git->bitmaps)) {
-               struct stored_bitmap *st = kh_value(bitmap_git->bitmaps, hash_pos);
-               bitmap_or_ewah(data->base, lookup_stored_bitmap(st));
+       partial = bitmap_for_commit(bitmap_git, commit);
+       if (partial) {
+               bitmap_or_ewah(data->base, partial);
                return 0;
        }
 
@@ -498,8 +507,7 @@ static int should_include(struct commit *commit, void *_data)
                                                  (struct object *)commit,
                                                  NULL);
 
-       if (!add_to_include_set(data->bitmap_git, data, &commit->object.oid,
-                               bitmap_pos)) {
+       if (!add_to_include_set(data->bitmap_git, data, commit, bitmap_pos)) {
                struct commit_list *parent = commit->parents;
 
                while (parent) {
@@ -1282,10 +1290,10 @@ void test_bitmap_walk(struct rev_info *revs)
 {
        struct object *root;
        struct bitmap *result = NULL;
-       khiter_t pos;
        size_t result_popcnt;
        struct bitmap_test_data tdata;
        struct bitmap_index *bitmap_git;
+       struct ewah_bitmap *bm;
 
        if (!(bitmap_git = prepare_bitmap_git(revs->repo)))
                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);
 
        root = revs->pending.objects[0].item;
-       pos = kh_get_oid_map(bitmap_git->bitmaps, root->oid);
-
-       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);
+       bm = bitmap_for_commit(bitmap_git, (struct commit *)root);
 
+       if (bm) {
                fprintf(stderr, "Found bitmap for %s. %d bits / %08x checksum\n",
                        oid_to_hex(&root->oid), (int)bm->bit_size, ewah_checksum(bm));
 
index afa4115136862200a24140241992db7b6b980ad1..25dfcf56156bf8b9b03ebbbaae895a71fc8cf89b 100644 (file)
@@ -78,6 +78,8 @@ uint32_t *create_bitmap_mapping(struct bitmap_index *bitmap_git,
 int rebuild_bitmap(const uint32_t *reposition,
                   struct ewah_bitmap *source,
                   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,
                unsigned int indexed_commits_nr, int max_bitmaps);
 void bitmap_writer_build(struct packing_data *to_pack);