Browse Source

pack-bitmap: basic noop bitmap filter infrastructure

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>
maint
Jeff King 5 years ago committed by Junio C Hamano
parent
commit
6663ae0a08
  1. 2
      builtin/pack-objects.c
  2. 4
      builtin/rev-list.c
  3. 26
      pack-bitmap.c
  4. 4
      pack-bitmap.h
  5. 2
      reachable.c

2
builtin/pack-objects.c

@ -3040,7 +3040,7 @@ static int pack_options_allow_reuse(void) @@ -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() &&

4
builtin/rev-list.c

@ -407,7 +407,7 @@ static int try_bitmap_count(struct rev_info *revs) @@ -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) @@ -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;


26
pack-bitmap.c

@ -12,6 +12,7 @@ @@ -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, @@ -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) @@ -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) @@ -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;


4
pack-bitmap.h

@ -8,6 +8,7 @@ @@ -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 *, @@ -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);

2
reachable.c

@ -223,7 +223,7 @@ void mark_reachable_objects(struct rev_info *revs, int mark_reflog, @@ -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);

Loading…
Cancel
Save