Browse Source

pack-objects: support filters with bitmaps

Just as rev-list recently learned to combine filters and bitmaps, let's
do the same for pack-objects. The infrastructure is all there; we just
need to pass along our filter options, and the pack-bitmap code will
decide to use bitmaps or not.

This unsurprisingly makes things faster for partial clones of large
repositories (here we're cloning linux.git):

  Test                               HEAD^               HEAD
  ------------------------------------------------------------------------------
  5310.11: simulated partial clone   38.94(37.28+5.87)   11.06(11.27+4.07) -71.6%

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
3ab3185f99
  1. 3
      builtin/pack-objects.c
  2. 4
      t/perf/p5310-pack-bitmaps.sh
  3. 14
      t/t5310-pack-bitmaps.sh

3
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, NULL)))
if (!(bitmap_git = prepare_bitmap_walk(revs, &filter_options)))
return -1;

if (pack_options_allow_reuse() &&
@ -3419,7 +3419,6 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix) @@ -3419,7 +3419,6 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
if (filter_options.choice) {
if (!pack_to_stdout)
die(_("cannot use --filter without --stdout"));
use_bitmap_index = 0;
}

/*

4
t/perf/p5310-pack-bitmaps.sh

@ -57,6 +57,10 @@ test_perf 'rev-list count with blob:limit=1k' ' @@ -57,6 +57,10 @@ test_perf 'rev-list count with blob:limit=1k' '
--filter=blob:limit=1k >/dev/null
'

test_perf 'simulated partial clone' '
git pack-objects --stdout --all --filter=blob:none </dev/null >/dev/null
'

test_expect_success 'create partial bitmap state' '
# pick a commit to represent the repo tip in the past
cutoff=$(git rev-list HEAD~100 -1) &&

14
t/t5310-pack-bitmaps.sh

@ -107,6 +107,20 @@ test_expect_success 'clone from bitmapped repository' ' @@ -107,6 +107,20 @@ test_expect_success 'clone from bitmapped repository' '
test_cmp expect actual
'

test_expect_success 'partial clone from bitmapped repository' '
test_config uploadpack.allowfilter true &&
git clone --no-local --bare --filter=blob:none . partial-clone.git &&
(
cd partial-clone.git &&
pack=$(echo objects/pack/*.pack) &&
git verify-pack -v "$pack" >have &&
awk "/blob/ { print \$1 }" <have >blobs &&
# we expect this single blob because of the direct ref
git rev-parse refs/tags/tagged-blob >expect &&
test_cmp expect blobs
)
'

test_expect_success 'setup further non-bitmapped commits' '
test_commit_bulk --id=further 10
'

Loading…
Cancel
Save