diff --git a/crates/bashkit/src/builtins/rg/mod.rs b/crates/bashkit/src/builtins/rg/mod.rs index 428a4f9c..5641dbdb 100644 --- a/crates/bashkit/src/builtins/rg/mod.rs +++ b/crates/bashkit/src/builtins/rg/mod.rs @@ -4477,6 +4477,58 @@ fn rg_quiet_result( None } +fn rg_option_takes_value(arg: &str) -> bool { + matches!( + arg, + "-e" | "--regexp" + | "-f" + | "--file" + | "-r" + | "--replace" + | "-A" + | "--after-context" + | "-B" + | "--before-context" + | "-C" + | "--context" + | "-d" + | "--max-depth" + | "-E" + | "--encoding" + | "--engine" + | "--field-context-separator" + | "--field-match-separator" + | "-g" + | "--glob" + | "--iglob" + | "--ignore-file" + | "-M" + | "--max-columns" + | "-m" + | "--max-count" + | "--max-filesize" + | "--path-separator" + | "--pre" + | "--pre-glob" + | "--regex-size-limit" + | "--dfa-size-limit" + | "--sort" + | "--sortr" + | "-j" + | "--threads" + | "-t" + | "--type" + | "-T" + | "--type-not" + | "--type-add" + | "--type-clear" + | "--context-separator" + | "--hostname-bin" + | "--hyperlink-format" + | "--colors" + ) +} + fn rg_generate_kind(args: &[String]) -> Result> { let mut i = 0; while i < args.len() { @@ -4484,6 +4536,10 @@ fn rg_generate_kind(args: &[String]) -> Result> { if arg == "--" { break; } + if rg_option_takes_value(arg) { + i += 2; + continue; + } if arg == "--generate" { let Some(kind) = args.get(i + 1) else { return Err(Error::Execution( @@ -11897,6 +11953,29 @@ mod tests { assert!(man.stdout.contains(".SH NAME")); } + #[tokio::test] + async fn test_rg_generate_not_detected_inside_value_args() { + let files = [("/tmp/input.txt", b"--generate=complete-bash\n".as_slice())]; + + let with_short_regexp = run_rg( + &["-e", "--generate=complete-bash", "/tmp/input.txt"], + None, + &files, + ) + .await; + assert_eq!(with_short_regexp.exit_code, 0); + assert_eq!(with_short_regexp.stdout, "--generate=complete-bash\n"); + + let with_long_regexp = run_rg( + &["--regexp", "--generate=complete-bash", "/tmp/input.txt"], + None, + &files, + ) + .await; + assert_eq!(with_long_regexp.exit_code, 0); + assert_eq!(with_long_regexp.stdout, "--generate=complete-bash\n"); + } + #[tokio::test] async fn test_rg_invalid_sort_values_exit_two() { let invalid = run_rg(&["--sort", "junk", "needle", "/file.txt"], None, &[]).await;