[PATCH v2 0/5] odb: make creation of object database pluggable
Patrick Steinhardt <[email protected]> Tue, 04 Aug 2026 10:29:05 +0200
| Newsgroups | org.kernel.vger.git |
|---|---|
| Message-ID | <[email protected]> |
Hi,
when creating a new repository we create a couple of on-disk data
structures for the object database. This includes the "objects/"
directory hierarchy with "objects/info" and "objects/pack", which are
specific to the backend.
This patch series makes the creation of the on-disk data structures
pluggable. While we continue to always create "objects/" regardless of
the backend (it's required for a repository to be recognized as such),
the other subdirectories are now created by the backend. This will allow
other backends to plug in their own logic.
The series starts with a small detour into the loose-object map. This
detour is required so that we can defer initialization of the object
database itself to a later point in time.
The series is based on 9a0c4701dc (The 7th batch, 2026-07-22).
Changes in v2:
- Add a testcase that demonstrates the bug fixed with alternate loose
object maps.
- Rename the "inmemory" bakcend to "in-memory".
- Clarify some commit messages.
- Link to v1: https://patch.msgid.link/[email protected]
Thanks!
Patrick
---
Patrick Steinhardt (5):
loose: load loose object map for the correct source
setup: detangle loading of loose object maps
setup: defer object database creation
odb/source: introduce function to map source type to name
odb: make creation of on-disk structures pluggable
loose.c | 25 +++++++++--------
loose.h | 1 +
odb/source-files.c | 19 +++++++++++++
odb/source-files.h | 4 ++-
odb/source-inmemory.h | 4 ++-
odb/source-loose.c | 2 ++
odb/source-loose.h | 4 ++-
odb/source-packed.h | 4 ++-
odb/source.c | 19 +++++++++++++
odb/source.h | 29 +++++++++++++++++++
repository.c | 2 --
setup.c | 65 ++++++++++++++++++++++++++++++-------------
setup.h | 9 ++++++
t/t1016-compatObjectFormat.sh | 18 ++++++++++++
14 files changed, 167 insertions(+), 38 deletions(-)
Range-diff versus v1:
1: c126882da3 ! 1: 087bbd9fa7 loose: load loose object map for the correct source
@@ Commit message
load the map via the common directory. This doesn't make any sense
though, as the function is called in a loop through all sources, and as
such the expectation is that we'll load the map that belongs to the
- given source.
+ given source. The consequence is that we'll ignore loose object maps of
+ any configured alternates.
Fix this bug by instead loading the map via the loose source's path.
+ Helped-by: Toon Claes <[email protected]>
Signed-off-by: Patrick Steinhardt <[email protected]>
## loose.c ##
@@ loose.c: int repo_read_loose_object_map(struct repository *repo)
return 0;
}
+
+ ## t/t1016-compatObjectFormat.sh ##
+@@ t/t1016-compatObjectFormat.sh: do
+ eval signedtag3_${hash}_oid=$(git hash-object -t tag -w ../${hash}_signedtag3) &&
+ eval signedtag4_${hash}_oid=$(git hash-object -t tag -w ../${hash}_signedtag4)
+ '
++
++ test_expect_success 'rev-parse maps oid of object borrowed from alternate' '
++ for repo in alt borrow
++ do
++ test_when_finished "rm -rf $repo" &&
++ git init --object-format=$hash $repo &&
++ git -C $repo config set core.repositoryformatversion 1 &&
++ git -C $repo config set extensions.compatObjectFormat $(compat_hash $hash) || exit 1
++ done &&
++
++ git -C alt commit --allow-empty --message A &&
++ echo "$(pwd)/alt/.git/objects" >borrow/.git/objects/info/alternates &&
++
++ oid=$(git -C alt rev-parse HEAD) &&
++ git -C alt rev-parse --output-object-format=$(compat_hash $hash) "$oid" >expect &&
++ git -C borrow rev-parse --output-object-format=$(compat_hash $hash) "$oid" >actual &&
++ test_cmp expect actual
++ '
+ done
+ cd "$base"
+
2: 6e06a82905 ! 2: 00a693dd72 setup: detangle loading of loose object maps
@@ Commit message
hash is non-zero. This setup sequence has two major downsides:
- We assume that the primary object database is the "files" object
- database so that we can extract its "loose" backend. This stops
- working with pluggable object databases.
+ database and unconditionally downcast it. This will cause us to BUG
+ in case a different object database type was used together with a
+ compat hash algorithm.
- We require the object database to already have been initialized when
configuring the object database. This means that we must intermix
3: 183ed0f34c = 3: 1dc1f83d73 setup: defer object database creation
4: eb997d22d7 ! 4: de1555ee1f odb/source: introduce function to map source type to name
@@ odb/source.c
+ [ODB_SOURCE_FILES] = "files",
+ [ODB_SOURCE_LOOSE] = "loose",
+ [ODB_SOURCE_PACKED] = "packed",
-+ [ODB_SOURCE_INMEMORY] = "inmemory",
++ [ODB_SOURCE_INMEMORY] = "in-memory",
+};
+
+const char *odb_source_type_to_name(enum odb_source_type type)
5: 3303124a7d = 5: cadf131e70 odb: make creation of on-disk structures pluggable
---
base-commit: 9a0c4701dcd5725c4184599322b52933ff5005ca
change-id: 20260710-pks-odb-create-on-disk-ae8757861c69