]> git.ipfire.org Git - thirdparty/git.git/commitdiff
odb: split `struct odb_source` into separate header
authorPatrick Steinhardt <ps@pks.im>
Thu, 5 Mar 2026 14:19:41 +0000 (15:19 +0100)
committerJunio C Hamano <gitster@pobox.com>
Thu, 5 Mar 2026 19:45:14 +0000 (11:45 -0800)
Subsequent commits will expand the `struct odb_source` to become a
generic interface for accessing an object database source. As part of
these refactorings we'll add a set of function pointers that will
significantly expand the structure overall.

Prepare for this by splitting out the `struct odb_source` into a
separate header. This keeps the high-level object database interface
detached from the low-level object database sources.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Makefile
meson.build
odb.c
odb.h
odb/source.c [new file with mode: 0644]
odb/source.h [new file with mode: 0644]

index 47ed9fa7fdd1fa79e7dec4bec76025d6b3e98d04..116358e484cf8f936b1895432b31ca16216151e7 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1214,6 +1214,7 @@ LIB_OBJS += object-file.o
 LIB_OBJS += object-name.o
 LIB_OBJS += object.o
 LIB_OBJS += odb.o
+LIB_OBJS += odb/source.o
 LIB_OBJS += odb/streaming.o
 LIB_OBJS += oid-array.o
 LIB_OBJS += oidmap.o
index 3a1d12caa4b94fd36bec5fdc17db17543368b9da..1018af17c3a81ebbdc2a878279b7e45afaad200e 100644 (file)
@@ -397,6 +397,7 @@ libgit_sources = [
   'object-name.c',
   'object.c',
   'odb.c',
+  'odb/source.c',
   'odb/streaming.c',
   'oid-array.c',
   'oidmap.c',
diff --git a/odb.c b/odb.c
index 776de5356c92a0ece4fb5c7b8f634a33de123c6b..d318482d476ba71411527eac560c0e653dfc0619 100644 (file)
--- a/odb.c
+++ b/odb.c
@@ -217,23 +217,6 @@ static void odb_source_read_alternates(struct odb_source *source,
        free(path);
 }
 
-
-static struct odb_source *odb_source_new(struct object_database *odb,
-                                        const char *path,
-                                        bool local)
-{
-       struct odb_source *source;
-
-       CALLOC_ARRAY(source, 1);
-       source->odb = odb;
-       source->local = local;
-       source->path = xstrdup(path);
-       source->loose = odb_source_loose_new(source);
-       source->packfiles = packfile_store_new(source);
-
-       return source;
-}
-
 static struct odb_source *odb_add_alternate_recursively(struct object_database *odb,
                                                        const char *source,
                                                        int depth)
@@ -373,14 +356,6 @@ struct odb_source *odb_set_temporary_primary_source(struct object_database *odb,
        return source->next;
 }
 
-static void odb_source_free(struct odb_source *source)
-{
-       free(source->path);
-       odb_source_loose_free(source->loose);
-       packfile_store_free(source->packfiles);
-       free(source);
-}
-
 void odb_restore_primary_source(struct object_database *odb,
                                struct odb_source *restore_source,
                                const char *old_path)
diff --git a/odb.h b/odb.h
index 68b8ec22893bb2db02bbf91113b6b1209903140b..e13b5b7c44120b527ec9a798f90a775ab659089a 100644 (file)
--- a/odb.h
+++ b/odb.h
@@ -3,6 +3,7 @@
 
 #include "hashmap.h"
 #include "object.h"
+#include "odb/source.h"
 #include "oidset.h"
 #include "oidmap.h"
 #include "string-list.h"
@@ -30,50 +31,6 @@ extern int fetch_if_missing;
  */
 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
- * on-disk format. An object database can have multiple sources:
- *
- *   - The primary source, which is typically located in "$GIT_DIR/objects".
- *     This is where new objects are usually written to.
- *
- *   - Alternate sources, which are configured via "objects/info/alternates" or
- *     via the GIT_ALTERNATE_OBJECT_DIRECTORIES environment variable. These
- *     alternate sources are only used to read objects.
- */
-struct odb_source {
-       struct odb_source *next;
-
-       /* Object database that owns this object source. */
-       struct object_database *odb;
-
-       /* Private state for loose objects. */
-       struct odb_source_loose *loose;
-
-       /* Should only be accessed directly by packfile.c and midx.c. */
-       struct packfile_store *packfiles;
-
-       /*
-        * Figure out whether this is the local source of the owning
-        * repository, which would typically be its ".git/objects" directory.
-        * This local object directory is usually where objects would be
-        * written to.
-        */
-       bool local;
-
-       /*
-        * This object store is ephemeral, so there is no need to fsync.
-        */
-       int will_destroy;
-
-       /*
-        * Path to the source. If this is a relative path, it is relative to
-        * the current working directory.
-        */
-       char *path;
-};
-
 struct packed_git;
 struct packfile_store;
 struct cached_object_entry;
diff --git a/odb/source.c b/odb/source.c
new file mode 100644 (file)
index 0000000..7fc8980
--- /dev/null
@@ -0,0 +1,28 @@
+#include "git-compat-util.h"
+#include "object-file.h"
+#include "odb/source.h"
+#include "packfile.h"
+
+struct odb_source *odb_source_new(struct object_database *odb,
+                                 const char *path,
+                                 bool local)
+{
+       struct odb_source *source;
+
+       CALLOC_ARRAY(source, 1);
+       source->odb = odb;
+       source->local = local;
+       source->path = xstrdup(path);
+       source->loose = odb_source_loose_new(source);
+       source->packfiles = packfile_store_new(source);
+
+       return source;
+}
+
+void odb_source_free(struct odb_source *source)
+{
+       free(source->path);
+       odb_source_loose_free(source->loose);
+       packfile_store_free(source->packfiles);
+       free(source);
+}
diff --git a/odb/source.h b/odb/source.h
new file mode 100644 (file)
index 0000000..391d6d1
--- /dev/null
@@ -0,0 +1,60 @@
+#ifndef ODB_SOURCE_H
+#define ODB_SOURCE_H
+
+/*
+ * 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
+ * on-disk format. An object database can have multiple sources:
+ *
+ *   - The primary source, which is typically located in "$GIT_DIR/objects".
+ *     This is where new objects are usually written to.
+ *
+ *   - Alternate sources, which are configured via "objects/info/alternates" or
+ *     via the GIT_ALTERNATE_OBJECT_DIRECTORIES environment variable. These
+ *     alternate sources are only used to read objects.
+ */
+struct odb_source {
+       struct odb_source *next;
+
+       /* Object database that owns this object source. */
+       struct object_database *odb;
+
+       /* Private state for loose objects. */
+       struct odb_source_loose *loose;
+
+       /* Should only be accessed directly by packfile.c and midx.c. */
+       struct packfile_store *packfiles;
+
+       /*
+        * Figure out whether this is the local source of the owning
+        * repository, which would typically be its ".git/objects" directory.
+        * This local object directory is usually where objects would be
+        * written to.
+        */
+       bool local;
+
+       /*
+        * This object store is ephemeral, so there is no need to fsync.
+        */
+       int will_destroy;
+
+       /*
+        * Path to the source. If this is a relative path, it is relative to
+        * the current working directory.
+        */
+       char *path;
+};
+
+/*
+ * Allocate and initialize a new source for the given object database located
+ * at `path`. `local` indicates whether or not the source is the local and thus
+ * primary object source of the object database.
+ */
+struct odb_source *odb_source_new(struct object_database *odb,
+                                 const char *path,
+                                 bool local);
+
+/* Free the object database source, releasing all associated resources. */
+void odb_source_free(struct odb_source *source);
+
+#endif