From 6e4fea1c0985bbf187fc07908eaf53138d11c793 Mon Sep 17 00:00:00 2001 From: polamin Date: Fri, 20 Feb 2026 11:12:56 +0700 Subject: [PATCH] fix: propagate rg exit code in rtk grep for CLI parity rtk grep previously returned exit 0 for all failure modes (no match, invalid regex, missing file) where rg returns non-zero. This broke shell workflows relying on exit code semantics. Now propagates rg exit codes: 1 (no match), 2 (error) and surfaces stderr for error cases so users see why the command failed. Fixes #162 Co-Authored-By: Claude Opus 4.6 --- src/grep_cmd.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/grep_cmd.rs b/src/grep_cmd.rs index f4be80d..03c5a85 100644 --- a/src/grep_cmd.rs +++ b/src/grep_cmd.rs @@ -44,10 +44,18 @@ pub fn run( .context("grep/rg failed")?; let stdout = String::from_utf8_lossy(&output.stdout); + let exit_code = output.status.code().unwrap_or(1); let raw_output = stdout.to_string(); if stdout.trim().is_empty() { + // Show stderr for errors (bad regex, missing file, etc.) + if exit_code == 2 { + let stderr = String::from_utf8_lossy(&output.stderr); + if !stderr.trim().is_empty() { + eprintln!("{}", stderr.trim()); + } + } let msg = format!("🔍 0 for '{}'", pattern); println!("{}", msg); timer.track( @@ -56,6 +64,9 @@ pub fn run( &raw_output, &msg, ); + if exit_code != 0 { + std::process::exit(exit_code); + } return Ok(()); } @@ -121,6 +132,10 @@ pub fn run( &rtk_output, ); + if exit_code != 0 { + std::process::exit(exit_code); + } + Ok(()) }