@@ -479,15 +479,16 @@ struct process_commit_data {
struct rev_info *revs;
};
-static void process_commit(struct commit *commit, void *data)
+static void process_commit(struct commit *commit, struct show_info *info)
{
- struct process_commit_data *pcd = data;
+ struct process_commit_data *pcd = info->show_data;
pcd->current_commit = commit->object.oid;
}
-static void process_object(struct object *obj, const char *path, void *data)
+static void process_object(struct object *obj, const char *path,
+ struct show_info *info)
{
- struct process_commit_data *pcd = data;
+ struct process_commit_data *pcd = info->show_data;
if (oideq(&pcd->looking_for, &obj->oid) && !pcd->dst->len) {
reset_revision_walk();
@@ -3106,13 +3106,13 @@ static int add_object_entry_from_pack(const struct object_id *oid,
return 0;
}
-static void show_commit_pack_hint(struct commit *commit, void *_data)
+static void show_commit_pack_hint(struct commit *commit, struct show_info *info)
{
/* nothing to do; commits don't have a namehash */
}
static void show_object_pack_hint(struct object *object, const char *name,
- void *_data)
+ struct show_info *info)
{
struct object_entry *oe = packlist_find(&to_pack, &object->oid);
if (!oe)
@@ -3284,7 +3284,7 @@ static void read_object_list_from_stdin(void)
/* Remember to update object flag allocation in object.h */
#define OBJECT_ADDED (1u<<20)
-static void show_commit(struct commit *commit, void *data)
+static void show_commit(struct commit *commit, struct show_info *info)
{
add_object_entry(&commit->object.oid, OBJ_COMMIT, NULL, 0);
commit->object.flags |= OBJECT_ADDED;
@@ -3296,7 +3296,8 @@ static void show_commit(struct commit *commit, void *data)
propagate_island_marks(commit);
}
-static void show_object(struct object *obj, const char *name, void *data)
+static void show_object(struct object *obj, const char *name,
+ struct show_info *info)
{
add_preferred_base_object(name);
add_object_entry(&obj->oid, obj->type, name, 0);
@@ -3318,7 +3319,8 @@ static void show_object(struct object *obj, const char *name, void *data)
}
}
-static void show_object__ma_allow_any(struct object *obj, const char *name, void *data)
+static void show_object__ma_allow_any(struct object *obj, const char *name,
+ struct show_info *info)
{
assert(arg_missing_action == MA_ALLOW_ANY);
@@ -3329,10 +3331,11 @@ static void show_object__ma_allow_any(struct object *obj, const char *name, void
if (!has_object(the_repository, &obj->oid, 0))
return;
- show_object(obj, name, data);
+ show_object(obj, name, info);
}
-static void show_object__ma_allow_promisor(struct object *obj, const char *name, void *data)
+static void show_object__ma_allow_promisor(struct object *obj, const char *name,
+ struct show_info *info)
{
assert(arg_missing_action == MA_ALLOW_PROMISOR);
@@ -3343,7 +3346,7 @@ static void show_object__ma_allow_promisor(struct object *obj, const char *name,
if (!has_object(the_repository, &obj->oid, 0) && is_promisor_object(&obj->oid))
return;
- show_object(obj, name, data);
+ show_object(obj, name, info);
}
static int option_parse_missing_action(const struct option *opt,
@@ -3591,12 +3594,12 @@ static int get_object_list_from_bitmap(struct rev_info *revs)
static void record_recent_object(struct object *obj,
const char *name,
- void *data)
+ struct show_info *info)
{
oid_array_append(&recent_objects, &obj->oid);
}
-static void record_recent_commit(struct commit *commit, void *data)
+static void record_recent_commit(struct commit *commit, struct show_info *info)
{
oid_array_append(&recent_objects, &commit->object.oid);
}
@@ -94,9 +94,9 @@ static off_t get_object_disk_usage(struct object *obj)
}
static void finish_commit(struct commit *commit);
-static void show_commit(struct commit *commit, void *data)
+static void show_commit(struct commit *commit, struct show_info *s_info)
{
- struct rev_list_info *info = data;
+ struct rev_list_info *info = s_info->show_data;
struct rev_info *revs = info->revs;
display_progress(progress, ++progress_counter);
@@ -266,12 +266,13 @@ static int finish_object(struct object *obj, const char *name, void *cb_data)
return 0;
}
-static void show_object(struct object *obj, const char *name, void *cb_data)
+static void show_object(struct object *obj, const char *name,
+ struct show_info *s_info)
{
- struct rev_list_info *info = cb_data;
+ struct rev_list_info *info = s_info->show_data;
struct rev_info *revs = info->revs;
- if (finish_object(obj, name, cb_data))
+ if (finish_object(obj, name, info))
return;
display_progress(progress, ++progress_counter);
if (show_disk_usage)
@@ -437,9 +437,9 @@ struct bundle_prerequisites_info {
int fd;
};
-static void write_bundle_prerequisites(struct commit *commit, void *data)
+static void write_bundle_prerequisites(struct commit *commit, struct show_info *info)
{
- struct bundle_prerequisites_info *bpi = data;
+ struct bundle_prerequisites_info *bpi = info->show_data;
struct object *object;
struct pretty_print_context ctx = { 0 };
struct strbuf buf = STRBUF_INIT;
@@ -530,6 +530,7 @@ int create_bundle(struct repository *r, const char *path,
die("revision walk setup failed");
bpi.fd = bundle_fd;
bpi.pending = &revs_copy.pending;
+
traverse_commit_list(&revs, write_bundle_prerequisites, NULL, &bpi);
object_array_remove_duplicates(&revs_copy.pending);
@@ -29,6 +29,10 @@ static void process_blob(struct traversal_context *ctx,
struct object *obj = &blob->object;
size_t pathlen;
enum list_objects_filter_result r;
+ struct show_info show_info;
+
+ show_info.show_data = ctx->show_data;
+ show_info.show_cache = NULL;
if (!ctx->revs->blob_objects)
return;
@@ -60,7 +64,7 @@ static void process_blob(struct traversal_context *ctx,
if (r & LOFR_MARK_SEEN)
obj->flags |= SEEN;
if (r & LOFR_DO_SHOW)
- ctx->show_object(obj, path->buf, ctx->show_data);
+ ctx->show_object(obj, path->buf, &show_info);
strbuf_setlen(path, pathlen);
}
@@ -154,10 +158,14 @@ static void process_tree(struct traversal_context *ctx,
{
struct object *obj = &tree->object;
struct rev_info *revs = ctx->revs;
+ struct show_info show_info;
int baselen = base->len;
enum list_objects_filter_result r;
int failed_parse;
+ show_info.show_data = ctx->show_data;
+ show_info.show_cache = NULL;
+
if (!revs->tree_objects)
return;
if (!obj)
@@ -191,7 +199,7 @@ static void process_tree(struct traversal_context *ctx,
if (r & LOFR_MARK_SEEN)
obj->flags |= SEEN;
if (r & LOFR_DO_SHOW)
- ctx->show_object(obj, base->buf, ctx->show_data);
+ ctx->show_object(obj, base->buf, &show_info);
if (base->len)
strbuf_addch(base, '/');
@@ -207,8 +215,7 @@ static void process_tree(struct traversal_context *ctx,
if (r & LOFR_MARK_SEEN)
obj->flags |= SEEN;
if (r & LOFR_DO_SHOW)
- ctx->show_object(obj, base->buf, ctx->show_data);
-
+ ctx->show_object(obj, base->buf, &show_info);
strbuf_setlen(base, baselen);
free_tree_buffer(tree);
}
@@ -322,8 +329,12 @@ static void add_pending_tree(struct rev_info *revs, struct tree *tree)
static void traverse_trees_and_blobs(struct traversal_context *ctx,
struct strbuf *base)
{
+ struct show_info show_info;
int i;
+ show_info.show_data = ctx->show_data;
+ show_info.show_cache = NULL;
+
assert(base->len == 0);
for (i = 0; i < ctx->revs->pending.nr; i++) {
@@ -335,7 +346,7 @@ static void traverse_trees_and_blobs(struct traversal_context *ctx,
continue;
if (obj->type == OBJ_TAG) {
obj->flags |= SEEN;
- ctx->show_object(obj, name, ctx->show_data);
+ ctx->show_object(obj, name, &show_info);
continue;
}
if (!path)
@@ -358,8 +369,13 @@ static void do_traverse(struct traversal_context *ctx)
{
struct commit *commit;
struct strbuf csp; /* callee's scratch pad */
+ struct show_info show_info;
strbuf_init(&csp, PATH_MAX);
+
+ show_info.show_data = ctx->show_data;
+ show_info.show_cache = NULL;
+
while ((commit = get_revision(ctx->revs)) != NULL) {
/*
* an uninteresting boundary commit may not have its tree
@@ -375,7 +391,8 @@ static void do_traverse(struct traversal_context *ctx)
die(_("unable to load root tree for commit %s"),
oid_to_hex(&commit->object.oid));
}
- ctx->show_commit(commit, ctx->show_data);
+
+ ctx->show_commit(commit, &show_info);
if (ctx->revs->tree_blobs_in_commit_order)
/*
@@ -5,9 +5,14 @@ struct commit;
struct object;
struct rev_info;
-typedef void (*show_commit_fn)(struct commit *, void *);
-typedef void (*show_object_fn)(struct object *, const char *, void *);
-void traverse_commit_list(struct rev_info *, show_commit_fn, show_object_fn, void *);
+struct show_info {
+ void *show_data; /* the data necessary for showing the object */
+ void *show_cache; /* the cache ownership relationship data for showing the object */
+};
+
+typedef void (*show_commit_fn)(struct commit *, struct show_info *);
+typedef void (*show_object_fn)(struct object *, const char *, struct show_info *);
+void traverse_commit_list(struct rev_info *, show_commit_fn, show_object_fn, void *show_data);
typedef void (*show_edge_fn)(struct commit *);
void mark_edges_uninteresting(struct rev_info *revs,
@@ -459,9 +459,10 @@ struct bitmap_show_data {
struct bitmap *base;
};
-static void show_object(struct object *object, const char *name, void *data_)
+static void show_object(struct object *object, const char *name,
+ struct show_info *info)
{
- struct bitmap_show_data *data = data_;
+ struct bitmap_show_data *data = info->show_data;
int bitmap_pos;
bitmap_pos = bitmap_position(data->bitmap_git, &object->oid);
@@ -473,7 +474,7 @@ static void show_object(struct object *object, const char *name, void *data_)
bitmap_set(data->base, bitmap_pos);
}
-static void show_commit(struct commit *commit, void *data)
+static void show_commit(struct commit *commit, struct show_info *info)
{
}
@@ -628,6 +629,7 @@ static struct bitmap *find_objects(struct bitmap_index *bitmap_git,
show_data.bitmap_git = bitmap_git;
show_data.base = base;
+
traverse_commit_list_filtered(filter, revs,
show_commit, show_object,
&show_data, NULL);
@@ -1268,9 +1270,9 @@ struct bitmap_test_data {
};
static void test_show_object(struct object *object, const char *name,
- void *data)
+ struct show_info *info)
{
- struct bitmap_test_data *tdata = data;
+ struct bitmap_test_data *tdata = info->show_data;
int bitmap_pos;
bitmap_pos = bitmap_position(tdata->bitmap_git, &object->oid);
@@ -1281,9 +1283,9 @@ static void test_show_object(struct object *object, const char *name,
display_progress(tdata->prg, ++tdata->seen);
}
-static void test_show_commit(struct commit *commit, void *data)
+static void test_show_commit(struct commit *commit, struct show_info *info)
{
- struct bitmap_test_data *tdata = data;
+ struct bitmap_test_data *tdata = info->show_data;
int bitmap_pos;
bitmap_pos = bitmap_position(tdata->bitmap_git,
@@ -47,14 +47,15 @@ static int add_one_ref(const char *path, const struct object_id *oid,
* The traversal will have already marked us as SEEN, so we
* only need to handle any progress reporting here.
*/
-static void mark_object(struct object *obj, const char *name, void *data)
+static void mark_object(struct object *obj, const char *name,
+ struct show_info *info)
{
- update_progress(data);
+ update_progress(info->show_data);
}
-static void mark_commit(struct commit *c, void *data)
+static void mark_commit(struct commit *c, struct show_info *info)
{
- mark_object(&c->object, NULL, data);
+ mark_object(&c->object, NULL, info);
}
struct recent_data {
@@ -230,6 +231,7 @@ void mark_reachable_objects(struct rev_info *revs, int mark_reflog,
return;
}
+
/*
* Set up the revision walk - this will move all commits
* from the pending list to the commit walking list.
@@ -244,6 +246,7 @@ void mark_reachable_objects(struct rev_info *revs, int mark_reflog,
die("unable to mark recent objects");
if (prepare_revision_walk(revs))
die("revision walk setup failed");
+
traverse_commit_list(revs, mark_commit, mark_object, &cp);
}
@@ -185,9 +185,9 @@ struct commit_list *get_shallow_commits(struct object_array *heads, int depth,
return result;
}
-static void show_commit(struct commit *commit, void *data)
+static void show_commit(struct commit *commit, struct show_info *info)
{
- commit_list_insert(commit, data);
+ commit_list_insert(commit, info->show_data);
}
/*