Mitts 0.3.29: -q, Cargo's message formats and a workspace E0463 fix
mitts test --quiet and mitts check --message-format=short were rejected on 0.3.28 and are accepted now; check --workspace --all-targets no longer fails with E0463 on test targets; macOS binaries no longer keep a symlinked checkout path.
On this page · 7 sections
Mitts v0.3.29 was published on
2026-11-07 from commit ce189652 (the merge of
PR #68), together with
mitts 0.3.29 on crates.io under MIT OR Apache-2.0. The
version is archived on Zenodo as
10.5281/zenodo.24030068; the concept DOI for all
versions is 10.5281/zenodo.24030067. It
closes three issues opened after 0.3.28: two Cargo flags that Mitts refused, and an E0463 failure
on test targets. It also fixes how macOS binaries record the path of a symlinked checkout. This post follows the release
notes, PR #66,
PR #67 and the issues they close. It reports no new
measurements.
-q / --quiet (#63)
On 0.3.28 mitts test --quiet stopped at argument parsing:
error: unexpected argument '--quiet' found
The issue came from a tool that generates test commands for its users and could not switch them
from cargo to mitts while --quiet was refused. In 0.3.29 test, check, clippy,
bench and coverage accept -q and --quiet. The flag drops the Mitts header, progress bars,
[mitts::stats], stage footers and the per-binary Running ... and Doc-tests ... lines. Mitts
also passes -q on to standard libtest harnesses, unless -q, --quiet or --format already
follows --, the target sets harness = false, or the command is bench. With -c, PASS
lines are dropped while FAIL details and the Summary line stay. Failure diagnostics, coverage
reports and exit codes do not change.
--message-format (#64)
0.3.28 accepted only human and json. A consumer whose parser was written for
cargo check --message-format=short got invalid value 'short'. Now --message-format accepts
human, short, json, json-diagnostic-short, json-diagnostic-rendered-ansi,
json-render-diagnostics and Cargo’s comma-separated combinations of the json modifiers, on
build, check, clippy, test, bench and run. A conflicting or unknown combination exits
with code 2 and prints nothing on stdout. With json-render-diagnostics, rendered messages go to
stderr and stdout stays NDJSON. Mitts drops its internal artifact
notifications from that stream.
E0463 on check --workspace --all-targets (#65)
In a multi-crate workspace (the report used a rust-analyzer checkout),
mitts check --workspace --all-targets failed on unit-test targets with
error[E0463]: can't find crate for ..., while the same command without --all-targets
finished. Until this release rustc looked for dependencies in the shared metadata directory of
the artifact store, where stale or unrelated variants of a crate could make the lookup ambiguous.
Now each build stages the dependency outputs it needs into its own session directory, under the
exact file names rustc expects, and passes that directory as -L dependency=. The directory
stays locked until the process exits, so doctests can still find it, and a later build or
mitts gc removes it. Check-only binary, test, example and benchmark units no longer publish
lib<target>-*.rmeta files into the shared dependency directories. The short metadata key of a
unit is now a hash of the whole composite key. It used to be the first 16 characters, which left
out build-script and environment suffixes. The compiler remap protocol key moves to
canonical-v4-hermetic-deps. PR #66 adds a regression test that failed with exit code 101 before
the fix, plus tests for #63 and #64; its isolated run passed 953 of 953 tests.
macOS: the dependency path in its physical form
Found while moving CI to macOS 15 (PR #67, commit
84e89b4). The
macOS 15 linker (ld-1167.5, Xcode 16.4) writes the debug-map path of a transitive rlib exactly as
the -L dependency= directory is spelled. Mitts strips the physical checkout root with
-oso_prefix. A checkout reached through a symlink, such as /var for /private/var (every
TempDir and many CI workspaces), therefore kept its path in the binary, and that binary was
keyed per checkout. Mitts now passes the directory in its physical form.
CI on macos-15
GitHub no longer starts jobs on the macos-14 label. They are cancelled within a second with
The configuration 'macos-14-arm64-us-default' is not supported. Every workflow that used it
(ci, release, release-binaries, installer-smoke, apple-credentials-check) now uses macos-15.
In the release run for this
version, the macOS packaging, signing and install jobs ran on macos-15 and passed.
Getting it
The release has archives for aarch64-apple-darwin, aarch64-unknown-linux-gnu and
x86_64-unknown-linux-gnu. Each comes with its own .sha256 file, and there is a SHA256SUMS
for all three. Each archive holds mitts, BUILD.txt and both licence files. On an Apple
silicon Mac:
base=https://github.com/alex09x/mitts/releases/download/v0.3.29
curl -fLO "$base/mitts-v0.3.29-aarch64-apple-darwin.tar.gz"
curl -fLO "$base/mitts-v0.3.29-aarch64-apple-darwin.tar.gz.sha256"
shasum -a 256 -c mitts-v0.3.29-aarch64-apple-darwin.tar.gz.sha256
tar xzf mitts-v0.3.29-aarch64-apple-darwin.tar.gz
install -m 755 mitts "$HOME/.cargo/bin/mitts"
On Linux, take the archive for your architecture and check it with sha256sum -c.
Still pre-release
The limitations are unchanged:
- Linux and macOS only;
- host target only, with no cross-compilation;
- no remote cache: the store belongs to one machine;
- sparse registries only, so git-index and
local-registrysources are refused with advice.
Unsupported Cargo features fail with an error rather than a guess. Where you need Windows, cross-compilation, a team cache or a stable release, the README’s advice stands: use Cargo, optionally with sccache.
Cite this article
Alexander Panasenko (2026-11-07). Mitts 0.3.29: -q, Cargo's message formats and a workspace E0463 fix. https://prod.codes/blog/mitts-0-3-29-quiet-message-formats-and-e0463/