From bbf205fc92e68ae44af83b25485c68b5d6533186 Mon Sep 17 00:00:00 2001 From: Wondr Date: Fri, 5 Jun 2026 03:26:12 +0100 Subject: [PATCH] grep: short-circuit max-count zero --- src/lib.rs | 6 +++++- tests/test_grep.rs | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 0f2b63a..f01e11b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -20,7 +20,7 @@ use clap::{Arg, ArgAction, Command}; use std::ffi::{OsStr, OsString}; use std::io::{IsTerminal as _, Read}; use std::path::Path; -use uucore::error::{FromIo, UResult, USimpleError}; +use uucore::error::{ExitCode, FromIo, UResult, USimpleError}; #[derive(Clone, Copy, PartialEq, Eq)] #[doc(hidden)] @@ -399,6 +399,10 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { }; let matcher = Matcher::compile(&config)?; + if config.max_count == Some(0) { + return Err(ExitCode::new(1)); + } + let writer = OutputWriter::new(&config); let mut searcher = Searcher::new(&config, matcher, writer); let mut lb = LineBuffer::new(if config.null_data { b'\0' } else { b'\n' }); diff --git a/tests/test_grep.rs b/tests/test_grep.rs index d061918..f5f4bfd 100644 --- a/tests/test_grep.rs +++ b/tests/test_grep.rs @@ -278,6 +278,21 @@ fn max_count() { .fails_with_code(1) .no_stdout(); + let (_s, mut c) = ucmd(); + c.args(&["-m", "0", "a", "missing"]) + .fails_with_code(1) + .no_output(); + + let (_s, mut c) = ucmd(); + c.args(&["-m", "1", "a", "missing"]) + .fails_with_code(2) + .stderr_contains("grep: missing:"); + + let (_s, mut c) = ucmd(); + c.args(&["-m", "0", "-e", "["]) + .fails_with_code(2) + .stderr_contains("invalid pattern"); + // -A trailing context still printed after the cutoff. let (_s, mut c) = ucmd(); c.args(&["-m", "1", "-A", "2", "match"])