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,