summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph Junghans <ottxor@gentoo.org>2015-01-03 22:27:48 -0700
committerJunio C Hamano <gitster@pobox.com>2015-01-06 14:40:46 -0800
commita462402232aab7f44c46c614ac9c3d94c65b3831 (patch)
tree85a07d33076d743a7767f8524cd5eaddf74e9577
parentc2e8e4b9da4d007b15faa2e3d407b2fd279f0572 (diff)
downloadgit-cj/grep-none-match.tar.gz
git-log: added --none-match optioncj/grep-none-match
Implements a inverted match for "git log", like in the case of "git grep -v", which is useful from time to time to e.g. filter FIXUP message out of "git log". Internally, a new bol 'none_match' has been introduces as revs->grep_filter.invert inverts the match line-wise, which cannot work as i.e. empty line always not match the pattern given. Signed-off-by: Christoph Junghans <ottxor@gentoo.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--Documentation/rev-list-options.txt4
-rw-r--r--contrib/completion/git-completion.bash2
-rw-r--r--grep.c2
-rw-r--r--grep.h1
-rw-r--r--revision.c4
5 files changed, 12 insertions, 1 deletions
diff --git a/Documentation/rev-list-options.txt b/Documentation/rev-list-options.txt
index afccfdc23a..36f222a1ea 100644
--- a/Documentation/rev-list-options.txt
+++ b/Documentation/rev-list-options.txt
@@ -66,6 +66,10 @@ if it is part of the log message.
Limit the commits output to ones that match all given `--grep`,
instead of ones that match at least one.
+--none-match::
+ Limit the commits output to ones that do not match any of the
+ given `--grep`, instead of ones that match at least one.
+
-i::
--regexp-ignore-case::
Match the regular expression limiting patterns without regard to letter
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 2fece98c60..deba26172f 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -1425,7 +1425,7 @@ __git_log_gitk_options="
# Options that go well for log and shortlog (not gitk)
__git_log_shortlog_options="
--author= --committer= --grep=
- --all-match
+ --all-match --none-match
"
__git_log_pretty_formats="oneline short medium full fuller email raw format:"
diff --git a/grep.c b/grep.c
index 6e085f8297..f486ee5631 100644
--- a/grep.c
+++ b/grep.c
@@ -1622,6 +1622,8 @@ static int chk_hit_marker(struct grep_expr *x)
int grep_source(struct grep_opt *opt, struct grep_source *gs)
{
+ if(opt->none_match)
+ return !grep_source_1(opt, gs, 0);
/*
* we do not have to do the two-pass grep when we do not check
* buffer-wide "all-match".
diff --git a/grep.h b/grep.h
index 95f197a8d9..8e50c9545b 100644
--- a/grep.h
+++ b/grep.h
@@ -102,6 +102,7 @@ struct grep_opt {
int word_regexp;
int fixed;
int all_match;
+ int none_match;
int debug;
#define GREP_BINARY_DEFAULT 0
#define GREP_BINARY_NOMATCH 1
diff --git a/revision.c b/revision.c
index 75dda928ea..d43779e6ce 100644
--- a/revision.c
+++ b/revision.c
@@ -2011,6 +2011,8 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
grep_set_pattern_type_option(GREP_PATTERN_TYPE_PCRE, &revs->grep_filter);
} else if (!strcmp(arg, "--all-match")) {
revs->grep_filter.all_match = 1;
+ } else if (!strcmp(arg, "--none-match")) {
+ revs->grep_filter.none_match = 1;
} else if ((argcount = parse_long_opt("encoding", argv, &optarg))) {
if (strcmp(optarg, "none"))
git_log_output_encoding = xstrdup(optarg);
@@ -2333,6 +2335,8 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct s
die("cannot combine --walk-reflogs with --graph");
if (!revs->reflog_info && revs->grep_filter.use_reflog_filter)
die("cannot use --grep-reflog without --walk-reflogs");
+ if (revs->grep_filter.all_match && revs->grep_filter.none_match)
+ die("cannot combine --all-match with --none-match");
return left;
}