From: Marc-Antoine Ruel <maruel@chromium.org>
To: git@vger.kernel.org
Cc: Marc-Antoine Ruel <maruel@chromium.org>
Subject: [PATCH] grep: Add option --max-line-len
Date: Thu, 23 Nov 2017 10:41:59 -0500 [thread overview]
Message-ID: <20171123154159.17408-1-maruel@chromium.org> (raw)
This tells git grep to skip files longer than a specified length,
which is often the result of generators and not actual source files.
Signed-off-by: Marc-Antoine Ruel <maruel@chromium.org>
---
Documentation/git-grep.txt | 5 +++++
builtin/grep.c | 2 ++
grep.c | 4 ++++
grep.h | 1 +
t/t7810-grep.sh | 5 +++++
5 files changed, 17 insertions(+)
diff --git a/Documentation/git-grep.txt b/Documentation/git-grep.txt
index 18b494731..75081defb 100644
--- a/Documentation/git-grep.txt
+++ b/Documentation/git-grep.txt
@@ -10,6 +10,7 @@ SYNOPSIS
--------
[verse]
'git grep' [-a | --text] [-I] [--textconv] [-i | --ignore-case] [-w | --word-regexp]
+ [-M | --max-line-len <num>]
[-v | --invert-match] [-h|-H] [--full-name]
[-E | --extended-regexp] [-G | --basic-regexp]
[-P | --perl-regexp]
@@ -127,6 +128,10 @@ OPTIONS
beginning of a line, or preceded by a non-word character; end at
the end of a line or followed by a non-word character).
+-M<num>::
+--max-line-len<num>::
+ Match the pattern only for line shorter or equal to this length.
+
-v::
--invert-match::
Select non-matching lines.
diff --git a/builtin/grep.c b/builtin/grep.c
index 5a6cfe6b4..cc5c70be5 100644
--- a/builtin/grep.c
+++ b/builtin/grep.c
@@ -796,6 +796,8 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
N_("case insensitive matching")),
OPT_BOOL('w', "word-regexp", &opt.word_regexp,
N_("match patterns only at word boundaries")),
+ OPT_INTEGER('M', "max-line-len", &opt.max_line_length,
+ N_("ignore lines longer than <n>")),
OPT_SET_INT('a', "text", &opt.binary,
N_("process binary files as text"), GREP_BINARY_TEXT),
OPT_SET_INT('I', NULL, &opt.binary,
diff --git a/grep.c b/grep.c
index d0b9b6cdf..881078b82 100644
--- a/grep.c
+++ b/grep.c
@@ -36,6 +36,7 @@ void init_grep_defaults(void)
opt->relative = 1;
opt->pathname = 1;
opt->max_depth = -1;
+ opt->max_line_length = -1;
opt->pattern_type_option = GREP_PATTERN_TYPE_UNSPECIFIED;
color_set(opt->color_context, "");
color_set(opt->color_filename, "");
@@ -151,6 +152,7 @@ void grep_init(struct grep_opt *opt, const char *prefix)
opt->pattern_type_option = def->pattern_type_option;
opt->linenum = def->linenum;
opt->max_depth = def->max_depth;
+ opt->max_line_length = def->max_line_length;
opt->pathname = def->pathname;
opt->relative = def->relative;
opt->output = def->output;
@@ -1273,6 +1275,8 @@ static int match_line(struct grep_opt *opt, char *bol, char *eol,
struct grep_pat *p;
regmatch_t match;
+ if (opt->max_line_length > 0 && eol-bol > opt->max_line_length)
+ return 0;
if (opt->extended)
return match_expr(opt, bol, eol, ctx, collect_hits);
diff --git a/grep.h b/grep.h
index 399381c90..0e76c0a19 100644
--- a/grep.h
+++ b/grep.h
@@ -151,6 +151,7 @@ struct grep_opt {
int null_following_name;
int color;
int max_depth;
+ int max_line_length;
int funcname;
int funcbody;
int extended_regexp_option;
diff --git a/t/t7810-grep.sh b/t/t7810-grep.sh
index 2a6679c2f..c514bd388 100755
--- a/t/t7810-grep.sh
+++ b/t/t7810-grep.sh
@@ -766,6 +766,11 @@ test_expect_success 'grep -W shows no trailing empty lines' '
test_cmp expected actual
'
+test_expect_success 'grep skips long lines' '
+ git grep -M18 -W include >actual &&
+ test_cmp expected actual
+'
+
cat >expected <<EOF
hello.c= printf("Hello world.\n");
hello.c: return 0;
--
2.15.0
next reply other threads:[~2017-11-23 15:43 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-11-23 15:41 Marc-Antoine Ruel [this message]
2017-11-23 19:24 ` [PATCH] grep: Add option --max-line-len Eric Sunshine
2017-11-24 1:44 ` Junio C Hamano
[not found] ` <CAN+rsqmEWHhnQvktxsLJC2CkOQEmBL3b_xjRkEOHzV8W72zJew@mail.gmail.com>
2017-11-27 1:58 ` Marc-Antoine Ruel
2017-11-27 2:08 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20171123154159.17408-1-maruel@chromium.org \
--to=maruel@chromium.org \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).