# stuffr-cli
The `stuffr` command — a universal compression and archive toolkit in Rust, one
command for the whole format space.
## Install
The binary is called `stuffr`, but it is built from the **`stuffr-cli`**
package, so that is the name `cargo install` needs:
```sh
cargo install stuffr-cli # installs the `stuffr` binary
```
`cargo install stuffr` does **not** work — `stuffr` is the library crate and has
no binary target. (Same arrangement as ripgrep's `ripgrep` / `rg`.)
The default build is pure Rust and needs no C toolchain. To link the two
vendored C backends instead — a faster xz/LZMA encoder and a strong zstd
encoder:
```sh
cargo install stuffr-cli --features c-backed # needs a C compiler, nothing else
```
The five legacy formats (Unix `compress` `.Z`, LHA/LZH, ARJ, ARC/PAK, ZOO)
are in the default build too, pure Rust like the rest of it — no extra flag
needed. `compress`, `lha` and `arj` read AND write as of Phase 3c (`lha` reads
seven compression methods and writes `-lh5-`; `arj` reads five and writes only
the uncompressed one, so an ARJ archive stuffr writes is larger than its
input — and nothing outside this project has ever read one, since no
`arj`/`unarj` tool is obtainable); `arc` and `zoo` are read-only
and refuse `pack --format <name>` at exit 3.
`--features legacy` still exists and still works; it only matters paired with
`--no-default-features` (e.g. `--no-default-features --features pure`, the
build the `purity` CI job checks, is the one combination that excludes them).
## Use
```sh
stuffr pack proj -o backup.tar.gz # walk a directory, container over codec
stuffr list backup.tar.gz # index, mode, size, name
stuffr unpack backup.tar.gz -C out/ # path containment and bomb limits on by default
stuffr cat logs.tar.zst app.log # stream one entry to stdout
stuffr info archive.xz # resolved chain, ladder rung, fidelity
stuffr test archive.zip # integrity check, no extraction
stuffr formats # capability matrix for THIS build
stuffr --examples # worked examples for every verb
```
`-` means stdin everywhere, so `curl … | stuffr cat - | grep pattern` works.
Twelve codecs — `gzip`, `zlib`, `deflate`, `bzip2`, `brotli`, `lz4`,
`snappy`, `zstd`, `xz`, `lzma`, `lzip` and Unix `compress` (`.Z`), all
round-trip — and eight containers: `tar`, `ar`, `cpio` (`newc` only),
`zip`/`zip64`, `lha` and `arj` are six round-trip containers, and `arc`/PAK
and `zoo` are two read-only containers. That is what a plain
`cargo install stuffr-cli` gives you; `stuffr formats` prints the matrix for
the build you actually have.
Invoked as `bzip2`, `bunzip2`, `bzcat`, `bzip2recover`, `gzip`, `gunzip`,
`zcat` or `gzcat`, the binary behaves as that tool, byte for byte on stdout,
stderr and exit codes. `stuffr install-links --dir DIR` makes the links, and
nothing makes them for you. The gzip names follow the platform (GNU gzip, or
Apple's on macOS and the BSDs); `STUFFR_GZIP_FLAVOR=gnu|bsd` overrides that.
Full documentation, including the safety defaults and the two build tiers, is in
the [project README](https://github.com/codedeviate/stuffr#readme).
## License
[MIT](LICENSE), with ported code under other permissive licences: the crate's
metadata is `MIT AND bzip2-1.0.6 AND BSD-2-Clause AND BSD-3-Clause AND 0BSD`.
The notices ship as `LICENSE-bzip2`, `LICENSE-gzip-bsd`, `LICENSE-xz` and
`LICENSE-zstd`.