radicle-heartwood-lfs/crates
Fintan Halpenny 1a31a9f541 cli: Handle broken pipe (SIGPIPE) gracefully
Prevent `rad` from panicking when its stdout is a closed pipe, e.g.
when running `rad config | head`.

The broken pipes are handled at the output boundaries using three
layers of defence:

1. Inner: Route all stdout output through `term::print()` and
   `term::print_inline()`, which use explicit `writeln!`/`write!` to
   a locked stdout and silently ignore write errors. All `println!`
   calls in `radicle-cli` and `radicle-term` are converted.
2. Middle: Catch `BrokenPipe` errors that propagate up via `anyhow`
   from subcommands in `main::run()`, and exit cleanly with code 0.
3. Outer: Install a panic hook that intercepts `println!` panics
   containing "Broken pipe" (from dependencies like clap) and exits
   cleanly, chained in front of human_panic's hook.

To prevent regressions, `#![deny(clippy::print_stdout)]` is added to
`radicle-cli`, requiring all future stdout output to go through the
safe `term::` functions.

Note: `eprintln!` calls (stderr) are not handled, as broken stderr
pipes are extremely rare in practice.
2026-04-29 10:57:24 +02:00
..
radicle treewide/test: Use `impl Arbitrary for Oid` 2026-04-28 14:35:38 +02:00
radicle-cli cli: Handle broken pipe (SIGPIPE) gracefully 2026-04-29 10:57:24 +02:00
radicle-cli-test clippy: Disallow lints `collapsible_*` 2026-04-15 10:06:05 +02:00
radicle-cob clippy: Deny `unwrap_used` 2026-04-15 10:06:05 +02:00
radicle-core treewide/test: Use `impl Arbitrary for Oid` 2026-04-28 14:35:38 +02:00
radicle-crypto cargo: Update `cyphernet` from 0.5.2 to 0.5.3 2026-04-15 11:59:15 +01:00
radicle-dag repo: Move workspace crates into `crates` subdirectory 2025-06-09 15:09:21 +02:00
radicle-fetch treewide: Avoid `git2::Oid::zero` 2026-04-28 14:35:38 +02:00
radicle-git-metadata rust/edition/fmt: 2021 → 2024 2026-03-30 16:57:51 +02:00
radicle-git-ref-format git-ref-format: New crate 2025-10-13 13:34:15 +02:00
radicle-localtime localtime: add description in Cargo.toml 2026-02-20 13:48:14 +00:00
radicle-node cli: Handle broken pipe (SIGPIPE) gracefully 2026-04-29 10:57:24 +02:00
radicle-oid oid: Fix `impl Arbitrary for Oid` 2026-04-28 14:35:38 +02:00
radicle-protocol treewide/test: Use `impl Arbitrary for Oid` 2026-04-28 14:35:38 +02:00
radicle-remote-helper Spell "Radicle" with a captial R 2026-04-17 17:15:31 +01:00
radicle-schemars schemars: Update to 0.7.0 2026-03-26 15:32:50 +00:00
radicle-signals rust/edition/fmt: 2021 → 2024 2026-03-30 16:57:51 +02:00
radicle-systemd rust/edition/fmt: 2021 → 2024 2026-03-30 16:57:51 +02:00
radicle-term term: Catch EPIPE and swallow 2026-04-29 10:57:24 +02:00
radicle-windows rust/edition/fmt: 2021 → 2024 2026-03-30 16:57:51 +02:00