Merge branch 'tb/rev-list-unpacked-fix' into next

"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 results
This commit is contained in:
Junio C Hamano
2023-11-08 11:07:34 +09:00
5 changed files with 63 additions and 0 deletions

View File

@ -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);
}

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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' '