crates/storage-git-gix/Cargo.toml
[package]
name = "storage-git-gix"
version = "0.3.0"
edition = "2021"
rust-version = "1.85"
license = "MIT OR Apache-2.0"
repository = "https://git.gunnar.rs/nordisk/edda"
description = "The gix-backed implementation of `git-storage-trait`'s `GitOps`: gix-odb / gix-ref on a plain filesystem. The second backend, opposite znippy's Arrow-IPC one."
# The two `parked-gix*` directories that sit beside `src/` are quarantined
# salvage material from an earlier session, not sources. They are 13 MB and they
# are not part of this package; `include` names what is, rather than `exclude`
# naming what is not, because the quarantine is expected to shrink as it is
# mined and an `exclude` list would rot silently.
include = ["src/**", "tests/**", "examples/**", "/Cargo.toml", "/README.md"]
[dependencies]
# The frozen contract. `anyhow` and nothing else underneath it — that is the
# whole reason a gix backend can implement it without linking Arrow.
git-storage-trait = { version = "0.1.0", path = "../../../znippy/git-storage-trait" }
anyhow = "1"
# ── the gix surface, and why each one is here ──────────────────────────────
#
# Deliberately NOT the `gix` facade crate. `gix` 0.86 resolves gix-worktree,
# gix-index, gix-filter, gix-command, gix-config, gix-credentials and a network
# transport — `S-007` in the charred record — none of which a bare object+ref
# store touches. These five plumbing crates are the actual dependency.
gix-hash = { version = "0.28", features = ["sha1", "sha256"] }
gix-object = "0.66"
gix-odb = "0.87"
gix-ref = "0.69"
gix-lock = "26.0"
gix-actor = "0.44"
# `parallel` is ON, and it costs no rayon: gix-parallel's `parallel` is
# `crossbeam-channel` + `parking_lot`, verified in gix-parallel 0.50.1's manifest (gix-features 0.49 before).
# LAW 3 forbids rayon in OUR fan-outs; ours is `std::thread::scope`. This is
# `P-002` in the charred record, which the gunnar-side triage marks
# `DEAD — gix` only because `znippy-plugin-git` links no gix. This crate does,
# so `P-002` is live here and this line is the answer to it.
gix-pack = { version = "0.77", features = ["streaming-input", "parallel"] }
# gix 0.90 split gix-features: `parallel` lives in gix-parallel now, the progress trait in gix-utils.
gix-parallel = { version = "0.50", features = ["parallel"] }
gix-utils = { version = "0.5", features = ["progress"] }
# gix 0.88 reports failures as `gix_error` exceptions; this crate converts them
# into `gix_error::Error` before handing them to `anyhow`.
gix-error = "0.5"
# The pack indexer, reused rather than rewritten. `index_pack` is `put_pack`'s
# whole body: it validates an untrusted pack, resolves its deltas, and writes
# `.pack`/`.idx`/`.keep` into a directory. It already carries the
# alloc-limit guard and the `Verify` iteration mode a server receiving a push
# needs. Reimplementing it here is exactly the duplication the brief forbids.
gunnar-pack = { version = "3.0.0", path = "../gunnar-pack" }
# The `.bitmap` format and the set algebra, reused rather than rewritten.
# Deliberately blind — it opens no pack, resolves no object id and walks no
# graph (D21, so it stays liftable into gitoxide) — so `src/bitmap.rs` is the
# half that needs an object database and this is the half that does not.
#
# It links **no gix crate but `gix-hash`**, which is why naming it here does not
# widen this crate's graph: `gunnar-bitmap` stopped naming `gix-object` on
# 2026-08-11 and took seven crates with it.
gunnar-bitmap = { version = "3.0.0", path = "../gunnar-bitmap" }
# `odb.rs` (lifted from the quarantine) reports two conditions an operator has
# to see and no return value can carry: the slot table growing, and the slot
# table refusing to grow. Both were found by `gunnar.endurance` as objects
# silently going missing, so "log it loudly" is the whole fix. `tracing` is
# facade-only — no subscriber, no Arrow, no rayon.
tracing = "0.1"
# One call, for the one thing on the serving path that is not a byte copy: an
# entry whose stored delta names a base the request does not carry is rebuilt
# whole, and a whole object has to be deflated. `gunnar-pack` already links this
# (its `PackWriter` deflates too) so it adds nothing to the graph, and its
# streaming chunked compressor is not the shape a single in-memory object wants
# — see `serve::deflate`.
flate2 = "1"
# **The constellation's fan-out primitive, and the only one LAW 3 permits.**
#
# `serve.rs` emits a clone by copying mapped pack entries — no CPU — with one
# exception: an entry whose stored delta names a base the request does not carry
# is inflated, resolved and deflated whole. PROFILED on oden 2026-08-14 over a
# 12 216-object clone, that inflate + deflate is **36 % of the request's CPU**,
# and it was running one object at a time inside `plan_emission`'s loop.
# `gatling_for_each` divides it; see `GixStore::rebuild_bodies` for the two
# bounds and for why the addressing pass beside it (4.2 %) is deliberately NOT
# fanned.
#
# It costs nothing this crate was avoiding: `rotaryengine` is pure `std`
# (`std::thread::scope` + one `AtomicUsize`), links no rayon — which is the law
# — and pulls no transitive dependency at all. The path-plus-version shape is
# `nornir-depgraph`'s, so this crate stays publishable.
gatling = { path = "../../../znippy-zoomies/gatling", version = "0.1.9", package = "rotaryengine" }
[dev-dependencies]
tempfile = "3"
# ── `examples/git-store-serve.rs` only ─────────────────────────────────────
#
# The head-to-head server binary. These are **dev**-dependencies on purpose:
# the library is a `GitOps` implementation and speaks no protocol, so nothing a
# consumer links pulls a wire crate in. The example is what the bench's
# `GUNNAR_BENCH_GUNNAR_SERVER=<path>` seam points at.
#
# `gunnar-wire` is deliberately absent and cannot be here: it lives in the
# gunnar checkout, and a path dependency on a sibling repository is read at
# cargo *resolve* time (`P-006`). See the example's header for what that
# confounds and what it does not.
gunnar-pktline = { version = "1.0.0", path = "../gunnar-pktline" }
gunnar-sendpack = { version = "3.0.0", path = "../gunnar-sendpack", default-features = false }
[lints.rust]
unsafe_code = "forbid"