A drop-in replacement for rpmlint
(2.10.0, openSUSE flavour, checks: 43), rewritten in Rust.
rpmcrab runs identically to rpmlint: same command-line flags, same TOML
configuration, same rpmlintrc filters, and the same frozen output and
exit-code contract that external tooling (OBS build summaries, openQA, the
openSUSE badness-999 gate) already consumes. It is not a bug-for-bug port:
upstream false positives and never-firing checks are fixed, and every fix is
recorded in a machine-enforced ledger. Behavioural divergence is deferred to a
later major version.
- The compatibility contract — what is frozen and what may diverge — lives
in
docs/DESIGN.md. - The roadmap lives in the milestones and the umbrella RFC issue; the spec
lives in
docs/DESIGN.md, never the reverse.
Pre-1.0. The crate layout and the report-rendering pipeline land first (M1); byte-identical output is proven against a synthetic check set before any real check exists. See the milestones for sequencing.
Requires a stable Rust toolchain (see rust-toolchain.toml), plus the RPM
development headers (rpm-devel on openSUSE, librpm-dev on Debian/Ubuntu
— pkg-config must find rpm.pc). The default build enables librpm's
build feature for spec parsing, whose bindgen step also needs popt.h:
add popt-devel (openSUSE) / libpopt-dev (Debian/Ubuntu); on
Debian/Ubuntu librpm-dev already pulls popt in.
cargo build --workspace --lockedThe local gate (fmt, clippy, tests, cargo-deny, layering) is:
make checkGPL-2.0-or-later, matching rpmlint. See LICENSE.