[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