diff options
author | Junio C Hamano <junkio@cox.net> | 2006-05-03 21:46:29 -0700 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2006-05-03 21:46:29 -0700 |
commit | e23d2d6b765162902bd8b722e1659f002b97a302 (patch) | |
tree | 885e5ab12460d3a010e6b97eb225763297b4bb90 | |
parent | b8d0f5a00313bc5fb173f77c9a91a94f94a5aa1b (diff) | |
download | git-e23d2d6b765162902bd8b722e1659f002b97a302.tar.gz git-e23d2d6b765162902bd8b722e1659f002b97a302.tar.xz |
builtin-grep: -L (--files-without-match).
Signed-off-by: Junio C Hamano <junkio@cox.net>
-rw-r--r-- | builtin-grep.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/builtin-grep.c b/builtin-grep.c index 0d6115763..c89ee33a1 100644 --- a/builtin-grep.c +++ b/builtin-grep.c @@ -93,6 +93,7 @@ struct grep_opt { unsigned linenum:1; unsigned invert:1; unsigned name_only:1; + unsigned unmatch_name_only:1; unsigned count:1; unsigned word_regexp:1; #define GREP_BINARY_DEFAULT 0 @@ -241,6 +242,11 @@ static int grep_buffer(struct grep_opt *opt, const char *name, */ if (opt->invert) hit = !hit; + if (opt->unmatch_name_only) { + if (hit) + return 0; + goto next_line; + } if (hit) { count++; if (binary_match_only) { @@ -297,6 +303,8 @@ static int grep_buffer(struct grep_opt *opt, const char *name, prev->bol = bol; prev->eol = eol; } + + next_line: *eol = ch; bol = eol + 1; if (!left) @@ -304,6 +312,13 @@ static int grep_buffer(struct grep_opt *opt, const char *name, left--; lno++; } + + if (opt->unmatch_name_only) { + /* We did not see any hit, so we want to show this */ + printf("%s\n", name); + return 1; + } + /* NEEDSWORK: * The real "grep -c foo *.c" gives many "bar.c:0" lines, * which feels mostly useless but sometimes useful. Maybe @@ -532,6 +547,11 @@ int cmd_grep(int argc, const char **argv, char **envp) opt.name_only = 1; continue; } + if (!strcmp("-L", arg) || + !strcmp("--files-without-match", arg)) { + opt.unmatch_name_only = 1; + continue; + } if (!strcmp("-c", arg) || !strcmp("--count", arg)) { opt.count = 1; |