Re: [PATCH] git-log: added --none-match option
From: Junio C Hamano <hidden>
Date: 2016-06-15 23:03:24
Subsystem:
the rest · Maintainer:
Linus Torvalds
Possibly related (same subject, not in this thread)
- 2016-06-15 · Re: [PATCH] git-log: added --none-match option · Junio C Hamano <hidden>
- 2016-06-15 · Re: [PATCH] git-log: added --none-match option · Junio C Hamano <hidden>
- 2016-06-15 · [PATCH] git-log: added --none-match option · Christoph Junghans <hidden>
Christoph Junghans [off-list ref] writes:
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 <redacted> ---
The patch itself looks like a good start, except that the above description no longer matches the implementation. I further suspect it would be better to rename all_match to all_or_none and then you can lose the "these two are mutually incompatible" check that is placed together with a wrong existing comment. I also notice that you forgot to update the "git grep" where the original "--all-match" came from. A partial fix-up may start like this on top of your version. By renaming the variable used in the existing code, the compiler will remind you that there are a few more places that your patch did not touch that does something special for --all-match, which are a good candidates you need to think if doing something similarly special for the --none-match case is necessary. Thanks.
diff --git a/builtin/grep.c b/builtin/grep.c
index 4063882..9ba4254 100644
--- a/builtin/grep.c
+++ b/builtin/grep.c@@ -727,8 +727,12 @@ int cmd_grep(int argc, const char **argv, const char *prefix) close_callback }, OPT__QUIET(&opt.status_only, N_("indicate hit with exit status without output")), - OPT_BOOL(0, "all-match", &opt.all_match, - N_("show only matches from files that match all patterns")), + OPT_SET_INT(0, "all-match", &opt.all_or_none, + N_("show only matches from files that match all patterns"), + GREP_ALL_MATCH), + OPT_SET_INT(0, "none-match", &opt.all_or_none, + N_("show only matches from files that match no patterns"), + GREP_NONE_MATCH), { OPTION_SET_INT, 0, "debug", &opt.debug, NULL, N_("show parse tree for grep expression"), PARSE_OPT_NOARG | PARSE_OPT_HIDDEN, NULL, 1 },
diff --git a/grep.c b/grep.c
index f486ee5..1ff5dea 100644
--- a/grep.c
+++ b/grep.c@@ -1622,14 +1622,18 @@ 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". + * buffer-wide "all-match" or "none-match". */ - if (!opt->all_match) + switch (opt->all_or_none) { + case GREP_ALL_MATCH: return grep_source_1(opt, gs, 0); + case GREP_NONE_MATCH: + return !grep_source_1(opt, gs, 0); + default: + break; + } /* Otherwise the toplevel "or" terms hit a bit differently. * We first clear hit markers from them.
diff --git a/grep.h b/grep.h
index 8e50c95..2cdabf2 100644
--- a/grep.h
+++ b/grep.h@@ -101,8 +101,9 @@ struct grep_opt { int count; int word_regexp; int fixed; - int all_match; - int none_match; +#define GREP_ALL_MATCH 1 +#define GREP_NONE_MATCH 2 + int all_or_none; int debug; #define GREP_BINARY_DEFAULT 0 #define GREP_BINARY_NOMATCH 1
diff --git a/revision.c b/revision.c
index d43779e..b955848 100644
--- a/revision.c
+++ b/revision.c@@ -2010,9 +2010,9 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg } else if (!strcmp(arg, "--perl-regexp")) { grep_set_pattern_type_option(GREP_PATTERN_TYPE_PCRE, &revs->grep_filter); } else if (!strcmp(arg, "--all-match")) { - revs->grep_filter.all_match = 1; + revs->grep_filter.all_or_none = GREP_ALL_MATCH; } else if (!strcmp(arg, "--none-match")) { - revs->grep_filter.none_match = 1; + revs->grep_filter.all_or_none = GREP_NONE_MATCH; } else if ((argcount = parse_long_opt("encoding", argv, &optarg))) { if (strcmp(optarg, "none")) git_log_output_encoding = xstrdup(optarg);
@@ -2335,8 +2335,6 @@ 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; }