]> git.ipfire.org Git - thirdparty/git.git/commitdiff
pack-bitmap: basic noop bitmap filter infrastructure
authorJeff King <peff@peff.net>
Fri, 14 Feb 2020 18:22:29 +0000 (13:22 -0500)
committerJunio C Hamano <gitster@pobox.com>
Fri, 14 Feb 2020 18:46:22 +0000 (10:46 -0800)
Currently you can't use object filters with bitmaps, but we plan to
support at least some filters with bitmaps. Let's introduce some
infrastructure that will help us do that:

  - prepare_bitmap_walk() now accepts a list_objects_filter_options
    parameter (which can be NULL for no filtering; all the current
    callers pass this)

  - we'll bail early if the filter is incompatible with bitmaps (just as
    we would if there were no bitmaps at all). Currently all filters are
    incompatible.

  - we'll filter the resulting bitmap; since there are no supported
    filters yet, this is always a noop.

There should be no behavior change yet, but we'll support some actual
filters in a future patch.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/pack-objects.c
builtin/rev-list.c
pack-bitmap.c
pack-bitmap.h
reachable.c

index 06915ebe7f86714700b090db58a50cc4263ba87e..2bb81c2133166c4fd0874690cf79ab86182c7591 100644 (file)
@@ -3040,7 +3040,7 @@ static int pack_options_allow_reuse(void)
 
 static int get_object_list_from_bitmap(struct rev_info *revs)
 {
-       if (!(bitmap_git = prepare_bitmap_walk(revs)))
+       if (!(bitmap_git = prepare_bitmap_walk(revs, NULL)))
                return -1;
 
        if (pack_options_allow_reuse() &&
index 937324cef030b9489591be720182451cacf39d0e..6ff5e175faa969eda25582eb53898f7f0683543b 100644 (file)
@@ -407,7 +407,7 @@ static int try_bitmap_count(struct rev_info *revs)
         */
        max_count = revs->max_count;
 
-       bitmap_git = prepare_bitmap_walk(revs);
+       bitmap_git = prepare_bitmap_walk(revs, NULL);
        if (!bitmap_git)
                return -1;
 
@@ -434,7 +434,7 @@ static int try_bitmap_traversal(struct rev_info *revs)
        if (revs->max_count >= 0)
                return -1;
 
-       bitmap_git = prepare_bitmap_walk(revs);
+       bitmap_git = prepare_bitmap_walk(revs, NULL);
        if (!bitmap_git)
                return -1;
 
index 2fbc748b193eabbe147aff930ce1a23cdeed2436..48c8694f927fa388d0236bdc59310a2ccc92fed3 100644 (file)
@@ -12,6 +12,7 @@
 #include "packfile.h"
 #include "repository.h"
 #include "object-store.h"
+#include "list-objects-filter-options.h"
 
 /*
  * An entry on the bitmap index, representing the bitmap for a given
@@ -711,7 +712,25 @@ static int in_bitmapped_pack(struct bitmap_index *bitmap_git,
        return 0;
 }
 
-struct bitmap_index *prepare_bitmap_walk(struct rev_info *revs)
+static int filter_bitmap(struct bitmap_index *bitmap_git,
+                        struct object_list *tip_objects,
+                        struct bitmap *to_filter,
+                        struct list_objects_filter_options *filter)
+{
+       if (!filter || filter->choice == LOFC_DISABLED)
+               return 0;
+
+       /* filter choice not handled */
+       return -1;
+}
+
+static int can_filter_bitmap(struct list_objects_filter_options *filter)
+{
+       return !filter_bitmap(NULL, NULL, NULL, filter);
+}
+
+struct bitmap_index *prepare_bitmap_walk(struct rev_info *revs,
+                                        struct list_objects_filter_options *filter)
 {
        unsigned int i;
 
@@ -731,6 +750,9 @@ struct bitmap_index *prepare_bitmap_walk(struct rev_info *revs)
        if (revs->prune)
                return NULL;
 
+       if (!can_filter_bitmap(filter))
+               return NULL;
+
        /* try to open a bitmapped pack, but don't parse it yet
         * because we may not need to use it */
        bitmap_git = xcalloc(1, sizeof(*bitmap_git));
@@ -800,6 +822,8 @@ struct bitmap_index *prepare_bitmap_walk(struct rev_info *revs)
        if (haves_bitmap)
                bitmap_and_not(wants_bitmap, haves_bitmap);
 
+       filter_bitmap(bitmap_git, wants, wants_bitmap, filter);
+
        bitmap_git->result = wants_bitmap;
        bitmap_git->haves = haves_bitmap;
 
index b0c06a212ebf60406d50ffc40fdf003ecbdbe00e..956775d0bb4c06b8b93d995d000ad49114f2e236 100644 (file)
@@ -8,6 +8,7 @@
 struct commit;
 struct repository;
 struct rev_info;
+struct list_objects_filter_options;
 
 static const char BITMAP_IDX_SIGNATURE[] = {'B', 'I', 'T', 'M'};
 
@@ -47,7 +48,8 @@ void traverse_bitmap_commit_list(struct bitmap_index *,
                                 struct rev_info *revs,
                                 show_reachable_fn show_reachable);
 void test_bitmap_walk(struct rev_info *revs);
-struct bitmap_index *prepare_bitmap_walk(struct rev_info *revs);
+struct bitmap_index *prepare_bitmap_walk(struct rev_info *revs,
+                                        struct list_objects_filter_options *filter);
 int reuse_partial_packfile_from_bitmap(struct bitmap_index *,
                                       struct packed_git **packfile,
                                       uint32_t *entries, off_t *up_to);
index 0919f025c4a7ddf70ef2999608984fb571690456..77a60c70a5db775d2f783023eeb757c1eb61d8a4 100644 (file)
@@ -223,7 +223,7 @@ void mark_reachable_objects(struct rev_info *revs, int mark_reflog,
        cp.progress = progress;
        cp.count = 0;
 
-       bitmap_git = prepare_bitmap_walk(revs);
+       bitmap_git = prepare_bitmap_walk(revs, NULL);
        if (bitmap_git) {
                traverse_bitmap_commit_list(bitmap_git, revs, mark_object_seen);
                free_bitmap_index(bitmap_git);