Your browser sucks, JavaScript disabled! Gunnar's console needs JavaScript and WebAssembly. Git over SSH on port 2222 does not.

nordisk/gunnar

docs/crates-io-install.md

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:

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:

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

  1. edda: release nornir-git with the feature split; confirm gunnar-pack/-delta/ -bitmap/-sendpack 2.0.0 are the gix-0.88 trees; check gunnar-stage 1.1.1 / gunnar-pktline 1.1.0 match edda's trees.
  2. gunnar: move requirements to those versions, drop the matching [patch] rows (the build must still pass with them gone), fix item 4.
  3. Decide gix-features (item 2) — upstream, fork, or accept stock.
  4. Flip publish for the client crates (item 1), publish deps first. cargo install gunnar-cli --no-default-features --features client then works.
  5. For the full install: Skidbladnir nordisk-pairing 0.5.13, znippy-plugin-git with the redb-4 tail, then the server crates of item 1.