Single-VM object store backed by a local directory.
A supervised server serialises publication for each expanded root. The contract is intentionally per VM; this adapter does not use filesystem locks and is not a shared-filesystem coordination protocol.
Keys never become path components. Each key is hashed and each successful
write installs a new immutable version by replacing a small current
pointer atomically:
root/objects/<sha256(key)>/current
root/objects/<sha256(key)>/v-<random>/data
root/objects/<sha256(key)>/v-<random>/metaReads pin their selected version in the per-root server. A commit therefore cannot invalidate an in-flight reader. After a commit, unpinned non-current versions older than one hour are swept. Caller or VM death can leave a young version directory, which a later sweep removes after the same grace period.
Summary
Types
@type t() :: %Gitility.ObjectStore.Local{ root: Path.t(), server: GenServer.server(), test_hooks: map() }