184
struct strbuf buf = STRBUF_INIT;
185
if (filter_options->choice)
186
die(_("multiple filter-specs cannot be combined"));
187
- filter_options->filter_spec = strdup(arg);
187
+ string_list_append(&filter_options->filter_spec, xstrdup(arg));
188
if (gently_parse_list_objects_filter(filter_options, arg, &buf))
189
die("%s", buf.buf);
190
return 0;
203
return parse_list_objects_filter(filter_options, arg);
204
}
205
206
-void expand_list_objects_filter_spec(
207
- const struct list_objects_filter_options *filter,
208
- struct strbuf *expanded_spec)
206
+const char *list_objects_filter_spec(struct list_objects_filter_options *filter)
207
{
210
- strbuf_init(expanded_spec, strlen(filter->filter_spec));
211
- if (filter->choice == LOFC_BLOB_LIMIT)
212
- strbuf_addf(expanded_spec, "blob:limit=%lu",
208
+ if (!filter->filter_spec.nr)
209
+ BUG("no filter_spec available for this filter");
210
+ if (filter->filter_spec.nr != 1) {
211
+ struct strbuf concatted = STRBUF_INIT;
212
+ strbuf_add_separated_string_list(
213
+ &concatted, "", &filter->filter_spec);
214
+ string_list_clear(&filter->filter_spec, /*free_util=*/0);
215
+ string_list_append(
216
+ &filter->filter_spec, strbuf_detach(&concatted, NULL));
217
+ }
218
+
219
+ return filter->filter_spec.items[0].string;
220
+}
221
+
222
+const char *expand_list_objects_filter_spec(
223
+ struct list_objects_filter_options *filter)
224
+{
225
+ if (filter->choice == LOFC_BLOB_LIMIT) {
226
+ struct strbuf expanded_spec = STRBUF_INIT;
227
+ strbuf_addf(&expanded_spec, "blob:limit=%lu",
228
filter->blob_limit_value);
214
- else if (filter->choice == LOFC_TREE_DEPTH)
215
- strbuf_addf(expanded_spec, "tree:%lu",
216
- filter->tree_exclude_depth);
217
- else
218
- strbuf_addstr(expanded_spec, filter->filter_spec);
229
+ string_list_clear(&filter->filter_spec, /*free_util=*/0);
230
+ string_list_append(
231
+ &filter->filter_spec,
232
+ strbuf_detach(&expanded_spec, NULL));
233
+ }
234
+
235
+ return list_objects_filter_spec(filter);
236
}
237
238
void list_objects_filter_release(
242
243
if (!filter_options)
244
return;
228
- free(filter_options->filter_spec);
245
+ string_list_clear(&filter_options->filter_spec, /*free_util=*/0);
246
free(filter_options->sparse_oid_value);
247
for (sub = 0; sub < filter_options->sub_nr; sub++)
248
list_objects_filter_release(&filter_options->sub[sub]);
252
253
void partial_clone_register(
254
const char *remote,
238
- const struct list_objects_filter_options *filter_options)
255
+ struct list_objects_filter_options *filter_options)
256
{
257
/*
258
* Record the name of the partial clone remote in the
275
* the default for subsequent fetches from this remote.
276
*/
277
core_partial_clone_filter_default =
261
- xstrdup(filter_options->filter_spec);
278
+ xstrdup(expand_list_objects_filter_spec(filter_options));
279
git_config_set("core.partialclonefilter",
280
core_partial_clone_filter_default);
281
}
291
if (!core_partial_clone_filter_default)
292
return;
293
277
- filter_options->filter_spec = strdup(core_partial_clone_filter_default);
294
+ string_list_append(&filter_options->filter_spec,
295
+ core_partial_clone_filter_default);
296
gently_parse_list_objects_filter(filter_options,
297
core_partial_clone_filter_default,
298
&errbuf);