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 results
maint
Junio C Hamano 2023-11-08 15:04:42 +09:00
commit 8ed4eb7538
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' '