Skip to content

Commit 8ed4eb7

Browse files
committed
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
2 parents c732f74 + 7b3c8e9 commit 8ed4eb7

File tree

5 files changed

+63
-0
lines changed

5 files changed

+63
-0
lines changed

list-objects.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ static void show_object(struct traversal_context *ctx,
3939
{
4040
if (!ctx->show_object)
4141
return;
42+
if (ctx->revs->unpacked && has_object_pack(&object->oid))
43+
return;
44+
4245
ctx->show_object(object, name, ctx->show_data);
4346
}
4447

pack-bitmap.c

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1666,6 +1666,30 @@ static int can_filter_bitmap(struct list_objects_filter_options *filter)
16661666
return !filter_bitmap(NULL, NULL, NULL, filter);
16671667
}
16681668

1669+
1670+
static void filter_packed_objects_from_bitmap(struct bitmap_index *bitmap_git,
1671+
struct bitmap *result)
1672+
{
1673+
struct eindex *eindex = &bitmap_git->ext_index;
1674+
uint32_t objects_nr;
1675+
size_t i, pos;
1676+
1677+
objects_nr = bitmap_num_objects(bitmap_git);
1678+
pos = objects_nr / BITS_IN_EWORD;
1679+
1680+
if (pos > result->word_alloc)
1681+
pos = result->word_alloc;
1682+
1683+
memset(result->words, 0x00, sizeof(eword_t) * pos);
1684+
for (i = pos * BITS_IN_EWORD; i < objects_nr; i++)
1685+
bitmap_unset(result, i);
1686+
1687+
for (i = 0; i < eindex->count; ++i) {
1688+
if (has_object_pack(&eindex->objects[i]->oid))
1689+
bitmap_unset(result, objects_nr + i);
1690+
}
1691+
}
1692+
16691693
struct bitmap_index *prepare_bitmap_walk(struct rev_info *revs,
16701694
int filter_provided_objects)
16711695
{
@@ -1788,6 +1812,9 @@ struct bitmap_index *prepare_bitmap_walk(struct rev_info *revs,
17881812
wants_bitmap,
17891813
&revs->filter);
17901814

1815+
if (revs->unpacked)
1816+
filter_packed_objects_from_bitmap(bitmap_git, wants_bitmap);
1817+
17911818
bitmap_git->result = wants_bitmap;
17921819
bitmap_git->haves = haves_bitmap;
17931820

t/t6000-rev-list-misc.sh

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,4 +169,17 @@ test_expect_success 'rev-list --count --objects' '
169169
test_line_count = $count actual
170170
'
171171

172+
test_expect_success 'rev-list --unpacked' '
173+
git repack -ad &&
174+
test_commit unpacked &&
175+
176+
git rev-list --objects --no-object-names unpacked^.. >expect.raw &&
177+
sort expect.raw >expect &&
178+
179+
git rev-list --all --objects --unpacked --no-object-names >actual.raw &&
180+
sort actual.raw >actual &&
181+
182+
test_cmp expect actual
183+
'
184+
172185
test_done

t/t6113-rev-list-bitmap-filters.sh

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,4 +141,17 @@ test_expect_success 'combine filter with --filter-provided-objects' '
141141
done <objects
142142
'
143143

144+
test_expect_success 'bitmap traversal with --unpacked' '
145+
git repack -adb &&
146+
test_commit unpacked &&
147+
148+
git rev-list --objects --no-object-names unpacked^.. >expect.raw &&
149+
sort expect.raw >expect &&
150+
151+
git rev-list --use-bitmap-index --objects --all --unpacked >actual.raw &&
152+
sort actual.raw >actual &&
153+
154+
test_cmp expect actual
155+
'
156+
144157
test_done

t/t6115-rev-list-du.sh

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,13 @@ check_du HEAD
4848
check_du --objects HEAD
4949
check_du --objects HEAD^..HEAD
5050

51+
test_expect_success 'setup for --unpacked tests' '
52+
git repack -adb &&
53+
test_commit unpacked
54+
'
55+
56+
check_du --all --objects --unpacked
57+
5158
# As mentioned above, don't use hardcode sizes as actual size, but use the
5259
# output from git cat-file.
5360
test_expect_success 'rev-list --disk-usage=human' '

0 commit comments

Comments
 (0)