odb: introduce `odb_prepare()`
Introduce `odb_prepare()` as a simple wrapper to prepare alternates and then prepare each individual source. Adapt git-grep(1) to use it. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Patrick Steinhardt committed
Jun 22, 2026 at 10:47 UTC
b7fe8f06728f4d39d9b84454588185b384695902
3 files changed
+20
-15
builtin/grep.c
+2
-7
index 7361bf071e..a7252d56a1 100644
--- a/builtin/grep.c
+++ b/builtin/grep.c
@@ -1356,13 +1356,8 @@ int cmd_grep(int argc,
if (recurse_submodules)
repo_read_gitmodules(the_repository, 1);
- if (startup_info->have_repository) {
- struct odb_source *source;
-
- odb_prepare_alternates(the_repository->objects);
- for (source = the_repository->objects->sources; source; source = source->next)
- odb_source_prepare(source, 0);
- }
+ if (startup_info->have_repository)
+ odb_prepare(the_repository->objects, 0);
start_threads(&opt);
} else {
odb.c
+12
-6
index 7b45390e12..11414c49a8 100644
--- a/odb.c
+++ b/odb.c
@@ -1070,7 +1070,7 @@ void odb_free(struct object_database *o)
free(o);
}
-void odb_reprepare(struct object_database *o)
+void odb_prepare(struct object_database *o, enum odb_prepare_flags flags)
{
struct odb_source *source;
@@ -1082,13 +1082,19 @@ void odb_reprepare(struct object_database *o)
* the linked list, so existing odbs will continue to exist for
* the lifetime of the process.
*/
- o->loaded_alternates = 0;
- odb_prepare_alternates(o);
+ if (flags & ODB_PREPARE_FLUSH_CACHES) {
+ o->loaded_alternates = 0;
+ o->object_count_valid = 0;
+ }
+ odb_prepare_alternates(o);
for (source = o->sources; source; source = source->next)
- odb_source_prepare(source, ODB_PREPARE_FLUSH_CACHES);
-
- o->object_count_valid = 0;
+ odb_source_prepare(source, flags);
obj_read_unlock();
}
+
+void odb_reprepare(struct object_database *o)
+{
+ odb_prepare(o, ODB_PREPARE_FLUSH_CACHES);
+}
odb.h
+6
-2
index c14c9030e4..b1c0f3767b 100644
--- a/odb.h
+++ b/odb.h
@@ -133,9 +133,13 @@ enum odb_prepare_flags {
};
/*
- * Clear caches, reload alternates and then reload object sources so that new
- * objects may become accessible.
+ * Prepare the object database for use. Calling this function is generally not
+ * needed, but can be useful in case the caller wants to pre-open individual
+ * sources.
*/
+void odb_prepare(struct object_database *o, enum odb_prepare_flags flags);
+
+/* Equivalent to `odb_prepare(o, ODB_PREPARE_FLUSH_CACHES)`. */
void odb_reprepare(struct object_database *o);
/*