@@ -33,18 +33,14 @@ struct filter {
33
33
struct object * obj ,
34
34
const char * pathname ,
35
35
const char * filename ,
36
+ struct oidset * omits ,
36
37
void * filter_data );
37
38
38
39
void (* free_fn )(void * filter_data );
39
40
40
41
void * filter_data ;
41
- };
42
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. */
48
44
struct oidset * omits ;
49
45
};
50
46
@@ -54,10 +50,9 @@ static enum list_objects_filter_result filter_blobs_none(
54
50
struct object * obj ,
55
51
const char * pathname ,
56
52
const char * filename ,
53
+ struct oidset * omits ,
57
54
void * filter_data_ )
58
55
{
59
- struct filter_blobs_none_data * filter_data = filter_data_ ;
60
-
61
56
switch (filter_situation ) {
62
57
default :
63
58
BUG ("unknown filter_situation: %d" , filter_situation );
@@ -75,21 +70,16 @@ static enum list_objects_filter_result filter_blobs_none(
75
70
assert (obj -> type == OBJ_BLOB );
76
71
assert ((obj -> flags & SEEN ) == 0 );
77
72
78
- if (filter_data -> omits )
79
- oidset_insert (filter_data -> omits , & obj -> oid );
73
+ if (omits )
74
+ oidset_insert (omits , & obj -> oid );
80
75
return LOFR_MARK_SEEN ; /* but not LOFR_DO_SHOW (hard omit) */
81
76
}
82
77
}
83
78
84
79
static void filter_blobs_none__init (
85
- struct oidset * omitted ,
86
80
struct list_objects_filter_options * filter_options ,
87
81
struct filter * filter )
88
82
{
89
- struct filter_blobs_none_data * d = xcalloc (1 , sizeof (* d ));
90
- d -> omits = omitted ;
91
-
92
- filter -> filter_data = d ;
93
83
filter -> filter_object_fn = filter_blobs_none ;
94
84
filter -> free_fn = free ;
95
85
}
@@ -99,8 +89,6 @@ static void filter_blobs_none__init(
99
89
* Can OPTIONALLY collect a list of the omitted OIDs.
100
90
*/
101
91
struct filter_trees_depth_data {
102
- struct oidset * omits ;
103
-
104
92
/*
105
93
* Maps trees to the minimum depth at which they were seen. It is not
106
94
* necessary to re-traverse a tree at deeper or equal depths than it has
@@ -123,16 +111,16 @@ struct seen_map_entry {
123
111
/* Returns 1 if the oid was in the omits set before it was invoked. */
124
112
static int filter_trees_update_omits (
125
113
struct object * obj ,
126
- struct filter_trees_depth_data * filter_data ,
114
+ struct oidset * omits ,
127
115
int include_it )
128
116
{
129
- if (!filter_data -> omits )
117
+ if (!omits )
130
118
return 0 ;
131
119
132
120
if (include_it )
133
- return oidset_remove (filter_data -> omits , & obj -> oid );
121
+ return oidset_remove (omits , & obj -> oid );
134
122
else
135
- return oidset_insert (filter_data -> omits , & obj -> oid );
123
+ return oidset_insert (omits , & obj -> oid );
136
124
}
137
125
138
126
static enum list_objects_filter_result filter_trees_depth (
@@ -141,6 +129,7 @@ static enum list_objects_filter_result filter_trees_depth(
141
129
struct object * obj ,
142
130
const char * pathname ,
143
131
const char * filename ,
132
+ struct oidset * omits ,
144
133
void * filter_data_ )
145
134
{
146
135
struct filter_trees_depth_data * filter_data = filter_data_ ;
@@ -165,7 +154,7 @@ static enum list_objects_filter_result filter_trees_depth(
165
154
return LOFR_ZERO ;
166
155
167
156
case LOFS_BLOB :
168
- filter_trees_update_omits (obj , filter_data , include_it );
157
+ filter_trees_update_omits (obj , omits , include_it );
169
158
return include_it ? LOFR_MARK_SEEN | LOFR_DO_SHOW : LOFR_ZERO ;
170
159
171
160
case LOFS_BEGIN_TREE :
@@ -186,12 +175,12 @@ static enum list_objects_filter_result filter_trees_depth(
186
175
filter_res = LOFR_SKIP_TREE ;
187
176
} else {
188
177
int been_omitted = filter_trees_update_omits (
189
- obj , filter_data , include_it );
178
+ obj , omits , include_it );
190
179
seen_info -> depth = filter_data -> current_depth ;
191
180
192
181
if (include_it )
193
182
filter_res = LOFR_DO_SHOW ;
194
- else if (filter_data -> omits && !been_omitted )
183
+ else if (omits && !been_omitted )
195
184
/*
196
185
* Must update omit information of children
197
186
* recursively; they have not been omitted yet.
@@ -215,12 +204,10 @@ static void filter_trees_free(void *filter_data) {
215
204
}
216
205
217
206
static void filter_trees_depth__init (
218
- struct oidset * omitted ,
219
207
struct list_objects_filter_options * filter_options ,
220
208
struct filter * filter )
221
209
{
222
210
struct filter_trees_depth_data * d = xcalloc (1 , sizeof (* d ));
223
- d -> omits = omitted ;
224
211
oidmap_init (& d -> seen_at_depth , 0 );
225
212
d -> exclude_depth = filter_options -> tree_exclude_depth ;
226
213
d -> current_depth = 0 ;
@@ -235,7 +222,6 @@ static void filter_trees_depth__init(
235
222
* And to OPTIONALLY collect a list of the omitted OIDs.
236
223
*/
237
224
struct filter_blobs_limit_data {
238
- struct oidset * omits ;
239
225
unsigned long max_bytes ;
240
226
};
241
227
@@ -245,6 +231,7 @@ static enum list_objects_filter_result filter_blobs_limit(
245
231
struct object * obj ,
246
232
const char * pathname ,
247
233
const char * filename ,
234
+ struct oidset * omits ,
248
235
void * filter_data_ )
249
236
{
250
237
struct filter_blobs_limit_data * filter_data = filter_data_ ;
@@ -282,24 +269,22 @@ static enum list_objects_filter_result filter_blobs_limit(
282
269
if (object_length < filter_data -> max_bytes )
283
270
goto include_it ;
284
271
285
- if (filter_data -> omits )
286
- oidset_insert (filter_data -> omits , & obj -> oid );
272
+ if (omits )
273
+ oidset_insert (omits , & obj -> oid );
287
274
return LOFR_MARK_SEEN ; /* but not LOFR_DO_SHOW (hard omit) */
288
275
}
289
276
290
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 );
293
280
return LOFR_MARK_SEEN | LOFR_DO_SHOW ;
294
281
}
295
282
296
283
static void filter_blobs_limit__init (
297
- struct oidset * omitted ,
298
284
struct list_objects_filter_options * filter_options ,
299
285
struct filter * filter )
300
286
{
301
287
struct filter_blobs_limit_data * d = xcalloc (1 , sizeof (* d ));
302
- d -> omits = omitted ;
303
288
d -> max_bytes = filter_options -> blob_limit_value ;
304
289
305
290
filter -> filter_data = d ;
@@ -337,7 +322,6 @@ struct frame {
337
322
};
338
323
339
324
struct filter_sparse_data {
340
- struct oidset * omits ;
341
325
struct exclude_list el ;
342
326
343
327
size_t nr , alloc ;
@@ -350,6 +334,7 @@ static enum list_objects_filter_result filter_sparse(
350
334
struct object * obj ,
351
335
const char * pathname ,
352
336
const char * filename ,
337
+ struct oidset * omits ,
353
338
void * filter_data_ )
354
339
{
355
340
struct filter_sparse_data * filter_data = filter_data_ ;
@@ -432,8 +417,8 @@ static enum list_objects_filter_result filter_sparse(
432
417
if (val < 0 )
433
418
val = frame -> defval ;
434
419
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 );
437
422
return LOFR_MARK_SEEN | LOFR_DO_SHOW ;
438
423
}
439
424
@@ -447,8 +432,8 @@ static enum list_objects_filter_result filter_sparse(
447
432
* Leave the LOFR_ bits unset so that if the blob appears
448
433
* again in the traversal, we will be asked again.
449
434
*/
450
- if (filter_data -> omits )
451
- oidset_insert (filter_data -> omits , & obj -> oid );
435
+ if (omits )
436
+ oidset_insert (omits , & obj -> oid );
452
437
453
438
/*
454
439
* Remember that at least 1 blob in this tree was
@@ -469,12 +454,10 @@ static void filter_sparse_free(void *filter_data)
469
454
}
470
455
471
456
static void filter_sparse_oid__init (
472
- struct oidset * omitted ,
473
457
struct list_objects_filter_options * filter_options ,
474
458
struct filter * filter )
475
459
{
476
460
struct filter_sparse_data * d = xcalloc (1 , sizeof (* d ));
477
- d -> omits = omitted ;
478
461
if (add_excludes_from_blob_to_list (filter_options -> sparse_oid_value ,
479
462
NULL , 0 , & d -> el ) < 0 )
480
463
die ("could not load filter specification" );
@@ -489,7 +472,6 @@ static void filter_sparse_oid__init(
489
472
}
490
473
491
474
typedef void (* filter_init_fn )(
492
- struct oidset * omitted ,
493
475
struct list_objects_filter_options * filter_options ,
494
476
struct filter * filter );
495
477
@@ -522,7 +504,8 @@ struct filter *list_objects_filter__init(
522
504
return NULL ;
523
505
524
506
filter = xcalloc (1 , sizeof (* filter ));
525
- init_fn (omitted , filter_options , filter );
507
+ filter -> omits = omitted ;
508
+ init_fn (filter_options , filter );
526
509
return filter ;
527
510
}
528
511
@@ -537,6 +520,7 @@ enum list_objects_filter_result list_objects_filter__filter_object(
537
520
if (filter && (obj -> flags & NOT_USER_GIVEN ))
538
521
return filter -> filter_object_fn (r , filter_situation , obj ,
539
522
pathname , filename ,
523
+ filter -> omits ,
540
524
filter -> filter_data );
541
525
/*
542
526
* No filter is active or user gave object explicitly. Choose default
0 commit comments