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 <matvore@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Matthew DeVore committed Jun 27, 2019 at 15:54 UTC 7a7c7f4a6d22477e3548021eb3571384651c00be
1 file changed +26 -42
list-objects-filter.c
+26 -42
@@ -33,18 +33,14 @@ struct filter {
33 struct object *obj,
34 const char *pathname,
35 const char *filename,
36 + struct oidset *omits,
37 void *filter_data);
38
39 void (*free_fn)(void *filter_data);
40
41 void *filter_data;
41 -};
42
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. */
44 struct oidset *omits;
45 };
46
@@ -54,10 +50,9 @@ static enum list_objects_filter_result filter_blobs_none(
50 struct object *obj,
51 const char *pathname,
52 const char *filename,
53 + struct oidset *omits,
54 void *filter_data_)
55 {
59 - struct filter_blobs_none_data *filter_data = filter_data_;
60 -
56 switch (filter_situation) {
57 default:
58 BUG("unknown filter_situation: %d", filter_situation);
@@ -75,21 +70,16 @@ static enum list_objects_filter_result filter_blobs_none(
70 assert(obj->type == OBJ_BLOB);
71 assert((obj->flags & SEEN) == 0);
72
78 - if (filter_data->omits)
79 - oidset_insert(filter_data->omits, &obj->oid);
73 + if (omits)
74 + oidset_insert(omits, &obj->oid);
75 return LOFR_MARK_SEEN; /* but not LOFR_DO_SHOW (hard omit) */
76 }
77 }
78
79 static void filter_blobs_none__init(
85 - struct oidset *omitted,
80 struct list_objects_filter_options *filter_options,
81 struct filter *filter)
82 {
89 - struct filter_blobs_none_data *d = xcalloc(1, sizeof(*d));
90 - d->omits = omitted;
91 -
92 - filter->filter_data = d;
83 filter->filter_object_fn = filter_blobs_none;
84 filter->free_fn = free;
85 }
@@ -99,8 +89,6 @@ static void filter_blobs_none__init(
89 * Can OPTIONALLY collect a list of the omitted OIDs.
90 */
91 struct filter_trees_depth_data {
102 - struct oidset *omits;
103 -
92 /*
93 * Maps trees to the minimum depth at which they were seen. It is not
94 * necessary to re-traverse a tree at deeper or equal depths than it has
@@ -123,16 +111,16 @@ struct seen_map_entry {
111 /* Returns 1 if the oid was in the omits set before it was invoked. */
112 static int filter_trees_update_omits(
113 struct object *obj,
126 - struct filter_trees_depth_data *filter_data,
114 + struct oidset *omits,
115 int include_it)
116 {
129 - if (!filter_data->omits)
117 + if (!omits)
118 return 0;
119
120 if (include_it)
133 - return oidset_remove(filter_data->omits, &obj->oid);
121 + return oidset_remove(omits, &obj->oid);
122 else
135 - return oidset_insert(filter_data->omits, &obj->oid);
123 + return oidset_insert(omits, &obj->oid);
124 }
125
126 static enum list_objects_filter_result filter_trees_depth(
@@ -141,6 +129,7 @@ static enum list_objects_filter_result filter_trees_depth(
129 struct object *obj,
130 const char *pathname,
131 const char *filename,
132 + struct oidset *omits,
133 void *filter_data_)
134 {
135 struct filter_trees_depth_data *filter_data = filter_data_;
@@ -165,7 +154,7 @@ static enum list_objects_filter_result filter_trees_depth(
154 return LOFR_ZERO;
155
156 case LOFS_BLOB:
168 - filter_trees_update_omits(obj, filter_data, include_it);
157 + filter_trees_update_omits(obj, omits, include_it);
158 return include_it ? LOFR_MARK_SEEN | LOFR_DO_SHOW : LOFR_ZERO;
159
160 case LOFS_BEGIN_TREE:
@@ -186,12 +175,12 @@ static enum list_objects_filter_result filter_trees_depth(
175 filter_res = LOFR_SKIP_TREE;
176 } else {
177 int been_omitted = filter_trees_update_omits(
189 - obj, filter_data, include_it);
178 + obj, omits, include_it);
179 seen_info->depth = filter_data->current_depth;
180
181 if (include_it)
182 filter_res = LOFR_DO_SHOW;
194 - else if (filter_data->omits && !been_omitted)
183 + else if (omits && !been_omitted)
184 /*
185 * Must update omit information of children
186 * recursively; they have not been omitted yet.
@@ -215,12 +204,10 @@ static void filter_trees_free(void *filter_data) {
204 }
205
206 static void filter_trees_depth__init(
218 - struct oidset *omitted,
207 struct list_objects_filter_options *filter_options,
208 struct filter *filter)
209 {
210 struct filter_trees_depth_data *d = xcalloc(1, sizeof(*d));
223 - d->omits = omitted;
211 oidmap_init(&d->seen_at_depth, 0);
212 d->exclude_depth = filter_options->tree_exclude_depth;
213 d->current_depth = 0;
@@ -235,7 +222,6 @@ static void filter_trees_depth__init(
222 * And to OPTIONALLY collect a list of the omitted OIDs.
223 */
224 struct filter_blobs_limit_data {
238 - struct oidset *omits;
225 unsigned long max_bytes;
226 };
227
@@ -245,6 +231,7 @@ static enum list_objects_filter_result filter_blobs_limit(
231 struct object *obj,
232 const char *pathname,
233 const char *filename,
234 + struct oidset *omits,
235 void *filter_data_)
236 {
237 struct filter_blobs_limit_data *filter_data = filter_data_;
@@ -282,24 +269,22 @@ static enum list_objects_filter_result filter_blobs_limit(
269 if (object_length < filter_data->max_bytes)
270 goto include_it;
271
285 - if (filter_data->omits)
286 - oidset_insert(filter_data->omits, &obj->oid);
272 + if (omits)
273 + oidset_insert(omits, &obj->oid);
274 return LOFR_MARK_SEEN; /* but not LOFR_DO_SHOW (hard omit) */
275 }
276
277 include_it:
291 - if (filter_data->omits)
292 - oidset_remove(filter_data->omits, &obj->oid);
278 + if (omits)
279 + oidset_remove(omits, &obj->oid);
280 return LOFR_MARK_SEEN | LOFR_DO_SHOW;
281 }
282
283 static void filter_blobs_limit__init(
297 - struct oidset *omitted,
284 struct list_objects_filter_options *filter_options,
285 struct filter *filter)
286 {
287 struct filter_blobs_limit_data *d = xcalloc(1, sizeof(*d));
302 - d->omits = omitted;
288 d->max_bytes = filter_options->blob_limit_value;
289
290 filter->filter_data = d;
@@ -337,7 +322,6 @@ struct frame {
322 };
323
324 struct filter_sparse_data {
340 - struct oidset *omits;
325 struct exclude_list el;
326
327 size_t nr, alloc;
@@ -350,6 +334,7 @@ static enum list_objects_filter_result filter_sparse(
334 struct object *obj,
335 const char *pathname,
336 const char *filename,
337 + struct oidset *omits,
338 void *filter_data_)
339 {
340 struct filter_sparse_data *filter_data = filter_data_;
@@ -431,8 +416,8 @@ static enum list_objects_filter_result filter_sparse(
416 if (val < 0)
417 val = frame->defval;
418 if (val > 0) {
434 - if (filter_data->omits)
435 - oidset_remove(filter_data->omits, &obj->oid);
419 + if (omits)
420 + oidset_remove(omits, &obj->oid);
421 return LOFR_MARK_SEEN | LOFR_DO_SHOW;
422 }
423
@@ -446,8 +431,8 @@ static enum list_objects_filter_result filter_sparse(
431 * Leave the LOFR_ bits unset so that if the blob appears
432 * again in the traversal, we will be asked again.
433 */
449 - if (filter_data->omits)
450 - oidset_insert(filter_data->omits, &obj->oid);
434 + if (omits)
435 + oidset_insert(omits, &obj->oid);
436
437 /*
438 * Remember that at least 1 blob in this tree was
@@ -468,12 +453,10 @@ static void filter_sparse_free(void *filter_data)
453 }
454
455 static void filter_sparse_oid__init(
471 - struct oidset *omitted,
456 struct list_objects_filter_options *filter_options,
457 struct filter *filter)
458 {
459 struct filter_sparse_data *d = xcalloc(1, sizeof(*d));
476 - d->omits = omitted;
460 if (add_excludes_from_blob_to_list(filter_options->sparse_oid_value,
461 NULL, 0, &d->el) < 0)
462 die("could not load filter specification");
@@ -489,7 +472,6 @@ static void filter_sparse_oid__init(
472 }
473
474 typedef void (*filter_init_fn)(
492 - struct oidset *omitted,
475 struct list_objects_filter_options *filter_options,
476 struct filter *filter);
477
@@ -522,7 +504,8 @@ struct filter *list_objects_filter__init(
504 return NULL;
505
506 filter = xcalloc(1, sizeof(*filter));
525 - init_fn(omitted, filter_options, filter);
507 + filter->omits = omitted;
508 + init_fn(filter_options, filter);
509 return filter;
510 }
511
@@ -537,6 +520,7 @@ enum list_objects_filter_result list_objects_filter__filter_object(
520 if (filter && (obj->flags & NOT_USER_GIVEN))
521 return filter->filter_object_fn(r, filter_situation, obj,
522 pathname, filename,
523 + filter->omits,
524 filter->filter_data);
525 /*
526 * No filter is active or user gave object explicitly. In this case,