Merge branch 'tb/rev-list-unpacked-fix'
"git rev-list --unpacked --objects" failed to exclude packed non-commit objects, which has been corrected. * tb/rev-list-unpacked-fix: pack-bitmap: drop --unpacked non-commit objects from results list-objects: drop --unpacked non-commit objects from resultsmaint
commit
8ed4eb7538
|
@ -39,6 +39,9 @@ static void show_object(struct traversal_context *ctx,
|
|||
{
|
||||
if (!ctx->show_object)
|
||||
return;
|
||||
if (ctx->revs->unpacked && has_object_pack(&object->oid))
|
||||
return;
|
||||
|
||||
ctx->show_object(object, name, ctx->show_data);
|
||||
}
|
||||
|
||||
|
|
|
@ -1666,6 +1666,30 @@ static int can_filter_bitmap(struct list_objects_filter_options *filter)
|
|||
return !filter_bitmap(NULL, NULL, NULL, filter);
|
||||
}
|
||||
|
||||
|
||||
static void filter_packed_objects_from_bitmap(struct bitmap_index *bitmap_git,
|
||||
struct bitmap *result)
|
||||
{
|
||||
struct eindex *eindex = &bitmap_git->ext_index;
|
||||
uint32_t objects_nr;
|
||||
size_t i, pos;
|
||||
|
||||
objects_nr = bitmap_num_objects(bitmap_git);
|
||||
pos = objects_nr / BITS_IN_EWORD;
|
||||
|
||||
if (pos > result->word_alloc)
|
||||
pos = result->word_alloc;
|
||||
|
||||
memset(result->words, 0x00, sizeof(eword_t) * pos);
|
||||
for (i = pos * BITS_IN_EWORD; i < objects_nr; i++)
|
||||
bitmap_unset(result, i);
|
||||
|
||||
for (i = 0; i < eindex->count; ++i) {
|
||||
if (has_object_pack(&eindex->objects[i]->oid))
|
||||
bitmap_unset(result, objects_nr + i);
|
||||
}
|
||||
}
|
||||
|
||||
struct bitmap_index *prepare_bitmap_walk(struct rev_info *revs,
|
||||
int filter_provided_objects)
|
||||
{
|
||||
|
@ -1788,6 +1812,9 @@ struct bitmap_index *prepare_bitmap_walk(struct rev_info *revs,
|
|||
wants_bitmap,
|
||||
&revs->filter);
|
||||
|
||||
if (revs->unpacked)
|
||||
filter_packed_objects_from_bitmap(bitmap_git, wants_bitmap);
|
||||
|
||||
bitmap_git->result = wants_bitmap;
|
||||
bitmap_git->haves = haves_bitmap;
|
||||
|
||||
|
|
|
@ -169,4 +169,17 @@ test_expect_success 'rev-list --count --objects' '
|
|||
test_line_count = $count actual
|
||||
'
|
||||
|
||||
test_expect_success 'rev-list --unpacked' '
|
||||
git repack -ad &&
|
||||
test_commit unpacked &&
|
||||
|
||||
git rev-list --objects --no-object-names unpacked^.. >expect.raw &&
|
||||
sort expect.raw >expect &&
|
||||
|
||||
git rev-list --all --objects --unpacked --no-object-names >actual.raw &&
|
||||
sort actual.raw >actual &&
|
||||
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_done
|
||||
|
|
|
@ -141,4 +141,17 @@ test_expect_success 'combine filter with --filter-provided-objects' '
|
|||
done <objects
|
||||
'
|
||||
|
||||
test_expect_success 'bitmap traversal with --unpacked' '
|
||||
git repack -adb &&
|
||||
test_commit unpacked &&
|
||||
|
||||
git rev-list --objects --no-object-names unpacked^.. >expect.raw &&
|
||||
sort expect.raw >expect &&
|
||||
|
||||
git rev-list --use-bitmap-index --objects --all --unpacked >actual.raw &&
|
||||
sort actual.raw >actual &&
|
||||
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_done
|
||||
|
|
|
@ -48,6 +48,13 @@ check_du HEAD
|
|||
check_du --objects HEAD
|
||||
check_du --objects HEAD^..HEAD
|
||||
|
||||
test_expect_success 'setup for --unpacked tests' '
|
||||
git repack -adb &&
|
||||
test_commit unpacked
|
||||
'
|
||||
|
||||
check_du --all --objects --unpacked
|
||||
|
||||
# As mentioned above, don't use hardcode sizes as actual size, but use the
|
||||
# output from git cat-file.
|
||||
test_expect_success 'rev-list --disk-usage=human' '
|
||||
|
|
Loading…
Reference in New Issue