Skip to content

Commit 298a958

Browse files
committed
Merge branch 'jk/list-objects-filter-cleanup'
A couple of bugfixes with code clean-up. * jk/list-objects-filter-cleanup: list-objects-filter: convert filter_spec to a strbuf list-objects-filter: add and use initializers list-objects-filter: handle null default filter spec list-objects-filter: don't memset after releasing filter struct
2 parents f876b5a + c54980a commit 298a958

11 files changed

+48
-50
lines changed

builtin/clone.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ static struct string_list option_optional_reference = STRING_LIST_INIT_NODUP;
7373
static int option_dissociate;
7474
static int max_jobs = -1;
7575
static struct string_list option_recurse_submodules = STRING_LIST_INIT_NODUP;
76-
static struct list_objects_filter_options filter_options;
76+
static struct list_objects_filter_options filter_options = LIST_OBJECTS_FILTER_INIT;
7777
static int option_filter_submodules = -1; /* unspecified */
7878
static int config_filter_submodules = -1; /* unspecified */
7979
static struct string_list server_options = STRING_LIST_INIT_NODUP;

builtin/fetch-pack.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
6262
packet_trace_identity("fetch-pack");
6363

6464
memset(&args, 0, sizeof(args));
65+
list_objects_filter_init(&args.filter_options);
6566
args.uploadpack = "git-upload-pack";
6667

6768
for (i = 1; i < argc && *argv[i] == '-'; i++) {

builtin/fetch.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ static int recurse_submodules_cli = RECURSE_SUBMODULES_DEFAULT;
8080
static int recurse_submodules_default = RECURSE_SUBMODULES_ON_DEMAND;
8181
static int shown_url = 0;
8282
static struct refspec refmap = REFSPEC_INIT_FETCH;
83-
static struct list_objects_filter_options filter_options;
83+
static struct list_objects_filter_options filter_options = LIST_OBJECTS_FILTER_INIT;
8484
static struct string_list server_options = STRING_LIST_INIT_DUP;
8585
static struct string_list negotiation_tip = STRING_LIST_INIT_NODUP;
8686
static int fetch_write_commit_graph = -1;

builtin/submodule--helper.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1746,8 +1746,10 @@ static int module_clone(int argc, const char **argv, const char *prefix)
17461746
{
17471747
int dissociate = 0, quiet = 0, progress = 0, require_init = 0;
17481748
struct module_clone_data clone_data = MODULE_CLONE_DATA_INIT;
1749-
struct list_objects_filter_options filter_options = { 0 };
17501749
struct string_list reference = STRING_LIST_INIT_NODUP;
1750+
struct list_objects_filter_options filter_options =
1751+
LIST_OBJECTS_FILTER_INIT;
1752+
17511753
struct option module_clone_options[] = {
17521754
OPT_STRING(0, "prefix", &clone_data.prefix,
17531755
N_("path"),
@@ -2620,7 +2622,8 @@ static int module_update(int argc, const char **argv, const char *prefix)
26202622
struct pathspec pathspec = { 0 };
26212623
struct pathspec pathspec2 = { 0 };
26222624
struct update_data opt = UPDATE_DATA_INIT;
2623-
struct list_objects_filter_options filter_options = { 0 };
2625+
struct list_objects_filter_options filter_options =
2626+
LIST_OBJECTS_FILTER_INIT;
26242627
int ret;
26252628
struct option module_update_options[] = {
26262629
OPT__FORCE(&opt.force, N_("force checkout updates"), 0),

bundle.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ struct bundle_header {
1818
{ \
1919
.prerequisites = STRING_LIST_INIT_DUP, \
2020
.references = STRING_LIST_INIT_DUP, \
21+
.filter = LIST_OBJECTS_FILTER_INIT, \
2122
}
2223
void bundle_header_init(struct bundle_header *header);
2324
void bundle_header_release(struct bundle_header *header);

list-objects-filter-options.c

Lines changed: 30 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ int gently_parse_list_objects_filter(
108108

109109
strbuf_addf(errbuf, _("invalid filter-spec '%s'"), arg);
110110

111-
memset(filter_options, 0, sizeof(*filter_options));
111+
list_objects_filter_init(filter_options);
112112
return 1;
113113
}
114114

@@ -187,10 +187,8 @@ static int parse_combine_filter(
187187

188188
cleanup:
189189
strbuf_list_free(subspecs);
190-
if (result) {
190+
if (result)
191191
list_objects_filter_release(filter_options);
192-
memset(filter_options, 0, sizeof(*filter_options));
193-
}
194192
return result;
195193
}
196194

@@ -204,10 +202,10 @@ static int allow_unencoded(char ch)
204202
static void filter_spec_append_urlencode(
205203
struct list_objects_filter_options *filter, const char *raw)
206204
{
207-
struct strbuf buf = STRBUF_INIT;
208-
strbuf_addstr_urlencode(&buf, raw, allow_unencoded);
209-
trace_printf("Add to combine filter-spec: %s\n", buf.buf);
210-
string_list_append_nodup(&filter->filter_spec, strbuf_detach(&buf, NULL));
205+
size_t orig_len = filter->filter_spec.len;
206+
strbuf_addstr_urlencode(&filter->filter_spec, raw, allow_unencoded);
207+
trace_printf("Add to combine filter-spec: %s\n",
208+
filter->filter_spec.buf + orig_len);
211209
}
212210

213211
/*
@@ -225,22 +223,21 @@ static void transform_to_combine_type(
225223
struct list_objects_filter_options *sub_array =
226224
xcalloc(initial_sub_alloc, sizeof(*sub_array));
227225
sub_array[0] = *filter_options;
228-
memset(filter_options, 0, sizeof(*filter_options));
229-
string_list_init_dup(&filter_options->filter_spec);
226+
list_objects_filter_init(filter_options);
230227
filter_options->sub = sub_array;
231228
filter_options->sub_alloc = initial_sub_alloc;
232229
}
233230
filter_options->sub_nr = 1;
234231
filter_options->choice = LOFC_COMBINE;
235-
string_list_append(&filter_options->filter_spec, "combine:");
232+
strbuf_addstr(&filter_options->filter_spec, "combine:");
236233
filter_spec_append_urlencode(
237234
filter_options,
238235
list_objects_filter_spec(&filter_options->sub[0]));
239236
/*
240237
* We don't need the filter_spec strings for subfilter specs, only the
241238
* top level.
242239
*/
243-
string_list_clear(&filter_options->sub[0].filter_spec, /*free_util=*/0);
240+
strbuf_release(&filter_options->sub[0].filter_spec);
244241
}
245242

246243
void list_objects_filter_die_if_populated(
@@ -257,14 +254,11 @@ void parse_list_objects_filter(
257254
struct strbuf errbuf = STRBUF_INIT;
258255
int parse_error;
259256

260-
if (!filter_options->filter_spec.strdup_strings) {
261-
if (filter_options->filter_spec.nr)
262-
BUG("unexpected non-allocated string in filter_spec");
263-
filter_options->filter_spec.strdup_strings = 1;
264-
}
257+
if (!filter_options->filter_spec.buf)
258+
BUG("filter_options not properly initialized");
265259

266260
if (!filter_options->choice) {
267-
string_list_append(&filter_options->filter_spec, arg);
261+
strbuf_addstr(&filter_options->filter_spec, arg);
268262

269263
parse_error = gently_parse_list_objects_filter(
270264
filter_options, arg, &errbuf);
@@ -275,7 +269,7 @@ void parse_list_objects_filter(
275269
*/
276270
transform_to_combine_type(filter_options);
277271

278-
string_list_append(&filter_options->filter_spec, "+");
272+
strbuf_addch(&filter_options->filter_spec, '+');
279273
filter_spec_append_urlencode(filter_options, arg);
280274
ALLOC_GROW_BY(filter_options->sub, filter_options->sub_nr, 1,
281275
filter_options->sub_alloc);
@@ -306,31 +300,18 @@ int opt_parse_list_objects_filter(const struct option *opt,
306300

307301
const char *list_objects_filter_spec(struct list_objects_filter_options *filter)
308302
{
309-
if (!filter->filter_spec.nr)
303+
if (!filter->filter_spec.len)
310304
BUG("no filter_spec available for this filter");
311-
if (filter->filter_spec.nr != 1) {
312-
struct strbuf concatted = STRBUF_INIT;
313-
strbuf_add_separated_string_list(
314-
&concatted, "", &filter->filter_spec);
315-
string_list_clear(&filter->filter_spec, /*free_util=*/0);
316-
string_list_append_nodup(
317-
&filter->filter_spec, strbuf_detach(&concatted, NULL));
318-
}
319-
320-
return filter->filter_spec.items[0].string;
305+
return filter->filter_spec.buf;
321306
}
322307

323308
const char *expand_list_objects_filter_spec(
324309
struct list_objects_filter_options *filter)
325310
{
326311
if (filter->choice == LOFC_BLOB_LIMIT) {
327-
struct strbuf expanded_spec = STRBUF_INIT;
328-
strbuf_addf(&expanded_spec, "blob:limit=%lu",
312+
strbuf_release(&filter->filter_spec);
313+
strbuf_addf(&filter->filter_spec, "blob:limit=%lu",
329314
filter->blob_limit_value);
330-
string_list_clear(&filter->filter_spec, /*free_util=*/0);
331-
string_list_append_nodup(
332-
&filter->filter_spec,
333-
strbuf_detach(&expanded_spec, NULL));
334315
}
335316

336317
return list_objects_filter_spec(filter);
@@ -343,12 +324,12 @@ void list_objects_filter_release(
343324

344325
if (!filter_options)
345326
return;
346-
string_list_clear(&filter_options->filter_spec, /*free_util=*/0);
327+
strbuf_release(&filter_options->filter_spec);
347328
free(filter_options->sparse_oid_name);
348329
for (sub = 0; sub < filter_options->sub_nr; sub++)
349330
list_objects_filter_release(&filter_options->sub[sub]);
350331
free(filter_options->sub);
351-
memset(filter_options, 0, sizeof(*filter_options));
332+
list_objects_filter_init(filter_options);
352333
}
353334

354335
void partial_clone_register(
@@ -401,11 +382,11 @@ void partial_clone_get_default_filter_spec(
401382
/*
402383
* Parse default value, but silently ignore it if it is invalid.
403384
*/
404-
if (!promisor)
385+
if (!promisor || !promisor->partial_clone_filter)
405386
return;
406387

407-
string_list_append(&filter_options->filter_spec,
408-
promisor->partial_clone_filter);
388+
strbuf_addstr(&filter_options->filter_spec,
389+
promisor->partial_clone_filter);
409390
gently_parse_list_objects_filter(filter_options,
410391
promisor->partial_clone_filter,
411392
&errbuf);
@@ -417,17 +398,21 @@ void list_objects_filter_copy(
417398
const struct list_objects_filter_options *src)
418399
{
419400
int i;
420-
struct string_list_item *item;
421401

422402
/* Copy everything. We will overwrite the pointers shortly. */
423403
memcpy(dest, src, sizeof(struct list_objects_filter_options));
424404

425-
string_list_init_dup(&dest->filter_spec);
426-
for_each_string_list_item(item, &src->filter_spec)
427-
string_list_append(&dest->filter_spec, item->string);
405+
strbuf_init(&dest->filter_spec, 0);
406+
strbuf_addbuf(&dest->filter_spec, &src->filter_spec);
428407
dest->sparse_oid_name = xstrdup_or_null(src->sparse_oid_name);
429408

430409
ALLOC_ARRAY(dest->sub, dest->sub_alloc);
431410
for (i = 0; i < src->sub_nr; i++)
432411
list_objects_filter_copy(&dest->sub[i], &src->sub[i]);
433412
}
413+
414+
void list_objects_filter_init(struct list_objects_filter_options *filter_options)
415+
{
416+
struct list_objects_filter_options blank = LIST_OBJECTS_FILTER_INIT;
417+
memcpy(filter_options, &blank, sizeof(*filter_options));
418+
}

list-objects-filter-options.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ struct list_objects_filter_options {
3535
* To get the raw filter spec given by the user, use the result of
3636
* list_objects_filter_spec().
3737
*/
38-
struct string_list filter_spec;
38+
struct strbuf filter_spec;
3939

4040
/*
4141
* 'choice' is determined by parsing the filter-spec. This indicates
@@ -69,6 +69,9 @@ struct list_objects_filter_options {
6969
*/
7070
};
7171

72+
#define LIST_OBJECTS_FILTER_INIT { .filter_spec = STRBUF_INIT }
73+
void list_objects_filter_init(struct list_objects_filter_options *filter_options);
74+
7275
/*
7376
* Parse value of the argument to the "filter" keyword.
7477
* On the command line this looks like:

revision.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1907,6 +1907,7 @@ void repo_init_revisions(struct repository *r,
19071907
}
19081908

19091909
init_display_notes(&revs->notes_opt);
1910+
list_objects_filter_init(&revs->filter);
19101911
}
19111912

19121913
static void add_pending_commit_list(struct rev_info *revs,

transport-helper.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1286,6 +1286,8 @@ int transport_helper_init(struct transport *transport, const char *name)
12861286
if (getenv("GIT_TRANSPORT_HELPER_DEBUG"))
12871287
debug = 1;
12881288

1289+
list_objects_filter_init(&data->transport_options.filter_options);
1290+
12891291
transport->data = data;
12901292
transport->vtable = &vtable;
12911293
transport->smart_options = &(data->transport_options);

transport.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1113,6 +1113,7 @@ struct transport *transport_get(struct remote *remote, const char *url)
11131113
* will be checked individually in git_connect.
11141114
*/
11151115
struct git_transport_data *data = xcalloc(1, sizeof(*data));
1116+
list_objects_filter_init(&data->options.filter_options);
11161117
ret->data = data;
11171118
ret->vtable = &builtin_smart_vtable;
11181119
ret->smart_options = &(data->options);

0 commit comments

Comments
 (0)