[PATCH v3 0/2] grep: add --max-count command line option
- From
Carlos L. via GitGitGadget <gitgitgadget@gmail.com>
- Date
- Jun 22, 2022, 17:07 UTC
- Message-ID
- <pull.1278.v3.git.git.1655917628.gitgitgadget@gmail.com>
- In-Reply-To
- <pull.1278.v2.git.git.1655789777023.gitgitgadget@gmail.com>
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@protonmail.com
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