Christoph Junghans <ottxor@xxxxxxxxxx> 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 <ottxor@xxxxxxxxxx> > --- 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; } -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html