summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRené Scharfe <l.s.r@web.de>2022-11-12 11:44:00 +0100
committerTaylor Blau <me@ttaylorr.com>2022-11-12 23:58:15 -0500
commit90ba69e962da41e562bad8867f5e122aa793a3cc (patch)
tree01d85b422ed2b20391aa1569dee0b993bf8ea988
parent319605f8f00e402f3ea758a02c63534ff800a711 (diff)
downloadgit-90ba69e962da41e562bad8867f5e122aa793a3cc.tar.gz
pack-objects: fix handling of multiple --filter options
Since 5cb28270a1 (pack-objects: lazily set up "struct rev_info", don't leak, 2022-03-28) --filter options given to git pack-objects overrule earlier ones, letting only the leftmost win and leaking the memory allocated for earlier ones. Fix that by only initializing the rev_info struct once. Signed-off-by: René Scharfe <l.s.r@web.de> Signed-off-by: Taylor Blau <me@ttaylorr.com>
-rw-r--r--builtin/pack-objects.c3
-rwxr-xr-xt/t5317-pack-objects-filter-objects.sh19
2 files changed, 21 insertions, 1 deletions
diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c
index 573d0b20b7..c702c09dd4 100644
--- a/builtin/pack-objects.c
+++ b/builtin/pack-objects.c
@@ -4158,7 +4158,8 @@ static struct list_objects_filter_options *po_filter_revs_init(void *value)
{
struct po_filter_data *data = value;
- repo_init_revisions(the_repository, &data->revs, NULL);
+ if (!data->have_revs)
+ repo_init_revisions(the_repository, &data->revs, NULL);
data->have_revs = 1;
return &data->revs.filter;
diff --git a/t/t5317-pack-objects-filter-objects.sh b/t/t5317-pack-objects-filter-objects.sh
index bb633c9b09..bd8983bb56 100755
--- a/t/t5317-pack-objects-filter-objects.sh
+++ b/t/t5317-pack-objects-filter-objects.sh
@@ -178,6 +178,25 @@ test_expect_success 'verify blob:limit=1001' '
test_cmp expected observed
'
+test_expect_success 'verify blob:limit=1001+object:type=blob' '
+ git -C r2 ls-files -s large.1000 |
+ test_parse_ls_files_stage_oids |
+ sort >expected &&
+
+ git -C r2 pack-objects --revs --stdout --filter=blob:limit=1001 \
+ --filter=object:type=blob >filter.pack <<-EOF &&
+ HEAD
+ EOF
+ git -C r2 index-pack ../filter.pack &&
+
+ git -C r2 verify-pack -v ../filter.pack >verify_result &&
+ grep blob verify_result |
+ parse_verify_pack_blob_oid |
+ sort >observed &&
+
+ test_cmp expected observed
+'
+
test_expect_success 'verify blob:limit=10001' '
git -C r2 ls-files -s large.1000 large.10000 |
test_parse_ls_files_stage_oids |