]> git.ipfire.org Git - thirdparty/git.git/commitdiff
odb: get rid of `the_repository` in `for_each()` functions
authorPatrick Steinhardt <ps@pks.im>
Thu, 5 Jun 2025 06:46:59 +0000 (08:46 +0200)
committerJunio C Hamano <gitster@pobox.com>
Thu, 5 Jun 2025 15:51:59 +0000 (08:51 -0700)
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 <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/count-objects.c
builtin/receive-pack.c
builtin/submodule--helper.c
diagnose.c
fetch-pack.c
odb.c
odb.h
revision.c

index 58e0af433d1658e183cd9e003bdb00fd6d0aa9a0..f687647931e0e21189e75fdfeb20ad6b3fcb40ea 100644 (file)
@@ -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);
index 0f5958c4a6601e0eca5f397906b5a096ad524979..7ea273d93e40ae9e762d56c50f5b6b06349e4154 100644 (file)
@@ -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);
index 84f7fa53424ceb17f4623cf689504ad33e145119..7ca483cab52bac0cc78f18e45a1c30c2989db1d4 100644 (file)
@@ -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
index ad0d5c1246558d70b4237a3ae175691a807ad394..5092bf80d35fddffcce575530c4cc506bb00213a 100644 (file)
@@ -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);
index cf157f5d7e583eb18a2d44102655f9ec44c1888a..47fa7fa4c492cbcba7232cc03bd45148b7a9b962 100644 (file)
@@ -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 42862ef7fe70a07ed6eb99fc9878eb94f1cf7404..d83f7416e9e839d303ec00a874f693fac4987039 100644 (file)
--- 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 eba16929a81f29e56abf62e198120a6dcdf522f6..7e65e9707c1af7b47a7f22acec724abf01701b2a 100644 (file)
--- 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
index cdefe7d6e482cb944413f90d094a41baf1280876..b0364f556ee2205f13ddeb3e22c6eec503b88487 100644 (file)
@@ -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,