Skip to content

Commit 65cee9a

Browse files
matvoregitster
authored andcommitted
list-objects-filter: put omits set in filter struct
The oidset *omits pointer must be accessed by the combine filter in a type-agnostic way once the graph traversal is over. Store that pointer in the general `filter` struct. This will be used in a follow-up patch to implement the combine filter. Signed-off-by: Matthew DeVore <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent aa36553 commit 65cee9a

File tree

1 file changed

+26
-42
lines changed

1 file changed

+26
-42
lines changed

list-objects-filter.c

Lines changed: 26 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -33,18 +33,14 @@ struct filter {
3333
struct object *obj,
3434
const char *pathname,
3535
const char *filename,
36+
struct oidset *omits,
3637
void *filter_data);
3738

3839
void (*free_fn)(void *filter_data);
3940

4041
void *filter_data;
41-
};
4242

43-
/*
44-
* A filter for list-objects to omit ALL blobs from the traversal.
45-
* And to OPTIONALLY collect a list of the omitted OIDs.
46-
*/
47-
struct filter_blobs_none_data {
43+
/* If non-NULL, the filter collects a list of the omitted OIDs here. */
4844
struct oidset *omits;
4945
};
5046

@@ -54,10 +50,9 @@ static enum list_objects_filter_result filter_blobs_none(
5450
struct object *obj,
5551
const char *pathname,
5652
const char *filename,
53+
struct oidset *omits,
5754
void *filter_data_)
5855
{
59-
struct filter_blobs_none_data *filter_data = filter_data_;
60-
6156
switch (filter_situation) {
6257
default:
6358
BUG("unknown filter_situation: %d", filter_situation);
@@ -75,21 +70,16 @@ static enum list_objects_filter_result filter_blobs_none(
7570
assert(obj->type == OBJ_BLOB);
7671
assert((obj->flags & SEEN) == 0);
7772

78-
if (filter_data->omits)
79-
oidset_insert(filter_data->omits, &obj->oid);
73+
if (omits)
74+
oidset_insert(omits, &obj->oid);
8075
return LOFR_MARK_SEEN; /* but not LOFR_DO_SHOW (hard omit) */
8176
}
8277
}
8378

8479
static void filter_blobs_none__init(
85-
struct oidset *omitted,
8680
struct list_objects_filter_options *filter_options,
8781
struct filter *filter)
8882
{
89-
struct filter_blobs_none_data *d = xcalloc(1, sizeof(*d));
90-
d->omits = omitted;
91-
92-
filter->filter_data = d;
9383
filter->filter_object_fn = filter_blobs_none;
9484
filter->free_fn = free;
9585
}
@@ -99,8 +89,6 @@ static void filter_blobs_none__init(
9989
* Can OPTIONALLY collect a list of the omitted OIDs.
10090
*/
10191
struct filter_trees_depth_data {
102-
struct oidset *omits;
103-
10492
/*
10593
* Maps trees to the minimum depth at which they were seen. It is not
10694
* necessary to re-traverse a tree at deeper or equal depths than it has
@@ -123,16 +111,16 @@ struct seen_map_entry {
123111
/* Returns 1 if the oid was in the omits set before it was invoked. */
124112
static int filter_trees_update_omits(
125113
struct object *obj,
126-
struct filter_trees_depth_data *filter_data,
114+
struct oidset *omits,
127115
int include_it)
128116
{
129-
if (!filter_data->omits)
117+
if (!omits)
130118
return 0;
131119

132120
if (include_it)
133-
return oidset_remove(filter_data->omits, &obj->oid);
121+
return oidset_remove(omits, &obj->oid);
134122
else
135-
return oidset_insert(filter_data->omits, &obj->oid);
123+
return oidset_insert(omits, &obj->oid);
136124
}
137125

138126
static enum list_objects_filter_result filter_trees_depth(
@@ -141,6 +129,7 @@ static enum list_objects_filter_result filter_trees_depth(
141129
struct object *obj,
142130
const char *pathname,
143131
const char *filename,
132+
struct oidset *omits,
144133
void *filter_data_)
145134
{
146135
struct filter_trees_depth_data *filter_data = filter_data_;
@@ -165,7 +154,7 @@ static enum list_objects_filter_result filter_trees_depth(
165154
return LOFR_ZERO;
166155

167156
case LOFS_BLOB:
168-
filter_trees_update_omits(obj, filter_data, include_it);
157+
filter_trees_update_omits(obj, omits, include_it);
169158
return include_it ? LOFR_MARK_SEEN | LOFR_DO_SHOW : LOFR_ZERO;
170159

171160
case LOFS_BEGIN_TREE:
@@ -186,12 +175,12 @@ static enum list_objects_filter_result filter_trees_depth(
186175
filter_res = LOFR_SKIP_TREE;
187176
} else {
188177
int been_omitted = filter_trees_update_omits(
189-
obj, filter_data, include_it);
178+
obj, omits, include_it);
190179
seen_info->depth = filter_data->current_depth;
191180

192181
if (include_it)
193182
filter_res = LOFR_DO_SHOW;
194-
else if (filter_data->omits && !been_omitted)
183+
else if (omits && !been_omitted)
195184
/*
196185
* Must update omit information of children
197186
* recursively; they have not been omitted yet.
@@ -215,12 +204,10 @@ static void filter_trees_free(void *filter_data) {
215204
}
216205

217206
static void filter_trees_depth__init(
218-
struct oidset *omitted,
219207
struct list_objects_filter_options *filter_options,
220208
struct filter *filter)
221209
{
222210
struct filter_trees_depth_data *d = xcalloc(1, sizeof(*d));
223-
d->omits = omitted;
224211
oidmap_init(&d->seen_at_depth, 0);
225212
d->exclude_depth = filter_options->tree_exclude_depth;
226213
d->current_depth = 0;
@@ -235,7 +222,6 @@ static void filter_trees_depth__init(
235222
* And to OPTIONALLY collect a list of the omitted OIDs.
236223
*/
237224
struct filter_blobs_limit_data {
238-
struct oidset *omits;
239225
unsigned long max_bytes;
240226
};
241227

@@ -245,6 +231,7 @@ static enum list_objects_filter_result filter_blobs_limit(
245231
struct object *obj,
246232
const char *pathname,
247233
const char *filename,
234+
struct oidset *omits,
248235
void *filter_data_)
249236
{
250237
struct filter_blobs_limit_data *filter_data = filter_data_;
@@ -282,24 +269,22 @@ static enum list_objects_filter_result filter_blobs_limit(
282269
if (object_length < filter_data->max_bytes)
283270
goto include_it;
284271

285-
if (filter_data->omits)
286-
oidset_insert(filter_data->omits, &obj->oid);
272+
if (omits)
273+
oidset_insert(omits, &obj->oid);
287274
return LOFR_MARK_SEEN; /* but not LOFR_DO_SHOW (hard omit) */
288275
}
289276

290277
include_it:
291-
if (filter_data->omits)
292-
oidset_remove(filter_data->omits, &obj->oid);
278+
if (omits)
279+
oidset_remove(omits, &obj->oid);
293280
return LOFR_MARK_SEEN | LOFR_DO_SHOW;
294281
}
295282

296283
static void filter_blobs_limit__init(
297-
struct oidset *omitted,
298284
struct list_objects_filter_options *filter_options,
299285
struct filter *filter)
300286
{
301287
struct filter_blobs_limit_data *d = xcalloc(1, sizeof(*d));
302-
d->omits = omitted;
303288
d->max_bytes = filter_options->blob_limit_value;
304289

305290
filter->filter_data = d;
@@ -337,7 +322,6 @@ struct frame {
337322
};
338323

339324
struct filter_sparse_data {
340-
struct oidset *omits;
341325
struct exclude_list el;
342326

343327
size_t nr, alloc;
@@ -350,6 +334,7 @@ static enum list_objects_filter_result filter_sparse(
350334
struct object *obj,
351335
const char *pathname,
352336
const char *filename,
337+
struct oidset *omits,
353338
void *filter_data_)
354339
{
355340
struct filter_sparse_data *filter_data = filter_data_;
@@ -432,8 +417,8 @@ static enum list_objects_filter_result filter_sparse(
432417
if (val < 0)
433418
val = frame->defval;
434419
if (val > 0) {
435-
if (filter_data->omits)
436-
oidset_remove(filter_data->omits, &obj->oid);
420+
if (omits)
421+
oidset_remove(omits, &obj->oid);
437422
return LOFR_MARK_SEEN | LOFR_DO_SHOW;
438423
}
439424

@@ -447,8 +432,8 @@ static enum list_objects_filter_result filter_sparse(
447432
* Leave the LOFR_ bits unset so that if the blob appears
448433
* again in the traversal, we will be asked again.
449434
*/
450-
if (filter_data->omits)
451-
oidset_insert(filter_data->omits, &obj->oid);
435+
if (omits)
436+
oidset_insert(omits, &obj->oid);
452437

453438
/*
454439
* Remember that at least 1 blob in this tree was
@@ -469,12 +454,10 @@ static void filter_sparse_free(void *filter_data)
469454
}
470455

471456
static void filter_sparse_oid__init(
472-
struct oidset *omitted,
473457
struct list_objects_filter_options *filter_options,
474458
struct filter *filter)
475459
{
476460
struct filter_sparse_data *d = xcalloc(1, sizeof(*d));
477-
d->omits = omitted;
478461
if (add_excludes_from_blob_to_list(filter_options->sparse_oid_value,
479462
NULL, 0, &d->el) < 0)
480463
die("could not load filter specification");
@@ -489,7 +472,6 @@ static void filter_sparse_oid__init(
489472
}
490473

491474
typedef void (*filter_init_fn)(
492-
struct oidset *omitted,
493475
struct list_objects_filter_options *filter_options,
494476
struct filter *filter);
495477

@@ -522,7 +504,8 @@ struct filter *list_objects_filter__init(
522504
return NULL;
523505

524506
filter = xcalloc(1, sizeof(*filter));
525-
init_fn(omitted, filter_options, filter);
507+
filter->omits = omitted;
508+
init_fn(filter_options, filter);
526509
return filter;
527510
}
528511

@@ -537,6 +520,7 @@ enum list_objects_filter_result list_objects_filter__filter_object(
537520
if (filter && (obj->flags & NOT_USER_GIVEN))
538521
return filter->filter_object_fn(r, filter_situation, obj,
539522
pathname, filename,
523+
filter->omits,
540524
filter->filter_data);
541525
/*
542526
* No filter is active or user gave object explicitly. Choose default

0 commit comments

Comments
 (0)