From 8f49151763cb81adf4bcec53c1ae67057081b02d Mon Sep 17 00:00:00 2001 From: Patrick Steinhardt Date: Tue, 1 Jul 2025 14:22:15 +0200 Subject: object-store: rename files to "odb.{c,h}" In the preceding commits we have renamed the structures contained in "object-store.h" to `struct object_database` and `struct odb_backend`. As such, the code files "object-store.{c,h}" are confusingly named now. Rename them to "odb.{c,h}" accordingly. Signed-off-by: Patrick Steinhardt Signed-off-by: Junio C Hamano --- submodule.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'submodule.c') diff --git a/submodule.c b/submodule.c index ead3fb5dad..9b1018877d 100644 --- a/submodule.c +++ b/submodule.c @@ -27,7 +27,7 @@ #include "parse-options.h" #include "object-file.h" #include "object-name.h" -#include "object-store.h" +#include "odb.h" #include "commit-reach.h" #include "read-cache-ll.h" #include "setup.h" -- cgit v1.3 From c44185f6c10fb2d306efe505112982a7c3b93789 Mon Sep 17 00:00:00 2001 From: Patrick Steinhardt Date: Tue, 1 Jul 2025 14:22:20 +0200 Subject: odb: get rid of `the_repository` when handling alternates The functions to manage alternates all depend on `the_repository`. Refactor them to accept an object database as a parameter and adjust all callers. The functions are renamed accordingly. Note that right now the situation is still somewhat weird because we end up using the object store path provided by the object store's repository anyway. Consequently, we could have instead passed in a pointer to the repository instead of passing in the pointer to the object store. This will be addressed in subsequent commits though, where we will start to use the path owned by the object store itself. Signed-off-by: Patrick Steinhardt Signed-off-by: Junio C Hamano --- builtin/clone.c | 10 +++++---- builtin/fsck.c | 6 +++--- builtin/grep.c | 2 +- builtin/repack.c | 3 ++- commit-graph.c | 4 ++-- loose.c | 2 +- object-file.c | 10 ++++----- object-name.c | 2 +- odb.c | 44 ++++++++++++++++++--------------------- odb.h | 53 ++++++++++++++++++++++++++++++++--------------- packfile.c | 4 ++-- submodule.c | 3 ++- t/helper/test-ref-store.c | 2 +- tmp-objdir.c | 2 +- 14 files changed, 83 insertions(+), 64 deletions(-) (limited to 'submodule.c') diff --git a/builtin/clone.c b/builtin/clone.c index 1eafeefb48..3aabdf6570 100644 --- a/builtin/clone.c +++ b/builtin/clone.c @@ -171,7 +171,7 @@ static int add_one_reference(struct string_list_item *item, void *cb_data) } else { struct strbuf sb = STRBUF_INIT; strbuf_addf(&sb, "%s/objects", ref_git); - add_to_alternates_file(sb.buf); + odb_add_to_alternates_file(the_repository->objects, sb.buf); strbuf_release(&sb); } @@ -212,12 +212,14 @@ static void copy_alternates(struct strbuf *src, const char *src_repo) if (!line.len || line.buf[0] == '#') continue; if (is_absolute_path(line.buf)) { - add_to_alternates_file(line.buf); + odb_add_to_alternates_file(the_repository->objects, + line.buf); continue; } abs_path = mkpathdup("%s/objects/%s", src_repo, line.buf); if (!normalize_path_copy(abs_path, abs_path)) - add_to_alternates_file(abs_path); + odb_add_to_alternates_file(the_repository->objects, + abs_path); else warning("skipping invalid relative alternate: %s/%s", src_repo, line.buf); @@ -352,7 +354,7 @@ static void clone_local(const char *src_repo, const char *dest_repo) struct strbuf alt = STRBUF_INIT; get_common_dir(&alt, src_repo); strbuf_addstr(&alt, "/objects"); - add_to_alternates_file(alt.buf); + odb_add_to_alternates_file(the_repository->objects, alt.buf); strbuf_release(&alt); } else { struct strbuf src = STRBUF_INIT; diff --git a/builtin/fsck.c b/builtin/fsck.c index 9abd7b2558..014aa1344e 100644 --- a/builtin/fsck.c +++ b/builtin/fsck.c @@ -997,7 +997,7 @@ int cmd_fsck(int argc, for_each_packed_object(the_repository, mark_packed_for_connectivity, NULL, 0); } else { - prepare_alt_odb(the_repository); + odb_prepare_alternates(the_repository->objects); for (source = the_repository->objects->sources; source; source = source->next) fsck_object_dir(source->path); @@ -1108,7 +1108,7 @@ int cmd_fsck(int argc, if (the_repository->settings.core_commit_graph) { struct child_process commit_graph_verify = CHILD_PROCESS_INIT; - prepare_alt_odb(the_repository); + odb_prepare_alternates(the_repository->objects); for (source = the_repository->objects->sources; source; source = source->next) { child_process_init(&commit_graph_verify); commit_graph_verify.git_cmd = 1; @@ -1126,7 +1126,7 @@ int cmd_fsck(int argc, if (the_repository->settings.core_multi_pack_index) { struct child_process midx_verify = CHILD_PROCESS_INIT; - prepare_alt_odb(the_repository); + odb_prepare_alternates(the_repository->objects); for (source = the_repository->objects->sources; source; source = source->next) { child_process_init(&midx_verify); midx_verify.git_cmd = 1; diff --git a/builtin/grep.c b/builtin/grep.c index a1d7ee7af3..336cfcab6f 100644 --- a/builtin/grep.c +++ b/builtin/grep.c @@ -462,7 +462,7 @@ static int grep_submodule(struct grep_opt *opt, /* * NEEDSWORK: repo_read_gitmodules() might call - * add_to_alternates_memory() via config_from_gitmodules(). This + * odb_add_to_alternates_memory() via config_from_gitmodules(). This * operation causes a race condition with concurrent object readings * performed by the worker threads. That's why we need obj_read_lock() * here. It should be removed once it's no longer necessary to add the diff --git a/builtin/repack.c b/builtin/repack.c index 1678232005..8145474cf8 100644 --- a/builtin/repack.c +++ b/builtin/repack.c @@ -1256,7 +1256,8 @@ int cmd_repack(int argc, if (write_bitmaps && !(pack_everything & ALL_INTO_ONE) && !write_midx) die(_(incremental_bitmap_conflict_error)); - if (write_bitmaps && po_args.local && has_alt_odb(the_repository)) { + if (write_bitmaps && po_args.local && + odb_has_alternates(the_repository->objects)) { /* * When asked to do a local repack, but we have * packfiles that are inherited from an alternate, then diff --git a/commit-graph.c b/commit-graph.c index 6ced5b366e..59265f8938 100644 --- a/commit-graph.c +++ b/commit-graph.c @@ -649,7 +649,7 @@ struct commit_graph *load_commit_graph_chain_fd_st(struct repository *r, count = st->st_size / (the_hash_algo->hexsz + 1); CALLOC_ARRAY(oids, count); - prepare_alt_odb(r); + odb_prepare_alternates(r->objects); for (i = 0; i < count; i++) { struct odb_source *source; @@ -778,7 +778,7 @@ static int prepare_commit_graph(struct repository *r) if (!commit_graph_compatible(r)) return 0; - prepare_alt_odb(r); + odb_prepare_alternates(r->objects); for (source = r->objects->sources; !r->objects->commit_graph && source; source = source->next) diff --git a/loose.c b/loose.c index fab4041c03..519f5db793 100644 --- a/loose.c +++ b/loose.c @@ -112,7 +112,7 @@ int repo_read_loose_object_map(struct repository *repo) if (!should_use_loose_object_map(repo)) return 0; - prepare_alt_odb(repo); + odb_prepare_alternates(repo->objects); for (source = repo->objects->sources; source; source = source->next) { if (load_one_loose_object_map(repo, source) < 0) { diff --git a/object-file.c b/object-file.c index 2d3af8a77c..04da19a1a3 100644 --- a/object-file.c +++ b/object-file.c @@ -106,7 +106,7 @@ static int check_and_freshen_nonlocal(const struct object_id *oid, int freshen) { struct odb_source *source; - prepare_alt_odb(the_repository); + odb_prepare_alternates(the_repository->objects); for (source = the_repository->objects->sources->next; source; source = source->next) { if (check_and_freshen_odb(source, oid, freshen)) return 1; @@ -205,7 +205,7 @@ static int stat_loose_object(struct repository *r, const struct object_id *oid, struct odb_source *source; static struct strbuf buf = STRBUF_INIT; - prepare_alt_odb(r); + odb_prepare_alternates(r->objects); for (source = r->objects->sources; source; source = source->next) { *path = odb_loose_path(source, &buf, oid); if (!lstat(*path, st)) @@ -227,7 +227,7 @@ static int open_loose_object(struct repository *r, int most_interesting_errno = ENOENT; static struct strbuf buf = STRBUF_INIT; - prepare_alt_odb(r); + odb_prepare_alternates(r->objects); for (source = r->objects->sources; source; source = source->next) { *path = odb_loose_path(source, &buf, oid); fd = git_open(*path); @@ -246,7 +246,7 @@ static int quick_has_loose(struct repository *r, { struct odb_source *source; - prepare_alt_odb(r); + odb_prepare_alternates(r->objects); for (source = r->objects->sources; source; source = source->next) { if (oidtree_contains(odb_loose_cache(source, oid), oid)) return 1; @@ -1439,7 +1439,7 @@ int for_each_loose_object(each_loose_object_fn cb, void *data, { struct odb_source *source; - prepare_alt_odb(the_repository); + odb_prepare_alternates(the_repository->objects); for (source = the_repository->objects->sources; source; source = source->next) { int r = for_each_loose_file_in_objdir(source->path, cb, NULL, NULL, data); diff --git a/object-name.c b/object-name.c index 544634d0f4..381536e900 100644 --- a/object-name.c +++ b/object-name.c @@ -376,7 +376,7 @@ static int init_object_disambiguation(struct repository *r, ds->hex_pfx[len] = '\0'; ds->repo = r; ds->bin_pfx.algo = algo ? hash_algo_by_ptr(algo) : GIT_HASH_UNKNOWN; - prepare_alt_odb(r); + odb_prepare_alternates(r->objects); return 0; } diff --git a/odb.c b/odb.c index 8967e9fd54..691a8c7c68 100644 --- a/odb.c +++ b/odb.c @@ -272,10 +272,11 @@ static void read_info_alternates(struct object_database *odb, free(path); } -void add_to_alternates_file(const char *reference) +void odb_add_to_alternates_file(struct object_database *odb, + const char *reference) { struct lock_file lock = LOCK_INIT; - char *alts = repo_git_path(the_repository, "objects/info/alternates"); + char *alts = repo_git_path(odb->repo, "objects/info/alternates"); FILE *in, *out; int found = 0; @@ -308,22 +309,23 @@ void add_to_alternates_file(const char *reference) fprintf_or_die(out, "%s\n", reference); if (commit_lock_file(&lock)) die_errno(_("unable to move new alternates file into place")); - if (the_repository->objects->loaded_alternates) - link_alt_odb_entries(the_repository->objects, reference, + if (odb->loaded_alternates) + link_alt_odb_entries(odb, reference, '\n', NULL, 0); } free(alts); } -void add_to_alternates_memory(const char *reference) +void odb_add_to_alternates_memory(struct object_database *odb, + const char *reference) { /* * Make sure alternates are initialized, or else our entry may be * overwritten when they are. */ - prepare_alt_odb(the_repository); + odb_prepare_alternates(odb); - link_alt_odb_entries(the_repository->objects, reference, + link_alt_odb_entries(odb, reference, '\n', NULL, 0); } @@ -335,7 +337,7 @@ struct odb_source *set_temporary_primary_odb(const char *dir, int will_destroy) * Make sure alternates are initialized, or else our entry may be * overwritten when they are. */ - prepare_alt_odb(the_repository); + odb_prepare_alternates(the_repository->objects); /* * Make a new primary odb and link the old primary ODB in as an @@ -379,12 +381,6 @@ void restore_primary_odb(struct odb_source *restore_alt, const char *old_path) free_object_directory(cur_alt); } -/* - * Compute the exact path an alternate is at and returns it. In case of - * error NULL is returned and the human readable error is added to `err` - * `path` may be relative and should point to $GIT_DIR. - * `err` must not be null. - */ char *compute_alternate_path(const char *path, struct strbuf *err) { char *ref_git = NULL; @@ -455,7 +451,7 @@ struct odb_source *odb_find_source(struct object_database *odb, const char *obj_ char *obj_dir_real = real_pathdup(obj_dir, 1); struct strbuf odb_path_real = STRBUF_INIT; - prepare_alt_odb(odb->repo); + odb_prepare_alternates(odb); for (source = odb->sources; source; source = source->next) { strbuf_realpath(&odb_path_real, source->path, 1); if (!strcmp(obj_dir_real, odb_path_real.buf)) @@ -573,7 +569,7 @@ int foreach_alt_odb(alt_odb_fn fn, void *cb) struct odb_source *alternate; int r = 0; - prepare_alt_odb(the_repository); + odb_prepare_alternates(the_repository->objects); for (alternate = the_repository->objects->sources->next; alternate; alternate = alternate->next) { r = fn(alternate, cb); if (r) @@ -582,21 +578,21 @@ int foreach_alt_odb(alt_odb_fn fn, void *cb) return r; } -void prepare_alt_odb(struct repository *r) +void odb_prepare_alternates(struct object_database *odb) { - if (r->objects->loaded_alternates) + if (odb->loaded_alternates) return; - link_alt_odb_entries(r->objects, r->objects->alternate_db, PATH_SEP, NULL, 0); + link_alt_odb_entries(odb, odb->alternate_db, PATH_SEP, NULL, 0); - read_info_alternates(r->objects, r->objects->sources->path, 0); - r->objects->loaded_alternates = 1; + read_info_alternates(odb, odb->sources->path, 0); + odb->loaded_alternates = 1; } -int has_alt_odb(struct repository *r) +int odb_has_alternates(struct object_database *odb) { - prepare_alt_odb(r); - return !!r->objects->sources->next; + odb_prepare_alternates(odb); + return !!odb->sources->next; } int obj_read_use_lock = 0; diff --git a/odb.h b/odb.h index 5de952608f..eba16929a8 100644 --- a/odb.h +++ b/odb.h @@ -13,6 +13,14 @@ struct oidtree; struct strbuf; struct repository; +/* + * Compute the exact path an alternate is at and returns it. In case of + * error NULL is returned and the human readable error is added to `err` + * `path` may be relative and should point to $GIT_DIR. + * `err` must not be null. + */ +char *compute_alternate_path(const char *path, struct strbuf *err); + /* * The source is the part of the object database that stores the actual * objects. It thus encapsulates the logic to read and write the specific @@ -65,27 +73,11 @@ struct odb_source { char *path; }; -void prepare_alt_odb(struct repository *r); -int has_alt_odb(struct repository *r); -char *compute_alternate_path(const char *path, struct strbuf *err); 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 *); -/* - * Add the directory to the on-disk alternates file; the new entry will also - * take effect in the current process. - */ -void add_to_alternates_file(const char *dir); - -/* - * Add the directory to the in-memory list of alternates (along with any - * recursive alternates it points to), but do not modify the on-disk alternates - * file. - */ -void add_to_alternates_memory(const char *dir); - /* * Replace the current writable object directory with the specified temporary * object directory; returns the former primary object directory. @@ -124,7 +116,7 @@ struct object_database { /* * A list of alternate object directories loaded from the environment; * this should not generally need to be accessed directly, but will - * populate the "sources" list when prepare_alt_odb() is run. + * populate the "sources" list when odb_prepare_alternates() is run. */ char *alternate_db; @@ -209,6 +201,33 @@ struct odb_source *odb_find_source(struct object_database *odb, const char *obj_ int odb_mkstemp(struct object_database *odb, struct strbuf *temp_filename, const char *pattern); +/* + * Prepare alternate object sources for the given database by reading + * "objects/info/alternates" and opening the respective sources. + */ +void odb_prepare_alternates(struct object_database *odb); + +/* + * Check whether the object database has any alternates. The primary object + * source does not count as alternate. + */ +int odb_has_alternates(struct object_database *odb); + +/* + * Add the directory to the on-disk alternates file; the new entry will also + * take effect in the current process. + */ +void odb_add_to_alternates_file(struct object_database *odb, + const char *dir); + +/* + * Add the directory to the in-memory list of alternate sources (along with any + * recursive alternates it points to), but do not modify the on-disk alternates + * file. + */ +void odb_add_to_alternates_memory(struct object_database *odb, + const char *dir); + void *repo_read_object_file(struct repository *r, const struct object_id *oid, enum object_type *type, diff --git a/packfile.c b/packfile.c index 346c2f9ce9..ac0e29e99b 100644 --- a/packfile.c +++ b/packfile.c @@ -1034,7 +1034,7 @@ static void prepare_packed_git(struct repository *r) if (r->objects->packed_git_initialized) return; - prepare_alt_odb(r); + odb_prepare_alternates(r->objects); for (source = r->objects->sources; source; source = source->next) { int local = (source == r->objects->sources); prepare_multi_pack_index_one(r, source->path, local); @@ -1059,7 +1059,7 @@ void reprepare_packed_git(struct repository *r) * the lifetime of the process. */ r->objects->loaded_alternates = 0; - prepare_alt_odb(r); + odb_prepare_alternates(r->objects); for (source = r->objects->sources; source; source = source->next) odb_clear_loose_cache(source); diff --git a/submodule.c b/submodule.c index 9b1018877d..386be23423 100644 --- a/submodule.c +++ b/submodule.c @@ -189,7 +189,8 @@ int register_all_submodule_odb_as_alternates(void) int ret = added_submodule_odb_paths.nr; for (i = 0; i < added_submodule_odb_paths.nr; i++) - add_to_alternates_memory(added_submodule_odb_paths.items[i].string); + odb_add_to_alternates_memory(the_repository->objects, + added_submodule_odb_paths.items[i].string); if (ret) { string_list_clear(&added_submodule_odb_paths, 0); trace2_data_intmax("submodule", the_repository, diff --git a/t/helper/test-ref-store.c b/t/helper/test-ref-store.c index 2920ca59d7..8d9a271845 100644 --- a/t/helper/test-ref-store.c +++ b/t/helper/test-ref-store.c @@ -79,7 +79,7 @@ static const char **get_store(const char **argv, struct ref_store **refs) if (!repo_submodule_path_append(the_repository, &sb, gitdir, "objects/")) die("computing submodule path failed"); - add_to_alternates_memory(sb.buf); + odb_add_to_alternates_memory(the_repository->objects, sb.buf); strbuf_release(&sb); *refs = repo_get_submodule_ref_store(the_repository, gitdir); diff --git a/tmp-objdir.c b/tmp-objdir.c index bef2f917cd..4120badf5c 100644 --- a/tmp-objdir.c +++ b/tmp-objdir.c @@ -304,7 +304,7 @@ const char **tmp_objdir_env(const struct tmp_objdir *t) void tmp_objdir_add_as_alternate(const struct tmp_objdir *t) { - add_to_alternates_memory(t->path.buf); + odb_add_to_alternates_memory(t->repo->objects, t->path.buf); } void tmp_objdir_replace_primary_odb(struct tmp_objdir *t, int will_destroy) -- cgit v1.3 From fc28a8a856a1e7978794e7dee61c42d7d5740a6b Mon Sep 17 00:00:00 2001 From: Patrick Steinhardt Date: Tue, 1 Jul 2025 14:22:23 +0200 Subject: odb: get rid of `the_repository` when handling submodule sources The "--recursive" flag for git-grep(1) allows users to grep for a string across submodule boundaries. To make this work we add each submodule's object sources to our own object database so that the objects can be accessed directly. The infrastructure for this depends on a global string list of submodule paths. The caller is expected to call `add_submodule_odb_by_path()` for each source and the object database will then eventually register all submodule sources via `do_oid_object_info_extended()` in case it isn't able to look up a specific object. This reliance on global state is of course suboptimal with regards to our libification efforts. Refactor the logic so that the list of submodule sources is instead tracked in the object database itself. This allows us to lose the condition of `r == the_repository` before registering submodule sources as we only ever add submodule sources to `the_repository` anyway. As such, behaviour before and after this refactoring should always be the same. Rename the functions accordingly. Signed-off-by: Patrick Steinhardt Signed-off-by: Junio C Hamano --- builtin/grep.c | 3 ++- odb.c | 37 +++++++++++++++++++++++++++++++------ odb.h | 15 +++++++++++++++ submodule-config.c | 3 ++- submodule.c | 26 -------------------------- submodule.h | 9 --------- 6 files changed, 50 insertions(+), 43 deletions(-) (limited to 'submodule.c') diff --git a/builtin/grep.c b/builtin/grep.c index 336cfcab6f..cfcf916bce 100644 --- a/builtin/grep.c +++ b/builtin/grep.c @@ -505,7 +505,8 @@ static int grep_submodule(struct grep_opt *opt, * lazily registered as alternates when needed (and except in an * unexpected code interaction, it won't be needed). */ - add_submodule_odb_by_path(subrepo->objects->sources->path); + odb_add_submodule_source_by_path(the_repository->objects, + subrepo->objects->sources->path); obj_read_unlock(); memcpy(&subopt, opt, sizeof(subopt)); diff --git a/odb.c b/odb.c index 4f03be7f77..f0b27bd936 100644 --- a/odb.c +++ b/odb.c @@ -24,6 +24,7 @@ #include "strbuf.h" #include "strvec.h" #include "submodule.h" +#include "trace2.h" #include "write-or-die.h" KHASH_INIT(odb_path_map, const char * /* key: odb_path */, @@ -469,6 +470,12 @@ struct odb_source *odb_find_source(struct object_database *odb, const char *obj_ return source; } +void odb_add_submodule_source_by_path(struct object_database *odb, + const char *path) +{ + string_list_insert(&odb->submodule_source_paths, path); +} + static void fill_alternate_refs_command(struct child_process *cmd, const char *repo_path) { @@ -623,6 +630,23 @@ void disable_obj_read_lock(void) int fetch_if_missing = 1; +static int register_all_submodule_sources(struct object_database *odb) +{ + int ret = odb->submodule_source_paths.nr; + + for (size_t i = 0; i < odb->submodule_source_paths.nr; i++) + odb_add_to_alternates_memory(odb, + odb->submodule_source_paths.items[i].string); + if (ret) { + string_list_clear(&odb->submodule_source_paths, 0); + trace2_data_intmax("submodule", odb->repo, + "register_all_submodule_sources/registered", ret); + if (git_env_bool("GIT_TEST_FATAL_REGISTER_SUBMODULE_ODB", 0)) + BUG("register_all_submodule_sources() called"); + } + return ret; +} + static int do_oid_object_info_extended(struct repository *r, const struct object_id *oid, struct object_info *oi, unsigned flags) @@ -676,13 +700,12 @@ static int do_oid_object_info_extended(struct repository *r, } /* - * If r is the_repository, this might be an attempt at - * accessing a submodule object as if it were in the_repository - * (having called add_submodule_odb() on that submodule's ODB). - * If any such ODBs exist, register them and try again. + * This might be an attempt at accessing a submodule object as + * if it were in main object store (having called + * `odb_add_submodule_source_by_path()` on that submodule's + * ODB). If any such ODBs exist, register them and try again. */ - if (r == the_repository && - register_all_submodule_odb_as_alternates()) + if (register_all_submodule_sources(r->objects)) /* We added some alternates; retry */ continue; @@ -968,6 +991,7 @@ struct object_database *odb_new(struct repository *repo) INIT_LIST_HEAD(&o->packed_git_mru); hashmap_init(&o->pack_map, pack_map_entry_cmp, NULL, 0); pthread_mutex_init(&o->replace_mutex, NULL); + string_list_init_dup(&o->submodule_source_paths); return o; } @@ -1017,4 +1041,5 @@ void odb_clear(struct object_database *o) o->packed_git = NULL; hashmap_clear(&o->pack_map); + string_list_clear(&o->submodule_source_paths, 0); } diff --git a/odb.h b/odb.h index 4e2d1004f8..0ea9d4faa7 100644 --- a/odb.h +++ b/odb.h @@ -6,6 +6,7 @@ #include "list.h" #include "oidset.h" #include "oidmap.h" +#include "string-list.h" #include "thread-utils.h" struct oidmap; @@ -165,6 +166,12 @@ struct object_database { * packs. */ unsigned packed_git_initialized : 1; + + /* + * Submodule source paths that will be added as additional sources to + * allow lookup of submodule objects via the main object database. + */ + struct string_list submodule_source_paths; }; struct object_database *odb_new(struct repository *repo); @@ -191,6 +198,14 @@ void odb_restore_primary_source(struct object_database *odb, struct odb_source *restore_source, const char *old_path); +/* + * Call odb_add_submodule_source_by_path() to add the submodule at the given + * path to a list. The object stores of all submodules in that list will be + * added as additional sources in the object store when looking up objects. + */ +void odb_add_submodule_source_by_path(struct object_database *odb, + const char *path); + /* * Iterate through all alternates of the database and execute the provided * callback function for each of them. Stop iterating once the callback diff --git a/submodule-config.c b/submodule-config.c index 9c80f9f7b6..a9f7210788 100644 --- a/submodule-config.c +++ b/submodule-config.c @@ -810,7 +810,8 @@ static void config_from_gitmodules(config_fn_t fn, struct repository *repo, void repo_get_oid(repo, GITMODULES_HEAD, &oid) >= 0) { config_source.blob = oidstr = xstrdup(oid_to_hex(&oid)); if (repo != the_repository) - add_submodule_odb_by_path(repo->objects->sources->path); + odb_add_submodule_source_by_path(the_repository->objects, + repo->objects->sources->path); } else { goto out; } diff --git a/submodule.c b/submodule.c index 386be23423..788c9e55ed 100644 --- a/submodule.c +++ b/submodule.c @@ -31,7 +31,6 @@ #include "commit-reach.h" #include "read-cache-ll.h" #include "setup.h" -#include "trace2.h" static int config_update_recurse_submodules = RECURSE_SUBMODULES_OFF; static int initialized_fetch_ref_tips; @@ -176,31 +175,6 @@ void stage_updated_gitmodules(struct index_state *istate) die(_("staging updated .gitmodules failed")); } -static struct string_list added_submodule_odb_paths = STRING_LIST_INIT_DUP; - -void add_submodule_odb_by_path(const char *path) -{ - string_list_insert(&added_submodule_odb_paths, path); -} - -int register_all_submodule_odb_as_alternates(void) -{ - int i; - int ret = added_submodule_odb_paths.nr; - - for (i = 0; i < added_submodule_odb_paths.nr; i++) - odb_add_to_alternates_memory(the_repository->objects, - added_submodule_odb_paths.items[i].string); - if (ret) { - string_list_clear(&added_submodule_odb_paths, 0); - trace2_data_intmax("submodule", the_repository, - "register_all_submodule_odb_as_alternates/registered", ret); - if (git_env_bool("GIT_TEST_FATAL_REGISTER_SUBMODULE_ODB", 0)) - BUG("register_all_submodule_odb_as_alternates() called"); - } - return ret; -} - void set_diffopt_flags_from_submodule_config(struct diff_options *diffopt, const char *path) { diff --git a/submodule.h b/submodule.h index db980c1d08..b10e16e6c0 100644 --- a/submodule.h +++ b/submodule.h @@ -104,15 +104,6 @@ int submodule_uses_gitfile(const char *path); #define SUBMODULE_REMOVAL_IGNORE_IGNORED_UNTRACKED (1<<2) int bad_to_remove_submodule(const char *path, unsigned flags); -/* - * Call add_submodule_odb_by_path() to add the submodule at the given - * path to a list. When register_all_submodule_odb_as_alternates() is - * called, the object stores of all submodules in that list will be - * added as alternates in the_repository. - */ -void add_submodule_odb_by_path(const char *path); -int register_all_submodule_odb_as_alternates(void); - /* * Checks if there are submodule changes in a..b. If a is the null OID, * checks b and all its ancestors instead. -- cgit v1.3 From e989dd96b8aa9b20b0e23d3fa845d0baba1b454a Mon Sep 17 00:00:00 2001 From: Patrick Steinhardt Date: Tue, 1 Jul 2025 14:22:25 +0200 Subject: odb: rename `oid_object_info()` Rename `oid_object_info()` to `odb_read_object_info()` as well as their `_extended()` variant to match other functions related to the object database and our modern coding guidelines. Introduce compatibility wrappers so that any in-flight topics will continue to compile. Signed-off-by: Patrick Steinhardt Signed-off-by: Junio C Hamano --- archive.c | 2 +- blame.c | 4 +-- builtin/blame.c | 4 +-- builtin/cat-file.c | 26 ++++++++++--------- builtin/describe.c | 3 ++- builtin/fast-export.c | 2 +- builtin/fast-import.c | 17 ++++++------ builtin/fsck.c | 7 ++--- builtin/gc.c | 2 +- builtin/grep.c | 2 +- builtin/index-pack.c | 13 +++++----- builtin/ls-files.c | 2 +- builtin/ls-tree.c | 4 +-- builtin/mktree.c | 8 +++--- builtin/pack-objects.c | 30 ++++++++++++---------- builtin/prune.c | 4 +-- builtin/repack.c | 2 +- builtin/replace.c | 10 ++++---- builtin/rev-list.c | 6 +++-- builtin/tag.c | 4 +-- builtin/unpack-objects.c | 2 +- commit-graph.c | 2 +- commit.c | 3 ++- diff.c | 18 ++++++------- fetch-pack.c | 4 +-- list-objects-filter.c | 2 +- log-tree.c | 2 +- merge-ort.c | 4 +-- object-file.c | 2 +- object-file.h | 2 +- object-name.c | 16 ++++++------ object.c | 6 ++--- odb.c | 60 ++++++++++++++++++++++--------------------- odb.h | 46 +++++++++++++++++++++++++++------ pack-bitmap-write.c | 4 +-- pack-bitmap.c | 8 +++--- packfile.c | 5 ++-- promisor-remote.c | 4 +-- protocol-caps.c | 2 +- reachable.c | 2 +- read-cache.c | 6 ++--- ref-filter.c | 4 +-- remote.c | 5 ++-- sequencer.c | 5 ++-- streaming.c | 8 +++--- submodule.c | 5 ++-- t/helper/test-partial-clone.c | 2 +- tag.c | 2 +- 48 files changed, 213 insertions(+), 170 deletions(-) (limited to 'submodule.c') diff --git a/archive.c b/archive.c index 7fa2cc2596..f2511d530d 100644 --- a/archive.c +++ b/archive.c @@ -215,7 +215,7 @@ static int write_archive_entry(const struct object_id *oid, const char *base, /* Stream it? */ if (S_ISREG(mode) && !args->convert && - oid_object_info(args->repo, oid, &size) == OBJ_BLOB && + odb_read_object_info(args->repo->objects, oid, &size) == OBJ_BLOB && size > repo_settings_get_big_file_threshold(the_repository)) return write_entry(args, oid, path.buf, path.len, mode, NULL, size); diff --git a/blame.c b/blame.c index 0ceea080a8..97db3355af 100644 --- a/blame.c +++ b/blame.c @@ -116,7 +116,7 @@ static void verify_working_tree_path(struct repository *r, unsigned short mode; if (!get_tree_entry(r, commit_oid, path, &blob_oid, &mode) && - oid_object_info(r, &blob_oid, NULL) == OBJ_BLOB) + odb_read_object_info(r->objects, &blob_oid, NULL) == OBJ_BLOB) return; } @@ -1245,7 +1245,7 @@ static int fill_blob_sha1_and_mode(struct repository *r, return 0; if (get_tree_entry(r, &origin->commit->object.oid, origin->path, &origin->blob_oid, &origin->mode)) goto error_out; - if (oid_object_info(r, &origin->blob_oid, NULL) != OBJ_BLOB) + if (odb_read_object_info(r->objects, &origin->blob_oid, NULL) != OBJ_BLOB) goto error_out; return 0; error_out: diff --git a/builtin/blame.c b/builtin/blame.c index 15eda60af9..91586e6852 100644 --- a/builtin/blame.c +++ b/builtin/blame.c @@ -837,7 +837,7 @@ static int is_a_rev(const char *name) if (repo_get_oid(the_repository, name, &oid)) return 0; - return OBJ_NONE < oid_object_info(the_repository, &oid, NULL); + return OBJ_NONE < odb_read_object_info(the_repository->objects, &oid, NULL); } static int peel_to_commit_oid(struct object_id *oid_ret, void *cbdata) @@ -848,7 +848,7 @@ static int peel_to_commit_oid(struct object_id *oid_ret, void *cbdata) oidcpy(&oid, oid_ret); while (1) { struct object *obj; - int kind = oid_object_info(r, &oid, NULL); + int kind = odb_read_object_info(r->objects, &oid, NULL); if (kind == OBJ_COMMIT) { oidcpy(oid_ret, &oid); return 0; diff --git a/builtin/cat-file.c b/builtin/cat-file.c index f3a925a818..f7595fdb04 100644 --- a/builtin/cat-file.c +++ b/builtin/cat-file.c @@ -132,7 +132,7 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name) switch (opt) { case 't': oi.typep = &type; - if (oid_object_info_extended(the_repository, &oid, &oi, flags) < 0) + if (odb_read_object_info_extended(the_repository->objects, &oid, &oi, flags) < 0) die("git cat-file: could not get object info"); printf("%s\n", type_name(type)); ret = 0; @@ -146,7 +146,7 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name) oi.contentp = (void**)&buf; } - if (oid_object_info_extended(the_repository, &oid, &oi, flags) < 0) + if (odb_read_object_info_extended(the_repository->objects, &oid, &oi, flags) < 0) die("git cat-file: could not get object info"); if (use_mailmap && (type == OBJ_COMMIT || type == OBJ_TAG)) { @@ -180,7 +180,7 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name) /* else fallthrough */ case 'p': - type = oid_object_info(the_repository, &oid, NULL); + type = odb_read_object_info(the_repository->objects, &oid, NULL); if (type < 0) die("Not a valid object name %s", obj_name); @@ -217,7 +217,8 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name) if (exp_type_id == OBJ_BLOB) { struct object_id blob_oid; - if (oid_object_info(the_repository, &oid, NULL) == OBJ_TAG) { + if (odb_read_object_info(the_repository->objects, + &oid, NULL) == OBJ_TAG) { char *buffer = repo_read_object_file(the_repository, &oid, &type, @@ -235,7 +236,8 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name) } else oidcpy(&blob_oid, &oid); - if (oid_object_info(the_repository, &blob_oid, NULL) == OBJ_BLOB) { + if (odb_read_object_info(the_repository->objects, + &blob_oid, NULL) == OBJ_BLOB) { ret = stream_blob(&blob_oid); goto cleanup; } @@ -294,7 +296,7 @@ struct expand_data { /* * After a mark_query run, this object_info is set up to be - * passed to oid_object_info_extended. It will point to the data + * passed to odb_read_object_info_extended. It will point to the data * elements above, so you can retrieve the response from there. */ struct object_info info; @@ -484,12 +486,12 @@ static void batch_object_write(const char *obj_name, data->info.sizep = &data->size; if (pack) - ret = packed_object_info(the_repository, pack, offset, - &data->info); + ret = packed_object_info(the_repository, pack, + offset, &data->info); else - ret = oid_object_info_extended(the_repository, - &data->oid, &data->info, - OBJECT_INFO_LOOKUP_REPLACE); + ret = odb_read_object_info_extended(the_repository->objects, + &data->oid, &data->info, + OBJECT_INFO_LOOKUP_REPLACE); if (ret < 0) { report_object_status(opt, obj_name, &data->oid, "missing"); return; @@ -872,7 +874,7 @@ static int batch_objects(struct batch_options *opt) /* * Expand once with our special mark_query flag, which will prime the - * object_info to be handed to oid_object_info_extended for each + * object_info to be handed to odb_read_object_info_extended for each * object. */ memset(&data, 0, sizeof(data)); diff --git a/builtin/describe.c b/builtin/describe.c index 96cb68e5e5..fbf305d762 100644 --- a/builtin/describe.c +++ b/builtin/describe.c @@ -552,7 +552,8 @@ static void describe(const char *arg, int last_one) if (cmit) describe_commit(&oid, &sb); - else if (oid_object_info(the_repository, &oid, NULL) == OBJ_BLOB) + else if (odb_read_object_info(the_repository->objects, + &oid, NULL) == OBJ_BLOB) describe_blob(oid, &sb); else die(_("%s is neither a commit nor blob"), arg); diff --git a/builtin/fast-export.c b/builtin/fast-export.c index 0505f289a9..6c93cf0a8a 100644 --- a/builtin/fast-export.c +++ b/builtin/fast-export.c @@ -1200,7 +1200,7 @@ static void import_marks(char *input_file, int check_exists) if (last_idnum < mark) last_idnum = mark; - type = oid_object_info(the_repository, &oid, NULL); + type = odb_read_object_info(the_repository->objects, &oid, NULL); if (type < 0) die("object not found: %s", oid_to_hex(&oid)); diff --git a/builtin/fast-import.c b/builtin/fast-import.c index 413304db9b..2718376f2c 100644 --- a/builtin/fast-import.c +++ b/builtin/fast-import.c @@ -1756,8 +1756,8 @@ static void insert_object_entry(struct mark_set **s, struct object_id *oid, uint struct object_entry *e; e = find_object(oid); if (!e) { - enum object_type type = oid_object_info(the_repository, - oid, NULL); + enum object_type type = odb_read_object_info(the_repository->objects, + oid, NULL); if (type < 0) die("object not found: %s", oid_to_hex(oid)); e = insert_object(oid); @@ -2416,8 +2416,8 @@ static void file_change_m(const char *p, struct branch *b) enum object_type expected = S_ISDIR(mode) ? OBJ_TREE: OBJ_BLOB; enum object_type type = oe ? oe->type : - oid_object_info(the_repository, &oid, - NULL); + odb_read_object_info(the_repository->objects, + &oid, NULL); if (type < 0) die("%s not found: %s", S_ISDIR(mode) ? "Tree" : "Blob", @@ -2553,7 +2553,7 @@ static void note_change_n(const char *p, struct branch *b, unsigned char *old_fa die("Not a blob (actually a %s): %s", type_name(oe->type), command_buf.buf); } else if (!is_null_oid(&oid)) { - enum object_type type = oid_object_info(the_repository, &oid, + enum object_type type = odb_read_object_info(the_repository->objects, &oid, NULL); if (type < 0) die("Blob not found: %s", command_buf.buf); @@ -2895,7 +2895,8 @@ static void parse_new_tag(const char *arg) } else if (!repo_get_oid(the_repository, from, &oid)) { struct object_entry *oe = find_object(&oid); if (!oe) { - type = oid_object_info(the_repository, &oid, NULL); + type = odb_read_object_info(the_repository->objects, + &oid, NULL); if (type < 0) die("Not a valid object: %s", from); } else @@ -3085,8 +3086,8 @@ static struct object_entry *dereference(struct object_entry *oe, const unsigned hexsz = the_hash_algo->hexsz; if (!oe) { - enum object_type type = oid_object_info(the_repository, oid, - NULL); + enum object_type type = odb_read_object_info(the_repository->objects, + oid, NULL); if (type < 0) die("object not found: %s", oid_to_hex(oid)); /* cache it! */ diff --git a/builtin/fsck.c b/builtin/fsck.c index 014aa1344e..6e3465b026 100644 --- a/builtin/fsck.c +++ b/builtin/fsck.c @@ -71,7 +71,8 @@ static const char *printable_type(const struct object_id *oid, const char *ret; if (type == OBJ_NONE) - type = oid_object_info(the_repository, oid, NULL); + type = odb_read_object_info(the_repository->objects, + oid, NULL); ret = type_name(type); if (!ret) @@ -232,8 +233,8 @@ static void mark_unreachable_referents(const struct object_id *oid) * (and we want to avoid parsing blobs). */ if (obj->type == OBJ_NONE) { - enum object_type type = oid_object_info(the_repository, - &obj->oid, NULL); + enum object_type type = odb_read_object_info(the_repository->objects, + &obj->oid, NULL); if (type > 0) object_as_type(obj, type, 0); } diff --git a/builtin/gc.c b/builtin/gc.c index 50a09eb07e..ff551fab43 100644 --- a/builtin/gc.c +++ b/builtin/gc.c @@ -1080,7 +1080,7 @@ static int dfs_on_ref(const char *refname UNUSED, if (!peel_iterated_oid(the_repository, oid, &peeled)) oid = &peeled; - if (oid_object_info(the_repository, oid, NULL) != OBJ_COMMIT) + if (odb_read_object_info(the_repository->objects, oid, NULL) != OBJ_COMMIT) return 0; commit = lookup_commit(the_repository, oid); diff --git a/builtin/grep.c b/builtin/grep.c index cfcf916bce..1435d462cd 100644 --- a/builtin/grep.c +++ b/builtin/grep.c @@ -520,7 +520,7 @@ static int grep_submodule(struct grep_opt *opt, struct strbuf base = STRBUF_INIT; obj_read_lock(); - object_type = oid_object_info(subrepo, oid, NULL); + object_type = odb_read_object_info(subrepo->objects, oid, NULL); obj_read_unlock(); data = read_object_with_reference(subrepo, oid, OBJ_TREE, diff --git a/builtin/index-pack.c b/builtin/index-pack.c index 4d4d989eb1..d0b1690812 100644 --- a/builtin/index-pack.c +++ b/builtin/index-pack.c @@ -260,7 +260,8 @@ static unsigned check_object(struct object *obj) if (!(obj->flags & FLAG_CHECKED)) { unsigned long size; - int type = oid_object_info(the_repository, &obj->oid, &size); + int type = odb_read_object_info(the_repository->objects, + &obj->oid, &size); if (type <= 0) die(_("did not receive expected object %s"), oid_to_hex(&obj->oid)); @@ -908,7 +909,7 @@ static void sha1_object(const void *data, struct object_entry *obj_entry, enum object_type has_type; unsigned long has_size; read_lock(); - has_type = oid_object_info(the_repository, oid, &has_size); + has_type = odb_read_object_info(the_repository->objects, oid, &has_size); if (has_type < 0) die(_("cannot read existing object info %s"), oid_to_hex(oid)); if (has_type != type || has_size != size) @@ -1501,9 +1502,9 @@ static void fix_unresolved_deltas(struct hashfile *f) struct oid_array to_fetch = OID_ARRAY_INIT; for (i = 0; i < nr_ref_deltas; i++) { struct ref_delta_entry *d = sorted_by_pos[i]; - if (!oid_object_info_extended(the_repository, &d->oid, - NULL, - OBJECT_INFO_FOR_PREFETCH)) + if (!odb_read_object_info_extended(the_repository->objects, + &d->oid, NULL, + OBJECT_INFO_FOR_PREFETCH)) continue; oid_array_append(&to_fetch, &d->oid); } @@ -1829,7 +1830,7 @@ static void repack_local_links(void) oidset_iter_init(&outgoing_links, &iter); while ((oid = oidset_iter_next(&iter))) { struct object_info info = OBJECT_INFO_INIT; - if (oid_object_info_extended(the_repository, oid, &info, 0)) + if (odb_read_object_info_extended(the_repository->objects, oid, &info, 0)) /* Missing; assume it is a promisor object */ continue; if (info.whence == OI_PACKED && info.u.packed.pack->pack_promisor) diff --git a/builtin/ls-files.c b/builtin/ls-files.c index 821339b07d..ff975e7be0 100644 --- a/builtin/ls-files.c +++ b/builtin/ls-files.c @@ -251,7 +251,7 @@ static void expand_objectsize(struct repository *repo, struct strbuf *line, { if (type == OBJ_BLOB) { unsigned long size; - if (oid_object_info(repo, oid, &size) < 0) + if (odb_read_object_info(repo->objects, oid, &size) < 0) die(_("could not get object info about '%s'"), oid_to_hex(oid)); if (padded) diff --git a/builtin/ls-tree.c b/builtin/ls-tree.c index 62b6fd58c1..4d616dd528 100644 --- a/builtin/ls-tree.c +++ b/builtin/ls-tree.c @@ -27,7 +27,7 @@ static void expand_objectsize(struct strbuf *line, const struct object_id *oid, { if (type == OBJ_BLOB) { unsigned long size; - if (oid_object_info(the_repository, oid, &size) < 0) + if (odb_read_object_info(the_repository->objects, oid, &size) < 0) die(_("could not get object info about '%s'"), oid_to_hex(oid)); if (padded) @@ -217,7 +217,7 @@ static int show_tree_long(const struct object_id *oid, struct strbuf *base, if (type == OBJ_BLOB) { unsigned long size; - if (oid_object_info(the_repository, oid, &size) == OBJ_BAD) + if (odb_read_object_info(the_repository->objects, oid, &size) == OBJ_BAD) xsnprintf(size_text, sizeof(size_text), "BAD"); else xsnprintf(size_text, sizeof(size_text), diff --git a/builtin/mktree.c b/builtin/mktree.c index 016b0e5b22..81df7f6099 100644 --- a/builtin/mktree.c +++ b/builtin/mktree.c @@ -124,10 +124,10 @@ static void mktree_line(char *buf, int nul_term_line, int allow_missing) /* Check the type of object identified by oid without fetching objects */ oi.typep = &obj_type; - if (oid_object_info_extended(the_repository, &oid, &oi, - OBJECT_INFO_LOOKUP_REPLACE | - OBJECT_INFO_QUICK | - OBJECT_INFO_SKIP_FETCH_OBJECT) < 0) + if (odb_read_object_info_extended(the_repository->objects, &oid, &oi, + OBJECT_INFO_LOOKUP_REPLACE | + OBJECT_INFO_QUICK | + OBJECT_INFO_SKIP_FETCH_OBJECT) < 0) obj_type = -1; if (obj_type < 0) { diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c index 99b63cb098..da35d68408 100644 --- a/builtin/pack-objects.c +++ b/builtin/pack-objects.c @@ -2154,10 +2154,10 @@ static void prefetch_to_pack(uint32_t object_index_start) { for (i = object_index_start; i < to_pack.nr_objects; i++) { struct object_entry *entry = to_pack.objects + i; - if (!oid_object_info_extended(the_repository, - &entry->idx.oid, - NULL, - OBJECT_INFO_FOR_PREFETCH)) + if (!odb_read_object_info_extended(the_repository->objects, + &entry->idx.oid, + NULL, + OBJECT_INFO_FOR_PREFETCH)) continue; oid_array_append(&to_fetch, &entry->idx.oid); } @@ -2298,19 +2298,19 @@ static void check_object(struct object_entry *entry, uint32_t object_index) /* * No choice but to fall back to the recursive delta walk - * with oid_object_info() to find about the object type + * with odb_read_object_info() to find about the object type * at this point... */ give_up: unuse_pack(&w_curs); } - if (oid_object_info_extended(the_repository, &entry->idx.oid, &oi, - OBJECT_INFO_SKIP_FETCH_OBJECT | OBJECT_INFO_LOOKUP_REPLACE) < 0) { + if (odb_read_object_info_extended(the_repository->objects, &entry->idx.oid, &oi, + OBJECT_INFO_SKIP_FETCH_OBJECT | OBJECT_INFO_LOOKUP_REPLACE) < 0) { if (repo_has_promisor_remote(the_repository)) { prefetch_to_pack(object_index); - if (oid_object_info_extended(the_repository, &entry->idx.oid, &oi, - OBJECT_INFO_SKIP_FETCH_OBJECT | OBJECT_INFO_LOOKUP_REPLACE) < 0) + if (odb_read_object_info_extended(the_repository->objects, &entry->idx.oid, &oi, + OBJECT_INFO_SKIP_FETCH_OBJECT | OBJECT_INFO_LOOKUP_REPLACE) < 0) type = -1; } else { type = -1; @@ -2384,12 +2384,13 @@ static void drop_reused_delta(struct object_entry *entry) if (packed_object_info(the_repository, IN_PACK(entry), entry->in_pack_offset, &oi) < 0) { /* * We failed to get the info from this pack for some reason; - * fall back to oid_object_info, which may find another copy. + * fall back to odb_read_object_info, which may find another copy. * And if that fails, the error will be recorded in oe_type(entry) * and dealt with in prepare_pack(). */ oe_set_type(entry, - oid_object_info(the_repository, &entry->idx.oid, &size)); + odb_read_object_info(the_repository->objects, + &entry->idx.oid, &size)); } else { oe_set_type(entry, type); } @@ -2677,7 +2678,8 @@ unsigned long oe_get_size_slow(struct packing_data *pack, if (e->type_ != OBJ_OFS_DELTA && e->type_ != OBJ_REF_DELTA) { packing_data_lock(&to_pack); - if (oid_object_info(the_repository, &e->idx.oid, &size) < 0) + if (odb_read_object_info(the_repository->objects, + &e->idx.oid, &size) < 0) die(_("unable to get size of %s"), oid_to_hex(&e->idx.oid)); packing_data_unlock(&to_pack); @@ -4063,7 +4065,7 @@ static void add_objects_in_unpacked_packs(void) static int add_loose_object(const struct object_id *oid, const char *path, void *data UNUSED) { - enum object_type type = oid_object_info(the_repository, oid, NULL); + enum object_type type = odb_read_object_info(the_repository->objects, oid, NULL); if (type < 0) { warning(_("loose object at %s could not be examined"), path); @@ -4449,7 +4451,7 @@ static int option_parse_cruft_expiration(const struct option *opt UNUSED, static int is_not_in_promisor_pack_obj(struct object *obj, void *data UNUSED) { struct object_info info = OBJECT_INFO_INIT; - if (oid_object_info_extended(the_repository, &obj->oid, &info, 0)) + if (odb_read_object_info_extended(the_repository->objects, &obj->oid, &info, 0)) BUG("should_include_obj should only be called on existing objects"); return info.whence != OI_PACKED || !info.u.packed.pack->pack_promisor; } diff --git a/builtin/prune.c b/builtin/prune.c index 7bbfb14c2b..339017c7cc 100644 --- a/builtin/prune.c +++ b/builtin/prune.c @@ -99,8 +99,8 @@ static int prune_object(const struct object_id *oid, const char *fullpath, if (st.st_mtime > expire) return 0; if (show_only || verbose) { - enum object_type type = oid_object_info(the_repository, oid, - NULL); + enum object_type type = odb_read_object_info(the_repository->objects, + oid, NULL); printf("%s %s\n", oid_to_hex(oid), (type > 0) ? type_name(type) : "unknown"); } diff --git a/builtin/repack.c b/builtin/repack.c index 8145474cf8..a89c2b704f 100644 --- a/builtin/repack.c +++ b/builtin/repack.c @@ -707,7 +707,7 @@ static int midx_snapshot_ref_one(const char *refname UNUSED, if (oidset_insert(&data->seen, oid)) return 0; /* already seen */ - if (oid_object_info(the_repository, oid, NULL) != OBJ_COMMIT) + if (odb_read_object_info(the_repository->objects, oid, NULL) != OBJ_COMMIT) return 0; fprintf(data->f->fp, "%s%s\n", data->preferred ? "+" : "", diff --git a/builtin/replace.c b/builtin/replace.c index 11c7e2d4c0..5ff2ab723c 100644 --- a/builtin/replace.c +++ b/builtin/replace.c @@ -65,8 +65,8 @@ static int show_reference(const char *refname, if (repo_get_oid(data->repo, refname, &object)) return error(_("failed to resolve '%s' as a valid ref"), refname); - obj_type = oid_object_info(data->repo, &object, NULL); - repl_type = oid_object_info(data->repo, oid, NULL); + obj_type = odb_read_object_info(data->repo->objects, &object, NULL); + repl_type = odb_read_object_info(data->repo->objects, oid, NULL); printf("%s (%s) -> %s (%s)\n", refname, type_name(obj_type), oid_to_hex(oid), type_name(repl_type)); @@ -185,8 +185,8 @@ static int replace_object_oid(const char *object_ref, struct strbuf err = STRBUF_INIT; int res = 0; - obj_type = oid_object_info(the_repository, object, NULL); - repl_type = oid_object_info(the_repository, repl, NULL); + obj_type = odb_read_object_info(the_repository->objects, object, NULL); + repl_type = odb_read_object_info(the_repository->objects, repl, NULL); if (!force && obj_type != repl_type) return error(_("Objects must be of the same type.\n" "'%s' points to a replaced object of type '%s'\n" @@ -334,7 +334,7 @@ static int edit_and_replace(const char *object_ref, int force, int raw) if (repo_get_oid(the_repository, object_ref, &old_oid) < 0) return error(_("not a valid object name: '%s'"), object_ref); - type = oid_object_info(the_repository, &old_oid, NULL); + type = odb_read_object_info(the_repository->objects, &old_oid, NULL); if (type < 0) return error(_("unable to get object type for %s"), oid_to_hex(&old_oid)); diff --git a/builtin/rev-list.c b/builtin/rev-list.c index 0ee37a32cb..4d0c460f18 100644 --- a/builtin/rev-list.c +++ b/builtin/rev-list.c @@ -110,7 +110,8 @@ static off_t get_object_disk_usage(struct object *obj) off_t size; struct object_info oi = OBJECT_INFO_INIT; oi.disk_sizep = &size; - if (oid_object_info_extended(the_repository, &obj->oid, &oi, 0) < 0) + if (odb_read_object_info_extended(the_repository->objects, + &obj->oid, &oi, 0) < 0) die(_("unable to get disk usage of %s"), oid_to_hex(&obj->oid)); return size; } @@ -346,7 +347,8 @@ static void show_commit(struct commit *commit, void *data) static int finish_object(struct object *obj, const char *name, void *cb_data) { struct rev_list_info *info = cb_data; - if (oid_object_info_extended(the_repository, &obj->oid, NULL, 0) < 0) { + if (odb_read_object_info_extended(the_repository->objects, + &obj->oid, NULL, 0) < 0) { finish_object__ma(obj, name); return 1; } diff --git a/builtin/tag.c b/builtin/tag.c index cf2ea4b499..e0b27396c6 100644 --- a/builtin/tag.c +++ b/builtin/tag.c @@ -304,7 +304,7 @@ static void create_tag(const struct object_id *object, const char *object_ref, struct strbuf header = STRBUF_INIT; int should_edit; - type = oid_object_info(the_repository, object, NULL); + type = odb_read_object_info(the_repository->objects, object, NULL); if (type <= OBJ_NONE) die(_("bad object type.")); @@ -401,7 +401,7 @@ static void create_reflog_msg(const struct object_id *oid, struct strbuf *sb) } strbuf_addstr(sb, " ("); - type = oid_object_info(the_repository, oid, NULL); + type = odb_read_object_info(the_repository->objects, oid, NULL); switch (type) { default: strbuf_addstr(sb, "object of unknown type"); diff --git a/builtin/unpack-objects.c b/builtin/unpack-objects.c index 7bf395eec8..405e78bc59 100644 --- a/builtin/unpack-objects.c +++ b/builtin/unpack-objects.c @@ -232,7 +232,7 @@ static int check_object(struct object *obj, enum object_type type, if (!(obj->flags & FLAG_OPEN)) { unsigned long size; - int type = oid_object_info(the_repository, &obj->oid, &size); + int type = odb_read_object_info(the_repository->objects, &obj->oid, &size); if (type != obj->type || type <= 0) die("object of unexpected type"); obj->flags |= FLAG_WRITTEN; diff --git a/commit-graph.c b/commit-graph.c index 59265f8938..5f482d3377 100644 --- a/commit-graph.c +++ b/commit-graph.c @@ -1862,7 +1862,7 @@ static int add_ref_to_set(const char *refname UNUSED, if (!peel_iterated_oid(the_repository, oid, &peeled)) oid = &peeled; - if (oid_object_info(the_repository, oid, NULL) == OBJ_COMMIT) + if (odb_read_object_info(the_repository->objects, oid, NULL) == OBJ_COMMIT) oidset_insert(data->commits, oid); display_progress(data->progress, oidset_size(data->commits)); diff --git a/commit.c b/commit.c index aa65183d8b..d4aa9c7a5f 100644 --- a/commit.c +++ b/commit.c @@ -585,7 +585,8 @@ int repo_parse_commit_internal(struct repository *r, return 0; } - if (oid_object_info_extended(r, &item->object.oid, &oi, flags) < 0) + if (odb_read_object_info_extended(r->objects, &item->object.oid, + &oi, flags) < 0) return quiet_on_missing ? -1 : error("Could not read %s", oid_to_hex(&item->object.oid)); diff --git a/diff.c b/diff.c index 3af108115b..dca87e164f 100644 --- a/diff.c +++ b/diff.c @@ -4230,14 +4230,14 @@ int diff_populate_filespec(struct repository *r, info.contentp = &s->data; if (options && options->missing_object_cb) { - if (!oid_object_info_extended(r, &s->oid, &info, - OBJECT_INFO_LOOKUP_REPLACE | - OBJECT_INFO_SKIP_FETCH_OBJECT)) + if (!odb_read_object_info_extended(r->objects, &s->oid, &info, + OBJECT_INFO_LOOKUP_REPLACE | + OBJECT_INFO_SKIP_FETCH_OBJECT)) goto object_read; options->missing_object_cb(options->missing_object_data); } - if (oid_object_info_extended(r, &s->oid, &info, - OBJECT_INFO_LOOKUP_REPLACE)) + if (odb_read_object_info_extended(r->objects, &s->oid, &info, + OBJECT_INFO_LOOKUP_REPLACE)) die("unable to read %s", oid_to_hex(&s->oid)); object_read: @@ -4252,8 +4252,8 @@ object_read: } if (!info.contentp) { info.contentp = &s->data; - if (oid_object_info_extended(r, &s->oid, &info, - OBJECT_INFO_LOOKUP_REPLACE)) + if (odb_read_object_info_extended(r->objects, &s->oid, &info, + OBJECT_INFO_LOOKUP_REPLACE)) die("unable to read %s", oid_to_hex(&s->oid)); } s->should_free = 1; @@ -7019,8 +7019,8 @@ void diff_add_if_missing(struct repository *r, { if (filespec && filespec->oid_valid && !S_ISGITLINK(filespec->mode) && - oid_object_info_extended(r, &filespec->oid, NULL, - OBJECT_INFO_FOR_PREFETCH)) + odb_read_object_info_extended(r->objects, &filespec->oid, NULL, + OBJECT_INFO_FOR_PREFETCH)) oid_array_append(to_fetch, &filespec->oid); } diff --git a/fetch-pack.c b/fetch-pack.c index 47fa7fa4c4..0f5de1c94d 100644 --- a/fetch-pack.c +++ b/fetch-pack.c @@ -149,8 +149,8 @@ static struct commit *deref_without_lazy_fetch(const struct object_id *oid, } while (1) { - if (oid_object_info_extended(the_repository, oid, &info, - OBJECT_INFO_SKIP_FETCH_OBJECT | OBJECT_INFO_QUICK)) + if (odb_read_object_info_extended(the_repository->objects, oid, &info, + OBJECT_INFO_SKIP_FETCH_OBJECT | OBJECT_INFO_QUICK)) return NULL; if (type == OBJ_TAG) { struct tag *tag = (struct tag *) diff --git a/list-objects-filter.c b/list-objects-filter.c index 80fe48a52c..7ecd4d9ef5 100644 --- a/list-objects-filter.c +++ b/list-objects-filter.c @@ -310,7 +310,7 @@ static enum list_objects_filter_result filter_blobs_limit( assert(obj->type == OBJ_BLOB); assert((obj->flags & SEEN) == 0); - t = oid_object_info(r, &obj->oid, &object_length); + t = odb_read_object_info(r->objects, &obj->oid, &object_length); if (t != OBJ_BLOB) { /* probably OBJ_NONE */ /* * We DO NOT have the blob locally, so we cannot diff --git a/log-tree.c b/log-tree.c index 1d05dc1c70..233bf9f227 100644 --- a/log-tree.c +++ b/log-tree.c @@ -176,7 +176,7 @@ static int add_ref_decoration(const char *refname, const char *referent UNUSED, return 0; } - objtype = oid_object_info(the_repository, oid, NULL); + objtype = odb_read_object_info(the_repository->objects, oid, NULL); if (objtype < 0) return 0; obj = lookup_object_by_type(the_repository, oid, objtype); diff --git a/merge-ort.c b/merge-ort.c index 9f693ab1d3..f29417040c 100644 --- a/merge-ort.c +++ b/merge-ort.c @@ -4385,8 +4385,8 @@ static void prefetch_for_content_merges(struct merge_options *opt, if ((ci->filemask & side_mask) && S_ISREG(vi->mode) && - oid_object_info_extended(opt->repo, &vi->oid, NULL, - OBJECT_INFO_FOR_PREFETCH)) + odb_read_object_info_extended(opt->repo->objects, &vi->oid, NULL, + OBJECT_INFO_FOR_PREFETCH)) oid_array_append(&to_fetch, &vi->oid); } } diff --git a/object-file.c b/object-file.c index 04da19a1a3..3d674d1093 100644 --- a/object-file.c +++ b/object-file.c @@ -1108,7 +1108,7 @@ int force_object_loose(const struct object_id *oid, time_t mtime) oi.typep = &type; oi.sizep = &len; oi.contentp = &buf; - if (oid_object_info_extended(the_repository, oid, &oi, 0)) + if (odb_read_object_info_extended(the_repository->objects, oid, &oi, 0)) return error(_("cannot read object for %s"), oid_to_hex(oid)); if (compat) { if (repo_oid_to_algop(repo, oid, compat, &compat_oid)) diff --git a/object-file.h b/object-file.h index 5066638f8e..67b4ffc480 100644 --- a/object-file.h +++ b/object-file.h @@ -8,7 +8,7 @@ struct index_state; /* - * Set this to 0 to prevent oid_object_info_extended() from fetching missing + * Set this to 0 to prevent odb_read_object_info_extended() from fetching missing * blobs. This has a difference only if extensions.partialClone is set. * * Its default value is 1. diff --git a/object-name.c b/object-name.c index 381536e900..e225eb602c 100644 --- a/object-name.c +++ b/object-name.c @@ -251,7 +251,7 @@ static int disambiguate_commit_only(struct repository *r, const struct object_id *oid, void *cb_data UNUSED) { - int kind = oid_object_info(r, oid, NULL); + int kind = odb_read_object_info(r->objects, oid, NULL); return kind == OBJ_COMMIT; } @@ -262,7 +262,7 @@ static int disambiguate_committish_only(struct repository *r, struct object *obj; int kind; - kind = oid_object_info(r, oid, NULL); + kind = odb_read_object_info(r->objects, oid, NULL); if (kind == OBJ_COMMIT) return 1; if (kind != OBJ_TAG) @@ -279,7 +279,7 @@ static int disambiguate_tree_only(struct repository *r, const struct object_id *oid, void *cb_data UNUSED) { - int kind = oid_object_info(r, oid, NULL); + int kind = odb_read_object_info(r->objects, oid, NULL); return kind == OBJ_TREE; } @@ -290,7 +290,7 @@ static int disambiguate_treeish_only(struct repository *r, struct object *obj; int kind; - kind = oid_object_info(r, oid, NULL); + kind = odb_read_object_info(r->objects, oid, NULL); if (kind == OBJ_TREE || kind == OBJ_COMMIT) return 1; if (kind != OBJ_TAG) @@ -307,7 +307,7 @@ static int disambiguate_blob_only(struct repository *r, const struct object_id *oid, void *cb_data UNUSED) { - int kind = oid_object_info(r, oid, NULL); + int kind = odb_read_object_info(r->objects, oid, NULL); return kind == OBJ_BLOB; } @@ -399,7 +399,7 @@ static int show_ambiguous_object(const struct object_id *oid, void *data) return 0; hash = repo_find_unique_abbrev(ds->repo, oid, DEFAULT_ABBREV); - type = oid_object_info(ds->repo, oid, NULL); + type = odb_read_object_info(ds->repo->objects, oid, NULL); if (type < 0) { /* @@ -514,8 +514,8 @@ static int sort_ambiguous(const void *va, const void *vb, void *ctx) { struct repository *sort_ambiguous_repo = ctx; const struct object_id *a = va, *b = vb; - int a_type = oid_object_info(sort_ambiguous_repo, a, NULL); - int b_type = oid_object_info(sort_ambiguous_repo, b, NULL); + int a_type = odb_read_object_info(sort_ambiguous_repo->objects, a, NULL); + int b_type = odb_read_object_info(sort_ambiguous_repo->objects, b, NULL); int a_type_sort; int b_type_sort; diff --git a/object.c b/object.c index 3b15469139..868d89eed4 100644 --- a/object.c +++ b/object.c @@ -214,7 +214,7 @@ enum peel_status peel_object(struct repository *r, struct object *o = lookup_unknown_object(r, name); if (o->type == OBJ_NONE) { - int type = oid_object_info(r, name, NULL); + int type = odb_read_object_info(r->objects, name, NULL); if (type < 0 || !object_as_type(o, type, 0)) return PEEL_INVALID; } @@ -315,7 +315,7 @@ struct object *parse_object_with_flags(struct repository *r, } if ((!obj || obj->type == OBJ_BLOB) && - oid_object_info(r, oid, NULL) == OBJ_BLOB) { + odb_read_object_info(r->objects, oid, NULL) == OBJ_BLOB) { if (!skip_hash && stream_object_signature(r, repl) < 0) { error(_("hash mismatch %s"), oid_to_hex(oid)); return NULL; @@ -331,7 +331,7 @@ struct object *parse_object_with_flags(struct repository *r, */ if (skip_hash && discard_tree && (!obj || obj->type == OBJ_TREE) && - oid_object_info(r, oid, NULL) == OBJ_TREE) { + odb_read_object_info(r->objects, oid, NULL) == OBJ_TREE) { return &lookup_tree(r, oid)->object; } diff --git a/odb.c b/odb.c index 5a88701550..40eacdfe2d 100644 --- a/odb.c +++ b/odb.c @@ -647,7 +647,7 @@ static int register_all_submodule_sources(struct object_database *odb) return ret; } -static int do_oid_object_info_extended(struct repository *r, +static int do_oid_object_info_extended(struct object_database *odb, const struct object_id *oid, struct object_info *oi, unsigned flags) { @@ -660,7 +660,7 @@ static int do_oid_object_info_extended(struct repository *r, if (flags & OBJECT_INFO_LOOKUP_REPLACE) - real = lookup_replace_object(r, oid); + real = lookup_replace_object(odb->repo, oid); if (is_null_oid(real)) return -1; @@ -668,7 +668,7 @@ static int do_oid_object_info_extended(struct repository *r, if (!oi) oi = &blank_oi; - co = find_cached_object(r->objects, real); + co = find_cached_object(odb, real); if (co) { if (oi->typep) *(oi->typep) = co->type; @@ -677,7 +677,7 @@ static int do_oid_object_info_extended(struct repository *r, if (oi->disk_sizep) *(oi->disk_sizep) = 0; if (oi->delta_base_oid) - oidclr(oi->delta_base_oid, r->hash_algo); + oidclr(oi->delta_base_oid, odb->repo->hash_algo); if (oi->contentp) *oi->contentp = xmemdupz(co->buf, co->size); oi->whence = OI_CACHED; @@ -685,17 +685,17 @@ static int do_oid_object_info_extended(struct repository *r, } while (1) { - if (find_pack_entry(r, real, &e)) + if (find_pack_entry(odb->repo, real, &e)) break; /* Most likely it's a loose object. */ - if (!loose_object_info(r, real, oi, flags)) + if (!loose_object_info(odb->repo, real, oi, flags)) return 0; /* Not a loose object; someone else may have just packed it. */ if (!(flags & OBJECT_INFO_QUICK)) { - reprepare_packed_git(r); - if (find_pack_entry(r, real, &e)) + reprepare_packed_git(odb->repo); + if (find_pack_entry(odb->repo, real, &e)) break; } @@ -705,15 +705,15 @@ static int do_oid_object_info_extended(struct repository *r, * `odb_add_submodule_source_by_path()` on that submodule's * ODB). If any such ODBs exist, register them and try again. */ - if (register_all_submodule_sources(r->objects)) + if (register_all_submodule_sources(odb)) /* We added some alternates; retry */ continue; /* Check if it is a missing object */ - if (fetch_if_missing && repo_has_promisor_remote(r) && + if (fetch_if_missing && repo_has_promisor_remote(odb->repo) && !already_retried && !(flags & OBJECT_INFO_SKIP_FETCH_OBJECT)) { - promisor_remote_get_direct(r, real, 1); + promisor_remote_get_direct(odb->repo, real, 1); already_retried = 1; continue; } @@ -723,7 +723,7 @@ static int do_oid_object_info_extended(struct repository *r, if ((flags & OBJECT_INFO_LOOKUP_REPLACE) && !oideq(real, oid)) die(_("replacement %s not found for %s"), oid_to_hex(real), oid_to_hex(oid)); - if ((p = has_packed_and_bad(r, real))) + if ((p = has_packed_and_bad(odb->repo, real))) die(_("packed object %s (stored in %s) is corrupt"), oid_to_hex(real), p->pack_name); } @@ -736,10 +736,10 @@ static int do_oid_object_info_extended(struct repository *r, * information below, so return early. */ return 0; - rtype = packed_object_info(r, e.p, e.offset, oi); + rtype = packed_object_info(odb->repo, e.p, e.offset, oi); if (rtype < 0) { mark_bad_packed_object(e.p, real); - return do_oid_object_info_extended(r, real, oi, 0); + return do_oid_object_info_extended(odb, real, oi, 0); } else if (oi->whence == OI_PACKED) { oi->u.packed.offset = e.offset; oi->u.packed.pack = e.p; @@ -787,7 +787,7 @@ static int oid_object_info_convert(struct repository *r, oi = &new_oi; } - ret = oid_object_info_extended(r, &oid, oi, flags); + ret = odb_read_object_info_extended(r->objects, &oid, oi, flags); if (ret) return -1; if (oi == input_oi) @@ -830,33 +830,35 @@ static int oid_object_info_convert(struct repository *r, return ret; } -int oid_object_info_extended(struct repository *r, const struct object_id *oid, - struct object_info *oi, unsigned flags) +int odb_read_object_info_extended(struct object_database *odb, + const struct object_id *oid, + struct object_info *oi, + unsigned flags) { int ret; - if (oid->algo && (hash_algo_by_ptr(r->hash_algo) != oid->algo)) - return oid_object_info_convert(r, oid, oi, flags); + if (oid->algo && (hash_algo_by_ptr(odb->repo->hash_algo) != oid->algo)) + return oid_object_info_convert(odb->repo, oid, oi, flags); obj_read_lock(); - ret = do_oid_object_info_extended(r, oid, oi, flags); + ret = do_oid_object_info_extended(odb, oid, oi, flags); obj_read_unlock(); return ret; } /* returns enum object_type or negative */ -int oid_object_info(struct repository *r, - const struct object_id *oid, - unsigned long *sizep) +int odb_read_object_info(struct object_database *odb, + const struct object_id *oid, + unsigned long *sizep) { enum object_type type; struct object_info oi = OBJECT_INFO_INIT; oi.typep = &type; oi.sizep = sizep; - if (oid_object_info_extended(r, oid, &oi, - OBJECT_INFO_LOOKUP_REPLACE) < 0) + if (odb_read_object_info_extended(odb, oid, &oi, + OBJECT_INFO_LOOKUP_REPLACE) < 0) return -1; return type; } @@ -887,7 +889,7 @@ int pretend_object_file(struct repository *repo, /* * This function dies on corrupt objects; the callers who want to - * deal with them should arrange to call oid_object_info_extended() and give + * deal with them should arrange to call odb_read_object_info_extended() and give * error messages themselves. */ void *repo_read_object_file(struct repository *r, @@ -902,7 +904,7 @@ void *repo_read_object_file(struct repository *r, oi.typep = type; oi.sizep = size; oi.contentp = &data; - if (oid_object_info_extended(r, oid, &oi, flags)) + if (odb_read_object_info_extended(r->objects, oid, &oi, flags)) return NULL; return data; @@ -968,13 +970,13 @@ int has_object(struct repository *r, const struct object_id *oid, if (!(flags & HAS_OBJECT_FETCH_PROMISOR)) object_info_flags |= OBJECT_INFO_SKIP_FETCH_OBJECT; - return oid_object_info_extended(r, oid, NULL, object_info_flags) >= 0; + return odb_read_object_info_extended(r->objects, oid, NULL, object_info_flags) >= 0; } void odb_assert_oid_type(struct object_database *odb, const struct object_id *oid, enum object_type expect) { - enum object_type type = oid_object_info(odb->repo, oid, NULL); + enum object_type type = odb_read_object_info(odb, oid, NULL); if (type < 0) die(_("%s is not a valid object"), oid_to_hex(oid)); if (type != expect) diff --git a/odb.h b/odb.h index 0ea9d4faa7..b37a9c5d20 100644 --- a/odb.h +++ b/odb.h @@ -265,9 +265,6 @@ void *repo_read_object_file(struct repository *r, enum object_type *type, unsigned long *size); -/* Read and unpack an object file into memory, write memory to an object file */ -int oid_object_info(struct repository *r, const struct object_id *, unsigned long *); - /* * Add an object file to the in-memory object store, without writing it * to disk. @@ -336,9 +333,24 @@ struct object_info { /* Die if object corruption (not just an object being missing) was detected. */ #define OBJECT_INFO_DIE_IF_CORRUPT 32 -int oid_object_info_extended(struct repository *r, - const struct object_id *, - struct object_info *, unsigned flags); +/* + * Read object info from the object database and populate the `object_info` + * structure. Returns 0 on success, a negative error code otherwise. + */ +int odb_read_object_info_extended(struct object_database *odb, + const struct object_id *oid, + struct object_info *oi, + unsigned flags); + +/* + * Read a subset of object info for the given object ID. Returns an `enum + * object_type` on success, a negative error code otherwise. If successful and + * `sizep` is non-NULL, then the size of the object will be written to the + * pointer. + */ +int odb_read_object_info(struct object_database *odb, + const struct object_id *oid, + unsigned long *sizep); enum { /* Retry packed storage after checking packed and loose storage */ @@ -360,7 +372,7 @@ void odb_assert_oid_type(struct object_database *odb, /* * Enabling the object read lock allows multiple threads to safely call the * following functions in parallel: repo_read_object_file(), - * read_object_with_reference(), oid_object_info() and oid_object_info_extended(). + * read_object_with_reference(), odb_read_object_info() and odb(). * * obj_read_lock() and obj_read_unlock() may also be used to protect other * section which cannot execute in parallel with object reading. Since the used @@ -368,7 +380,7 @@ void odb_assert_oid_type(struct object_database *odb, * reading functions. However, beware that in these cases zlib inflation won't * be performed in parallel, losing performance. * - * TODO: oid_object_info_extended()'s call stack has a recursive behavior. If + * TODO: odb_read_object_info_extended()'s call stack has a recursive behavior. If * any of its callees end up calling it, this recursive call won't benefit from * parallel inflation. */ @@ -416,4 +428,22 @@ void *read_object_with_reference(struct repository *r, unsigned long *size, struct object_id *oid_ret); +/* Compatibility wrappers, to be removed once Git 2.51 has been released. */ +#include "repository.h" + +static inline int oid_object_info_extended(struct repository *r, + const struct object_id *oid, + struct object_info *oi, + unsigned flags) +{ + return odb_read_object_info_extended(r->objects, oid, oi, flags); +} + +static inline int oid_object_info(struct repository *r, + const struct object_id *oid, + unsigned long *sizep) +{ + return odb_read_object_info(r->objects, oid, sizep); +} + #endif /* ODB_H */ diff --git a/pack-bitmap-write.c b/pack-bitmap-write.c index c847369eaa..c5183b619c 100644 --- a/pack-bitmap-write.c +++ b/pack-bitmap-write.c @@ -144,8 +144,8 @@ void bitmap_writer_build_type_index(struct bitmap_writer *writer, break; default: - real_type = oid_object_info(writer->to_pack->repo, - &entry->idx.oid, NULL); + real_type = odb_read_object_info(writer->to_pack->repo->objects, + &entry->idx.oid, NULL); break; } diff --git a/pack-bitmap.c b/pack-bitmap.c index a695a794e9..bcbb71f750 100644 --- a/pack-bitmap.c +++ b/pack-bitmap.c @@ -1868,8 +1868,8 @@ static unsigned long get_size_by_pos(struct bitmap_index *bitmap_git, size_t eindex_pos = pos - bitmap_num_objects_total(bitmap_git); struct eindex *eindex = &bitmap_git->ext_index; struct object *obj = eindex->objects[eindex_pos]; - if (oid_object_info_extended(bitmap_repo(bitmap_git), &obj->oid, - &oi, 0) < 0) + if (odb_read_object_info_extended(bitmap_repo(bitmap_git)->objects, &obj->oid, + &oi, 0) < 0) die(_("unable to get size of %s"), oid_to_hex(&obj->oid)); } @@ -3220,8 +3220,8 @@ static off_t get_disk_usage_for_extended(struct bitmap_index *bitmap_git) i))) continue; - if (oid_object_info_extended(bitmap_repo(bitmap_git), &obj->oid, - &oi, 0) < 0) + if (odb_read_object_info_extended(bitmap_repo(bitmap_git)->objects, + &obj->oid, &oi, 0) < 0) die(_("unable to get disk usage of '%s'"), oid_to_hex(&obj->oid)); diff --git a/packfile.c b/packfile.c index ac0e29e99b..af9ccfdba6 100644 --- a/packfile.c +++ b/packfile.c @@ -1321,7 +1321,7 @@ static int retry_bad_packed_offset(struct repository *r, return OBJ_BAD; nth_packed_object_id(&oid, p, pack_pos_to_index(p, pos)); mark_bad_packed_object(p, &oid); - type = oid_object_info(r, &oid, NULL); + type = odb_read_object_info(r->objects, &oid, NULL); if (type <= OBJ_NONE) return OBJ_BAD; return type; @@ -1849,7 +1849,8 @@ void *unpack_entry(struct repository *r, struct packed_git *p, off_t obj_offset, oi.typep = &type; oi.sizep = &base_size; oi.contentp = &base; - if (oid_object_info_extended(r, &base_oid, &oi, 0) < 0) + if (odb_read_object_info_extended(r->objects, &base_oid, + &oi, 0) < 0) base = NULL; external_base = base; diff --git a/promisor-remote.c b/promisor-remote.c index 2baa286bfd..be6f82d12f 100644 --- a/promisor-remote.c +++ b/promisor-remote.c @@ -245,8 +245,8 @@ static int remove_fetched_oids(struct repository *repo, struct object_id *new_oids; for (i = 0; i < oid_nr; i++) - if (oid_object_info_extended(repo, &old_oids[i], NULL, - OBJECT_INFO_SKIP_FETCH_OBJECT)) { + if (odb_read_object_info_extended(repo->objects, &old_oids[i], NULL, + OBJECT_INFO_SKIP_FETCH_OBJECT)) { remaining[i] = 1; remaining_nr++; } diff --git a/protocol-caps.c b/protocol-caps.c index 3022f69a1b..ecdd0dc58d 100644 --- a/protocol-caps.c +++ b/protocol-caps.c @@ -64,7 +64,7 @@ static void send_info(struct repository *r, struct packet_writer *writer, strbuf_addstr(&send_buffer, oid_str); if (info->size) { - if (oid_object_info(r, &oid, &object_size) < 0) { + if (odb_read_object_info(r->objects, &oid, &object_size) < 0) { strbuf_addstr(&send_buffer, " "); } else { strbuf_addf(&send_buffer, " %lu", object_size); diff --git a/reachable.c b/reachable.c index 9dc748f0b9..e984b68a0c 100644 --- a/reachable.c +++ b/reachable.c @@ -211,7 +211,7 @@ static void add_recent_object(const struct object_id *oid, * later processing, and the revision machinery expects * commits and tags to have been parsed. */ - type = oid_object_info(the_repository, oid, NULL); + type = odb_read_object_info(the_repository->objects, oid, NULL); if (type < 0) die("unable to get object info for %s", oid_to_hex(oid)); diff --git a/read-cache.c b/read-cache.c index c3fa968676..7d5bccf95d 100644 --- a/read-cache.c +++ b/read-cache.c @@ -3729,9 +3729,9 @@ void prefetch_cache_entries(const struct index_state *istate, if (S_ISGITLINK(ce->ce_mode) || !must_prefetch(ce)) continue; - if (!oid_object_info_extended(the_repository, &ce->oid, - NULL, - OBJECT_INFO_FOR_PREFETCH)) + if (!odb_read_object_info_extended(the_repository->objects, + &ce->oid, NULL, + OBJECT_INFO_FOR_PREFETCH)) continue; oid_array_append(&to_fetch, &ce->oid); } diff --git a/ref-filter.c b/ref-filter.c index 4ce45440ad..f9f2c512a8 100644 --- a/ref-filter.c +++ b/ref-filter.c @@ -2302,8 +2302,8 @@ static int get_object(struct ref_array_item *ref, int deref, struct object **obj oi->info.sizep = &oi->size; oi->info.typep = &oi->type; } - if (oid_object_info_extended(the_repository, &oi->oid, &oi->info, - OBJECT_INFO_LOOKUP_REPLACE)) + if (odb_read_object_info_extended(the_repository->objects, &oi->oid, &oi->info, + OBJECT_INFO_LOOKUP_REPLACE)) return strbuf_addf_ret(err, -1, _("missing object %s for %s"), oid_to_hex(&oi->oid), ref->refname); if (oi->info.disk_sizep && oi->disk_size < 0) diff --git a/remote.c b/remote.c index 17a842f568..72c36239d3 100644 --- a/remote.c +++ b/remote.c @@ -1182,7 +1182,7 @@ static void show_push_unqualified_ref_name_error(const char *dst_value, BUG("'%s' is not a valid object, " "match_explicit_lhs() should catch this!", matched_src_name); - type = oid_object_info(the_repository, &oid, NULL); + type = odb_read_object_info(the_repository->objects, &oid, NULL); if (type == OBJ_COMMIT) { advise(_("The part of the refspec is a commit object.\n" "Did you mean to create a new branch by pushing to\n" @@ -1412,7 +1412,8 @@ static void add_missing_tags(struct ref *src, struct ref **dst, struct ref ***ds continue; /* not a tag */ if (string_list_has_string(&dst_tag, ref->name)) continue; /* they already have it */ - if (oid_object_info(the_repository, &ref->new_oid, NULL) != OBJ_TAG) + if (odb_read_object_info(the_repository->objects, + &ref->new_oid, NULL) != OBJ_TAG) continue; /* be conservative */ item = string_list_append(&src_tag, ref->name); item->util = ref; diff --git a/sequencer.c b/sequencer.c index 2432d0a39e..193459405f 100644 --- a/sequencer.c +++ b/sequencer.c @@ -5503,9 +5503,8 @@ int sequencer_pick_revisions(struct repository *r, if (!repo_get_oid(r, name, &oid)) { if (!lookup_commit_reference_gently(r, &oid, 1)) { - enum object_type type = oid_object_info(r, - &oid, - NULL); + enum object_type type = odb_read_object_info(r->objects, + &oid, NULL); res = error(_("%s: can't cherry-pick a %s"), name, type_name(type)); goto out; diff --git a/streaming.c b/streaming.c index 81c42673a2..4b13827668 100644 --- a/streaming.c +++ b/streaming.c @@ -44,7 +44,7 @@ struct git_istream { union { struct { - char *buf; /* from oid_object_info_extended() */ + char *buf; /* from odb_read_object_info_extended() */ unsigned long read_ptr; } incore; @@ -403,8 +403,8 @@ static int open_istream_incore(struct git_istream *st, struct repository *r, oi.typep = type; oi.sizep = &st->size; oi.contentp = (void **)&st->u.incore.buf; - return oid_object_info_extended(r, oid, &oi, - OBJECT_INFO_DIE_IF_CORRUPT); + return odb_read_object_info_extended(r->objects, oid, &oi, + OBJECT_INFO_DIE_IF_CORRUPT); } /***************************************************************************** @@ -422,7 +422,7 @@ static int istream_source(struct git_istream *st, oi.typep = type; oi.sizep = &size; - status = oid_object_info_extended(r, oid, &oi, 0); + status = odb_read_object_info_extended(r->objects, oid, &oi, 0); if (status < 0) return status; diff --git a/submodule.c b/submodule.c index 788c9e55ed..f8373a9ea7 100644 --- a/submodule.c +++ b/submodule.c @@ -968,7 +968,7 @@ static int check_has_commit(const struct object_id *oid, void *data) return 0; } - type = oid_object_info(&subrepo, oid, NULL); + type = odb_read_object_info(subrepo.objects, oid, NULL); switch (type) { case OBJ_COMMIT: @@ -1752,8 +1752,7 @@ static int fetch_start_failure(struct strbuf *err UNUSED, static int commit_missing_in_sub(const struct object_id *oid, void *data) { struct repository *subrepo = data; - - enum object_type type = oid_object_info(subrepo, oid, NULL); + enum object_type type = odb_read_object_info(subrepo->objects, oid, NULL); return type != OBJ_COMMIT; } diff --git a/t/helper/test-partial-clone.c b/t/helper/test-partial-clone.c index dba227259a..d848800749 100644 --- a/t/helper/test-partial-clone.c +++ b/t/helper/test-partial-clone.c @@ -23,7 +23,7 @@ static void object_info(const char *gitdir, const char *oid_hex) die("could not init repo"); if (parse_oid_hex_algop(oid_hex, &oid, &p, r.hash_algo)) die("could not parse oid"); - if (oid_object_info_extended(&r, &oid, &oi, 0)) + if (odb_read_object_info_extended(r.objects, &oid, &oi, 0)) die("could not obtain object info"); printf("%d\n", (int) size); diff --git a/tag.c b/tag.c index 5f6868bf7b..144048fd5e 100644 --- a/tag.c +++ b/tag.c @@ -52,7 +52,7 @@ int gpg_verify_tag(const struct object_id *oid, const char *name_to_report, unsigned long size; int ret; - type = oid_object_info(the_repository, oid, NULL); + type = odb_read_object_info(the_repository->objects, oid, NULL); if (type != OBJ_TAG) return error("%s: cannot verify a non-tag object of type %s.", name_to_report ? -- cgit v1.3