crates/gunnar-wire/Cargo.toml
[package]
name = "gunnar-wire"
# 1.5.1 (2026-10-26, lane GUN-INSTALL / G-BOTH, the R5C publish): master differs from crates.io, so
# it gets its own version; a patch: cargo-semver-checks finds no API change against crates.io 1.5.0.
version = "1.6.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
# On the `cargo install gunnar` chain (owner order 2026-10-22).
publish = true
authors.workspace = true
repository.workspace = true
description = "git smart-protocol state machines: upload-pack (v2 with a v0 fallback) and receive-pack (v0), transport-agnostic"
readme = "README.md"
# Shared by both halves of gunnar and therefore bound by the SERVER's constraint
# (the no-OS rule and the crate layout): plumbing only. No `gix` porcelain, no
# worktree, no filesystem, no async runtime. Everything here is an `impl Read`
# and an `impl Write`; the transport is somebody else's problem.
[dependencies]
gunnar-pktline = { workspace = true }
gunnar-store = { workspace = true }
# The set algebra and the `.bitmap` reader. First-party, no gunnar dependency of
# its own, and already in every graph that links `gunnar-store` — which is
# every graph this crate is in — so the edge costs the dependency budget
# nothing. `gunnar-store` supplies the pairing with the `.idx`; this supplies
# `Bitmap`, which is the type a selection is carried in.
gunnar-bitmap = { workspace = true }
# The v0 push wire format, written ONCE for both directions (one implementation).
# `receive-pack` reads the command list that `gunnar-client`'s send-pack writes
# and writes the status report that it reads, and until this crate existed those
# four formats were implemented twice — `design.md` named the twinning and named
# this crate as the fix.
#
# `default-features = false` is load-bearing, not tidiness: it leaves
# `gix-packetline` out of the graph, so this edge costs the appliance ZERO
# crates. `gunnar-pktline` is still the framer on this side; what comes from
# here is the grammar the framer carries.
gunnar-sendpack = { workspace = true }
# The stage-attribution bookkeeper, OPTIONAL and off by default. Zero
# dependencies of its own, so the `stages` feature adds exactly one first-party
# crate to a graph and nothing third-party. Nothing in gunnar turns it on; only
# `bench/Cargo.toml` does. See `src/stage.rs`.
gunnar-stage = { workspace = true, optional = true }
gix-hash = { workspace = true }
thiserror = { workspace = true }
tracing = { workspace = true }
[features]
# Per-stage wall / CPU / allocation / peak attribution over the serve path.
# A benchmark switch. With it off, `crate::stage::enter` is a no-op function
# with an empty body and the probes are not compiled at all — the default build
# has no probe rather than a probe that is disabled.
stages = ["dep:gunnar-stage"]
[dev-dependencies]
# **An outside oracle, and only that.** `gunnar-pack` was a NORMAL dependency
# until 2026-08-10 and had not been *called* from `src/` for as long as the
# engine seam has existed: `upload_pack` emits through `GitServe::emit_pack` and
# the receive path takes a caller-supplied `PackIngest`. What kept the edge was
# four names — `IndexedPack`, `WriteOutcome`, `Error` and
# `DEFAULT_ALLOC_LIMIT_BYTES` — and cargo links what a manifest names, not what
# a call graph reaches. One `pub struct` field spelled `gix_pack::data::Version`
# put `gix-pack`, `gix-diff`, `gix-traverse`, `gix-revwalk`, `gix-commitgraph`,
# `gix-fs`, `gix-tempfile`, `gix-path`, `gix-chunk`, `gix-zlib` and
# `gix-features/parallel` into every appliance build. The vocabulary moved to
# `src/pack.rs`; the indexer stayed here, where it is what it always was — the
# thing that indexes a pack gunnar produced and disagrees when gunnar is wrong
# (only stock `git` is an honest judge).
# PATH ONLY, no `version`. `gunnar-pack` is a dev-dependency here and is NOT a
# normal one, so a version requirement would make this crate unpublishable in
# any order `dwarves workspace-release` can compute — it reads normal edges and
# never sees this one. `xtask/tests/publish_order.rs` states the whole case;
# Gate B refused a 17-crate cascade over exactly this shape on 2026-08-05.
# Cargo strips a path-only dev-dependency from the published manifest.
gunnar-pack = { version = "3.0.0" }
# **The fixture writer, and only that, since 2026-08-10.** `src/graph.rs` read
# commits, trees and tags with `CommitRefIter`, `TreeRefIter` and `TagRef`; it
# now reads them with `gunnar_store::object`, and `gix-actor`, `gix-date`,
# `gix-error`, `gix-hashtable`, `gix-utils` and `gix-validate` left the
# appliance graph behind it. What is left here is the other direction:
# `tests/common/mod.rs` and `tests/protocol.rs` *build and hash* the objects
# the suites serve, and object **writing** is exactly what gunnar does not do
# and `gix-object` does well. Keeping the writer and the reader on different
# implementations is the point (one implementation) — a suite whose fixtures
# are built by the code under test only proves that gunnar agrees with itself.
gix-object = { workspace = true }
# `gix_pack::data::Version`, for the ONE conversion in `tests/common/mod.rs`
# that maps `gunnar_pack::IndexedPack` onto the wire's own receipt. Test-only,
# and the only `gix-pack` edge left in this crate's manifest.
gix-pack = { workspace = true }
# It said `features = ["fs", "repack-delta"]` until 2026-08-10, and **that line
# is what stopped the whole workspace resolving**: both features left
# `gunnar-store` with the packfile engine (`fs.rs`, `repack.rs`, `bitmap.rs` are
# gone from `crates/gunnar-store/src/`), so `cargo check --workspace` — not
# `--all-targets`, the plain one, because dev-dependencies are resolved too —
# failed with *"package `gunnar-wire` depends on `gunnar-store` with feature `fs`
# but `gunnar-store` does not have that feature"*. Nothing in gunnar built. A
# dev-dependency naming a feature that no longer exists is a **resolution**
# error, not a compile error, so it is not confined to the crate that wrote it
# and no per-package `cargo test -p …` of any other member can see it.
#
# `conformance` is what is left and what these tests actually import
# (`gunnar_store::conformance`); `gunnar_store::mem` is unconditional.
gunnar-store = { workspace = true, features = ["conformance"] }
tempfile = { workspace = true }
flate2 = { workspace = true }
# Test-only, and only because `tests/common/mod.rs` **implements** `GitServe`:
# the counting store the cost suites measure with has to name
# `anyhow::Result` in its method signatures, and `git-storage-trait` is
# deliberately `anyhow`-only with no re-export (that tiny dependency set is the
# whole point of the crate — see `locked_on_target.md`'s `GitServe` reading
# contract). Nothing under
# `src/` names it and nothing shipped links it.
anyhow = { workspace = true }
[lints.rust]
unsafe_code = "forbid"