This patch adds a command line option analogous to that of GNU grep(1)'s -m / --max-count, which users might already be used to. This makes it possible to limit the amount of matches shown in the output while keeping the functionality of other options such as -C (show code context) or -p (show containing function), which would be difficult to do with a shell pipeline (e.g. head(1)). Signed-off-by: Carlos López 00xc@xxxxxxxxxxxxxx Carlos López (2): grep: add --max-count command line option tests: add tests for grep --max-count Documentation/git-grep.txt | 9 +++++ builtin/grep.c | 9 +++++ grep.c | 2 +- grep.h | 2 + t/t7810-grep.sh | 83 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 104 insertions(+), 1 deletion(-) base-commit: 5b71c59bc3b9365075e2a175aa7b6f2b0c84ce44 Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1278%2F00xc%2Fmaster-v3 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1278/00xc/master-v3 Pull-Request: https://github.com/git/git/pull/1278 Range-diff vs v2: 1: ee7eb298854 ! 1: 5bf7244437e grep: add --max-count command line option @@ Documentation/git-grep.txt: providing this option will cause it to die. + Limit the amount of matches per file. When using the `-v` or + `--invert-match` option, the search stops after the specified + number of non-matches. A value of -1 will return unlimited -+ results (the default). ++ results (the default). A value of 0 will exit immediately with ++ a non-zero status. + --threads <num>:: Number of grep worker threads to use. @@ builtin/grep.c: int cmd_grep(int argc, const char **argv, const char *prefix) + * We do this to keep results consistent with GNU grep(1). + */ + if (opt.max_count == 0) -+ exit(EXIT_FAILURE); ++ return 1; + if (show_in_pager) { if (num_threads > 1) @@ builtin/grep.c: int cmd_grep(int argc, const char **argv, const char *prefix) ## grep.c ## @@ grep.c: static int grep_source_1(struct grep_opt *opt, struct grep_source *gs, int colle - bol = eol + 1; - if (!left) - break; -+ if (opt->max_count != -1 && count == opt->max_count) -+ break; - left--; - lno++; - } + return 0; + goto next_line; + } +- if (hit) { ++ if (hit && (opt->max_count < 0 || count < opt->max_count)) { + count++; + if (opt->status_only) + return 1; ## grep.h ## @@ grep.h: struct grep_opt { -: ----------- > 2: 525958af877 tests: add tests for grep --max-count -- gitgitgadget