What blocks cargo install gunnar-cli from crates.io
Measured 2026-10-12 on feat/r5-4-slim-client-2026-10-12 (from df17b29e), against the crates.io index the same day. Nothing was published and no publish flag was changed. Each item is something the owner can act on; the order is the order they have to happen in.
Two targets, because they differ a lot:
- client —
cargo install gunnar-cli --no-default-features --features client(thegunnargit command with encryption). 13 path packages in its graph today. - full —
cargo install gunnar-cli(defaultserver,client,control). 39 path packages.
1. publish = false on the whole workspace
[workspace.package] publish = false in Cargo.toml, inherited by every member (gunnar-forge is the one explicit exception). Crates to flip, in dependency order:
- client:
gunnar-crypt,gunnar-client,gunnar-common,gunnar-recipe(a BUILD dependency ofgunnar-cli—build.rswrites the Build Thing receipt),gunnar-cli. - full, additionally:
gunnar-clock,gunnar-core,gunnar-proto,gunnar-policy,gunnar-store,gunnar-wire,gunnar-ssh,gunnar-lfs,gunnar-repair,gunnar-grpc,gunnar-forge(already allowed),gunnar-pairing-door,gunnar-server.
Name collisions to decide first: crates.io already has gunnar-client 1.1.4 (gix 0.87, russh 0.61, nornir-git 0.1.8 — an older line of this crate). The workspace is at 1.5.0, so a 1.5.0 publish supersedes it; nothing else named gunnar-* above is taken. gunnar-server is at its own version 1.1.0.
2. [patch.crates-io] does not travel
cargo install <crate> builds the published crate alone; the root Cargo.toml's [patch.crates-io] is not applied. Every patched crate must exist on crates.io at a version the published manifests can name:
| patched crate | patch points at | crates.io today | what is needed |
gunnar-pack, gunnar-delta, gunnar-bitmap, gunnar-sendpack |
../edda (gix 0.88) |
2.0.0 on gix 0.88 | move gunnar's requirements from 1.1.x to 2.0 (gunnar's manifests name 1.1.x, whose crates.io builds are on gix 0.86 — the same version numbers as edda's local gix-0.88 trees, different code) |
gunnar-stage |
../edda (1.1.1) |
1.1.1 | check it is the same code, else release (full only) |
gunnar-pktline |
../edda |
1.1.0 | check it is the same code, else release |
nornir-git |
../edda (0.1.11) |
0.2.1 (gix 0.88, russh 0.63) | a release carrying this branch's https / gix-defaults split (edda feat/r5-4-slim-client-2026-10-12), then require it with default-features = false, features = ["porcelain"] — 0.2.1 still asks gix for its defaults and the reqwest transport, which is the 53 packages this branch cut |
nornir-build-thing |
../edda (0.1.25, wasmtime 49) |
0.2.1 (wasmtime 49, draupnir 0.2) | require 0.2.x from gunnar-recipe (build dep of gunnar-cli) |
storage-git-gix, git-storage-trait |
../edda, ../znippy |
0.2.0, 0.1.2 | full only (engine-gix is a dev/test engine; check 0.2.0 is the gix-0.88 one) |
gix-features |
vendor/gix-features (0.50.0 + one fix, gitoxide issue 2881) |
0.50.0 stock | either upstream releases the fix, or a published fork under its own name — otherwise an installed binary silently runs stock reduce.rs (behaviour change, not a build failure) |
3. Path dependencies on sibling repositories
cargo publish drops path and keeps version, so each must be on crates.io at that version (full install only — the client graph has none beyond item 2):
| dependency (in) | version named | crates.io latest |
disk-snapshot (gunnar-server) |
0.1.0 | 0.1.1 ✓ |
appliance-pid1 (gunnar-server) |
0.1.2 | 0.1.2 ✓ |
edda-admit (gunnar-ssh) |
0.1.0 | 0.1.0 ✓ |
nornir-auth-sshsig / -oidc / -saml (gunnar-grpc) |
0.1.0 / 0.1.4 / 0.1.2 | 0.1.0 / 0.1.4 / 0.1.2 ✓ (check same code) |
nordisk-pairing (gunnar-server, gunnar-pairing-door) |
0.5.13 | 0.5.11 — 0.5.13 unpublished |
nordisk-narrate, plugin-door-wire (gunnar-server, optional) |
0.1.0 | optional; cargo still needs them resolvable to publish |
wg-appliance-core (gunnar-pairing-door) |
0.1.5 | 0.1.6 ✓ |
nornir-service, nornir-humanize (via edda crates) |
0.1.11, 0.1.3 | 0.1.13, 0.1.3 ✓ |
Dev-only path dependencies (the eight server-half crates gunnar-cli names for its tests, gunnar-cli on itself with engine-gix) have no version and are stripped by cargo publish; they do not block.
4. A file outside the package
crates/gunnar-cli/build.rs includes #[path = "../gunnar-common/build_ref.rs"]. cargo package packs only the crate's own directory, so the published build.rs would not compile. Move build_ref.rs into a crate both build scripts depend on (for example gunnar-recipe, already a build dependency), or copy it into the package with an include.
5. Pre-release pins (not blocking, worth knowing)
ssh-key = "=0.7.0-rc.11" (exact pre-release, what russh 0.63 rides) publishes fine, but every downstream resolve is pinned to it until a stable 0.7 ships.
Order
- edda: release
nornir-gitwith the feature split; confirmgunnar-pack/-delta/-bitmap/-sendpack2.0.0 are the gix-0.88 trees; checkgunnar-stage1.1.1 /gunnar-pktline1.1.0 match edda's trees. - gunnar: move requirements to those versions, drop the matching
[patch]rows (the build must still pass with them gone), fix item 4. - Decide
gix-features(item 2) — upstream, fork, or accept stock. - Flip
publishfor the client crates (item 1), publish deps first.cargo install gunnar-cli --no-default-features --features clientthen works. - For the full install: Skidbladnir
nordisk-pairing0.5.13,znippy-plugin-gitwith the redb-4 tail, then the server crates of item 1.