list-objects: store common func args in struct
This will make utility functions easier to create, as done by the next patch. Signed-off-by: Matthew DeVore <matvore@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Matthew DeVore committed
Aug 13, 2018 at 11:14 UTC
f447a499dbb8be3a9f76f8099938129c74fcbd32
1 file changed
+74
-84
list-objects.c
+74
-84
@@ -12,20 +12,25 @@
12
#include "packfile.h"
13
#include "object-store.h"
14
15
-static void process_blob(struct rev_info *revs,
15
+struct traversal_context {
16
+ struct rev_info *revs;
17
+ show_object_fn show_object;
18
+ show_commit_fn show_commit;
19
+ void *show_data;
20
+ filter_object_fn filter_fn;
21
+ void *filter_data;
22
+};
23
+
24
+static void process_blob(struct traversal_context *ctx,
25
struct blob *blob,
17
- show_object_fn show,
26
struct strbuf *path,
19
- const char *name,
20
- void *cb_data,
21
- filter_object_fn filter_fn,
22
- void *filter_data)
27
+ const char *name)
28
{
29
struct object *obj = &blob->object;
30
size_t pathlen;
31
enum list_objects_filter_result r = LOFR_MARK_SEEN | LOFR_DO_SHOW;
32
28
- if (!revs->blob_objects)
33
+ if (!ctx->revs->blob_objects)
34
return;
35
if (!obj)
36
die("bad blob object");
@@ -41,21 +46,21 @@ static void process_blob(struct rev_info *revs,
46
* may cause the actual filter to report an incomplete list
47
* of missing objects.
48
*/
44
- if (revs->exclude_promisor_objects &&
49
+ if (ctx->revs->exclude_promisor_objects &&
50
!has_object_file(&obj->oid) &&
51
is_promisor_object(&obj->oid))
52
return;
53
54
pathlen = path->len;
55
strbuf_addstr(path, name);
51
- if (!(obj->flags & USER_GIVEN) && filter_fn)
52
- r = filter_fn(LOFS_BLOB, obj,
53
- path->buf, &path->buf[pathlen],
54
- filter_data);
56
+ if (!(obj->flags & USER_GIVEN) && ctx->filter_fn)
57
+ r = ctx->filter_fn(LOFS_BLOB, obj,
58
+ path->buf, &path->buf[pathlen],
59
+ ctx->filter_data);
60
if (r & LOFR_MARK_SEEN)
61
obj->flags |= SEEN;
62
if (r & LOFR_DO_SHOW)
58
- show(obj, path->buf, cb_data);
63
+ ctx->show_object(obj, path->buf, ctx->show_data);
64
strbuf_setlen(path, pathlen);
65
}
66
@@ -81,26 +86,21 @@ static void process_blob(struct rev_info *revs,
86
* the link, and how to do it. Whether it necessarily makes
87
* any sense what-so-ever to ever do that is another issue.
88
*/
84
-static void process_gitlink(struct rev_info *revs,
89
+static void process_gitlink(struct traversal_context *ctx,
90
const unsigned char *sha1,
86
- show_object_fn show,
91
struct strbuf *path,
88
- const char *name,
89
- void *cb_data)
92
+ const char *name)
93
{
94
/* Nothing to do */
95
}
96
94
-static void process_tree(struct rev_info *revs,
97
+static void process_tree(struct traversal_context *ctx,
98
struct tree *tree,
96
- show_object_fn show,
99
struct strbuf *base,
98
- const char *name,
99
- void *cb_data,
100
- filter_object_fn filter_fn,
101
- void *filter_data)
100
+ const char *name)
101
{
102
struct object *obj = &tree->object;
103
+ struct rev_info *revs = ctx->revs;
104
struct tree_desc desc;
105
struct name_entry entry;
106
enum interesting match = revs->diffopt.pathspec.nr == 0 ?
@@ -133,14 +133,14 @@ static void process_tree(struct rev_info *revs,
133
}
134
135
strbuf_addstr(base, name);
136
- if (!(obj->flags & USER_GIVEN) && filter_fn)
137
- r = filter_fn(LOFS_BEGIN_TREE, obj,
138
- base->buf, &base->buf[baselen],
139
- filter_data);
136
+ if (!(obj->flags & USER_GIVEN) && ctx->filter_fn)
137
+ r = ctx->filter_fn(LOFS_BEGIN_TREE, obj,
138
+ base->buf, &base->buf[baselen],
139
+ ctx->filter_data);
140
if (r & LOFR_MARK_SEEN)
141
obj->flags |= SEEN;
142
if (r & LOFR_DO_SHOW)
143
- show(obj, base->buf, cb_data);
143
+ ctx->show_object(obj, base->buf, ctx->show_data);
144
if (base->len)
145
strbuf_addch(base, '/');
146
@@ -157,29 +157,25 @@ static void process_tree(struct rev_info *revs,
157
}
158
159
if (S_ISDIR(entry.mode))
160
- process_tree(revs,
160
+ process_tree(ctx,
161
lookup_tree(the_repository, entry.oid),
162
- show, base, entry.path,
163
- cb_data, filter_fn, filter_data);
162
+ base, entry.path);
163
else if (S_ISGITLINK(entry.mode))
165
- process_gitlink(revs, entry.oid->hash,
166
- show, base, entry.path,
167
- cb_data);
164
+ process_gitlink(ctx, entry.oid->hash, base, entry.path);
165
else
169
- process_blob(revs,
166
+ process_blob(ctx,
167
lookup_blob(the_repository, entry.oid),
171
- show, base, entry.path,
172
- cb_data, filter_fn, filter_data);
168
+ base, entry.path);
169
}
170
175
- if (!(obj->flags & USER_GIVEN) && filter_fn) {
176
- r = filter_fn(LOFS_END_TREE, obj,
177
- base->buf, &base->buf[baselen],
178
- filter_data);
171
+ if (!(obj->flags & USER_GIVEN) && ctx->filter_fn) {
172
+ r = ctx->filter_fn(LOFS_END_TREE, obj,
173
+ base->buf, &base->buf[baselen],
174
+ ctx->filter_data);
175
if (r & LOFR_MARK_SEEN)
176
obj->flags |= SEEN;
177
if (r & LOFR_DO_SHOW)
182
- show(obj, base->buf, cb_data);
178
+ ctx->show_object(obj, base->buf, ctx->show_data);
179
}
180
181
strbuf_setlen(base, baselen);
@@ -242,19 +238,15 @@ static void add_pending_tree(struct rev_info *revs, struct tree *tree)
238
add_pending_object(revs, &tree->object, "");
239
}
240
245
-static void traverse_trees_and_blobs(struct rev_info *revs,
246
- struct strbuf *base,
247
- show_object_fn show_object,
248
- void *show_data,
249
- filter_object_fn filter_fn,
250
- void *filter_data)
241
+static void traverse_trees_and_blobs(struct traversal_context *ctx,
242
+ struct strbuf *base)
243
{
244
int i;
245
246
assert(base->len == 0);
247
256
- for (i = 0; i < revs->pending.nr; i++) {
257
- struct object_array_entry *pending = revs->pending.objects + i;
248
+ for (i = 0; i < ctx->revs->pending.nr; i++) {
249
+ struct object_array_entry *pending = ctx->revs->pending.objects + i;
250
struct object *obj = pending->item;
251
const char *name = pending->name;
252
const char *path = pending->path;
@@ -262,62 +254,49 @@ static void traverse_trees_and_blobs(struct rev_info *revs,
254
continue;
255
if (obj->type == OBJ_TAG) {
256
obj->flags |= SEEN;
265
- show_object(obj, name, show_data);
257
+ ctx->show_object(obj, name, ctx->show_data);
258
continue;
259
}
260
if (!path)
261
path = "";
262
if (obj->type == OBJ_TREE) {
271
- process_tree(revs, (struct tree *)obj, show_object,
272
- base, path, show_data,
273
- filter_fn, filter_data);
263
+ process_tree(ctx, (struct tree *)obj, base, path);
264
continue;
265
}
266
if (obj->type == OBJ_BLOB) {
277
- process_blob(revs, (struct blob *)obj, show_object,
278
- base, path, show_data,
279
- filter_fn, filter_data);
267
+ process_blob(ctx, (struct blob *)obj, base, path);
268
continue;
269
}
270
die("unknown pending object %s (%s)",
271
oid_to_hex(&obj->oid), name);
272
}
285
- object_array_clear(&revs->pending);
273
+ object_array_clear(&ctx->revs->pending);
274
}
275
288
-static void do_traverse(struct rev_info *revs,
289
- show_commit_fn show_commit,
290
- show_object_fn show_object,
291
- void *show_data,
292
- filter_object_fn filter_fn,
293
- void *filter_data)
276
+static void do_traverse(struct traversal_context *ctx)
277
{
278
struct commit *commit;
279
struct strbuf csp; /* callee's scratch pad */
280
strbuf_init(&csp, PATH_MAX);
281
299
- while ((commit = get_revision(revs)) != NULL) {
282
+ while ((commit = get_revision(ctx->revs)) != NULL) {
283
/*
284
* an uninteresting boundary commit may not have its tree
285
* parsed yet, but we are not going to show them anyway
286
*/
287
if (get_commit_tree(commit))
305
- add_pending_tree(revs, get_commit_tree(commit));
306
- show_commit(commit, show_data);
288
+ add_pending_tree(ctx->revs, get_commit_tree(commit));
289
+ ctx->show_commit(commit, ctx->show_data);
290
308
- if (revs->tree_blobs_in_commit_order)
291
+ if (ctx->revs->tree_blobs_in_commit_order)
292
/*
293
* NEEDSWORK: Adding the tree and then flushing it here
294
* needs a reallocation for each commit. Can we pass the
295
* tree directory without allocation churn?
296
*/
314
- traverse_trees_and_blobs(revs, &csp,
315
- show_object, show_data,
316
- filter_fn, filter_data);
297
+ traverse_trees_and_blobs(ctx, &csp);
298
}
318
- traverse_trees_and_blobs(revs, &csp,
319
- show_object, show_data,
320
- filter_fn, filter_data);
299
+ traverse_trees_and_blobs(ctx, &csp);
300
strbuf_release(&csp);
301
}
302
@@ -326,7 +305,14 @@ void traverse_commit_list(struct rev_info *revs,
305
show_object_fn show_object,
306
void *show_data)
307
{
329
- do_traverse(revs, show_commit, show_object, show_data, NULL, NULL);
308
+ struct traversal_context ctx;
309
+ ctx.revs = revs;
310
+ ctx.show_commit = show_commit;
311
+ ctx.show_object = show_object;
312
+ ctx.show_data = show_data;
313
+ ctx.filter_fn = NULL;
314
+ ctx.filter_data = NULL;
315
+ do_traverse(&ctx);
316
}
317
318
void traverse_commit_list_filtered(
@@ -337,14 +323,18 @@ void traverse_commit_list_filtered(
323
void *show_data,
324
struct oidset *omitted)
325
{
340
- filter_object_fn filter_fn = NULL;
326
+ struct traversal_context ctx;
327
filter_free_fn filter_free_fn = NULL;
342
- void *filter_data = NULL;
343
-
344
- filter_data = list_objects_filter__init(omitted, filter_options,
345
- &filter_fn, &filter_free_fn);
346
- do_traverse(revs, show_commit, show_object, show_data,
347
- filter_fn, filter_data);
348
- if (filter_data && filter_free_fn)
349
- filter_free_fn(filter_data);
328
+
329
+ ctx.revs = revs;
330
+ ctx.show_object = show_object;
331
+ ctx.show_commit = show_commit;
332
+ ctx.show_data = show_data;
333
+ ctx.filter_fn = NULL;
334
+
335
+ ctx.filter_data = list_objects_filter__init(omitted, filter_options,
336
+ &ctx.filter_fn, &filter_free_fn);
337
+ do_traverse(&ctx);
338
+ if (ctx.filter_data && filter_free_fn)
339
+ filter_free_fn(ctx.filter_data);
340
}