Skip to content

Commit

Permalink
Merge branch 'tb/rev-list-unpacked-fix'
Browse files Browse the repository at this point in the history
"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
  • Loading branch information
gitster committed Nov 8, 2023
2 parents c732f74 + 7b3c8e9 commit 8ed4eb7
Show file tree
Hide file tree
Showing 5 changed files with 63 additions and 0 deletions.
3 changes: 3 additions & 0 deletions list-objects.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down
27 changes: 27 additions & 0 deletions pack-bitmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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;

Expand Down
13 changes: 13 additions & 0 deletions t/t6000-rev-list-misc.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
13 changes: 13 additions & 0 deletions t/t6113-rev-list-bitmap-filters.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
7 changes: 7 additions & 0 deletions t/t6115-rev-list-du.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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' '
Expand Down

0 comments on commit 8ed4eb7

Please sign in to comment.