From: Patrick Steinhardt Date: Thu, 5 Jun 2025 06:46:59 +0000 (+0200) Subject: odb: get rid of `the_repository` in `for_each()` functions X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=86bed6a23bd298e0884183b264b569fc1d5533a3;p=thirdparty%2Fgit.git odb: get rid of `the_repository` in `for_each()` functions There are a couple of iterator-style functions that execute a callback for each instance of a given set, all of which currently depend on `the_repository`. Refactor them to instead take an object database as parameter so that we can get rid of this dependency. Rename the functions accordingly. Signed-off-by: Patrick Steinhardt Signed-off-by: Junio C Hamano --- diff --git a/builtin/count-objects.c b/builtin/count-objects.c index 58e0af433d..f687647931 100644 --- a/builtin/count-objects.c +++ b/builtin/count-objects.c @@ -159,7 +159,7 @@ int cmd_count_objects(int argc, printf("prune-packable: %lu\n", packed_loose); printf("garbage: %lu\n", garbage); printf("size-garbage: %s\n", garbage_buf.buf); - foreach_alt_odb(print_alternate, NULL); + odb_for_each_alternate(the_repository->objects, print_alternate, NULL); strbuf_release(&loose_buf); strbuf_release(&pack_buf); strbuf_release(&garbage_buf); diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c index 0f5958c4a6..7ea273d93e 100644 --- a/builtin/receive-pack.c +++ b/builtin/receive-pack.c @@ -359,7 +359,8 @@ static void write_head_info(void) refs_for_each_fullref_in(get_main_ref_store(the_repository), "", exclude_patterns, show_ref_cb, &seen); - for_each_alternate_ref(show_one_alternate_ref, &seen); + odb_for_each_alternate_ref(the_repository->objects, + show_one_alternate_ref, &seen); oidset_clear(&seen); strvec_clear(&excludes_vector); diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c index 84f7fa5342..7ca483cab5 100644 --- a/builtin/submodule--helper.c +++ b/builtin/submodule--helper.c @@ -1668,7 +1668,8 @@ static void prepare_possible_alternates(const char *sm_name, die(_("Value '%s' for submodule.alternateErrorStrategy is not recognized"), error_strategy); if (!strcmp(sm_alternate, "superproject")) - foreach_alt_odb(add_possible_reference_from_superproject, &sas); + odb_for_each_alternate(the_repository->objects, + add_possible_reference_from_superproject, &sas); else if (!strcmp(sm_alternate, "no")) ; /* do nothing */ else diff --git a/diagnose.c b/diagnose.c index ad0d5c1246..5092bf80d3 100644 --- a/diagnose.c +++ b/diagnose.c @@ -229,7 +229,7 @@ int create_diagnostics_archive(struct repository *r, strbuf_reset(&buf); strbuf_addstr(&buf, "--add-virtual-file=packs-local.txt:"); dir_file_stats(r->objects->sources, &buf); - foreach_alt_odb(dir_file_stats, &buf); + odb_for_each_alternate(r->objects, dir_file_stats, &buf); strvec_push(&archiver_args, buf.buf); strbuf_reset(&buf); diff --git a/fetch-pack.c b/fetch-pack.c index cf157f5d7e..47fa7fa4c4 100644 --- a/fetch-pack.c +++ b/fetch-pack.c @@ -115,7 +115,8 @@ static void for_each_cached_alternate(struct fetch_negotiator *negotiator, size_t i; if (!initialized) { - for_each_alternate_ref(cache_one_alternate, &cache); + odb_for_each_alternate_ref(the_repository->objects, + cache_one_alternate, &cache); initialized = 1; } diff --git a/odb.c b/odb.c index 42862ef7fe..d83f7416e9 100644 --- a/odb.c +++ b/odb.c @@ -494,8 +494,8 @@ static void fill_alternate_refs_command(struct child_process *cmd, } static void read_alternate_refs(const char *path, - alternate_ref_fn *cb, - void *data) + odb_for_each_alternate_ref_fn *cb, + void *payload) { struct child_process cmd = CHILD_PROCESS_INIT; struct strbuf line = STRBUF_INIT; @@ -517,7 +517,7 @@ static void read_alternate_refs(const char *path, break; } - cb(&oid, data); + cb(&oid, payload); } fclose(fh); @@ -526,16 +526,16 @@ static void read_alternate_refs(const char *path, } struct alternate_refs_data { - alternate_ref_fn *fn; - void *data; + odb_for_each_alternate_ref_fn *fn; + void *payload; }; static int refs_from_alternate_cb(struct odb_source *alternate, - void *data) + void *payload) { struct strbuf path = STRBUF_INIT; size_t base_len; - struct alternate_refs_data *cb = data; + struct alternate_refs_data *cb = payload; if (!strbuf_realpath(&path, alternate->path, 0)) goto out; @@ -549,29 +549,31 @@ static int refs_from_alternate_cb(struct odb_source *alternate, goto out; strbuf_setlen(&path, base_len); - read_alternate_refs(path.buf, cb->fn, cb->data); + read_alternate_refs(path.buf, cb->fn, cb->payload); out: strbuf_release(&path); return 0; } -void for_each_alternate_ref(alternate_ref_fn fn, void *data) +void odb_for_each_alternate_ref(struct object_database *odb, + odb_for_each_alternate_ref_fn cb, void *payload) { - struct alternate_refs_data cb; - cb.fn = fn; - cb.data = data; - foreach_alt_odb(refs_from_alternate_cb, &cb); + struct alternate_refs_data data; + data.fn = cb; + data.payload = payload; + odb_for_each_alternate(odb, refs_from_alternate_cb, &data); } -int foreach_alt_odb(alt_odb_fn fn, void *cb) +int odb_for_each_alternate(struct object_database *odb, + odb_for_each_alternate_fn cb, void *payload) { struct odb_source *alternate; int r = 0; - odb_prepare_alternates(the_repository->objects); - for (alternate = the_repository->objects->sources->next; alternate; alternate = alternate->next) { - r = fn(alternate, cb); + odb_prepare_alternates(odb); + for (alternate = odb->sources->next; alternate; alternate = alternate->next) { + r = cb(alternate, payload); if (r) break; } diff --git a/odb.h b/odb.h index eba16929a8..7e65e9707c 100644 --- a/odb.h +++ b/odb.h @@ -73,11 +73,6 @@ struct odb_source { char *path; }; -typedef int alt_odb_fn(struct odb_source *, void *); -int foreach_alt_odb(alt_odb_fn, void*); -typedef void alternate_ref_fn(const struct object_id *oid, void *); -void for_each_alternate_ref(alternate_ref_fn, void *); - /* * Replace the current writable object directory with the specified temporary * object directory; returns the former primary object directory. @@ -192,6 +187,24 @@ void odb_clear(struct object_database *o); */ struct odb_source *odb_find_source(struct object_database *odb, const char *obj_dir); +/* + * Iterate through all alternates of the database and execute the provided + * callback function for each of them. Stop iterating once the callback + * function returns a non-zero value, in which case the value is bubbled up + * from the callback. + */ +typedef int odb_for_each_alternate_fn(struct odb_source *, void *); +int odb_for_each_alternate(struct object_database *odb, + odb_for_each_alternate_fn cb, void *payload); + +/* + * Iterate through all alternates of the database and yield their respective + * references. + */ +typedef void odb_for_each_alternate_ref_fn(const struct object_id *oid, void *); +void odb_for_each_alternate_ref(struct object_database *odb, + odb_for_each_alternate_ref_fn cb, void *payload); + /* * Create a temporary file rooted in the primary alternate's directory, or die * on failure. The filename is taken from "pattern", which should have the diff --git a/revision.c b/revision.c index cdefe7d6e4..b0364f556e 100644 --- a/revision.c +++ b/revision.c @@ -1907,7 +1907,8 @@ static void add_alternate_refs_to_pending(struct rev_info *revs, struct add_alternate_refs_data data; data.revs = revs; data.flags = flags; - for_each_alternate_ref(add_one_alternate_ref, &data); + odb_for_each_alternate_ref(the_repository->objects, + add_one_alternate_ref, &data); } static int add_parents_only(struct rev_info *revs, const char *arg_, int flags,