From 9abbf426bf6e56ad92ab66fd756b9ca7c8d738ec Mon Sep 17 00:00:00 2001 From: Marco Allegretti Date: Tue, 24 Feb 2026 11:46:51 +0100 Subject: [PATCH] cli: exit cleanly on broken pipe Piping CLI output into tools like head may close stdout early. Rust then panics when printing. Install a panic hook that exits successfully on EPIPE instead of emitting a panic backtrace. --- crates/karapace-cli/src/main.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/crates/karapace-cli/src/main.rs b/crates/karapace-cli/src/main.rs index 8138048..8e953e5 100644 --- a/crates/karapace-cli/src/main.rs +++ b/crates/karapace-cli/src/main.rs @@ -212,6 +212,19 @@ enum Commands { #[allow(clippy::too_many_lines)] fn main() -> ExitCode { + let default_hook = std::panic::take_hook(); + std::panic::set_hook(Box::new(move |info| { + let msg = info.to_string(); + if msg.contains("Broken pipe") + || msg.contains("broken pipe") + || msg.contains("os error 32") + || msg.contains("failed printing to stdout") + { + std::process::exit(0); + } + default_hook(info); + })); + let cli = Cli::parse(); let default_level = if cli.trace {