From: Junio C Hamano <gitster@pobox.com>
To: Christoph Junghans <ottxor@gentoo.org>
Cc: git@vger.kernel.org
Subject: Re: [PATCH] git-log: added --none-match option
Date: Tue, 06 Jan 2015 15:02:41 -0800 [thread overview]
Message-ID: <xmqq61cjo6lq.fsf@gitster.dls.corp.google.com> (raw)
In-Reply-To: <1420349268-13479-1-git-send-email-ottxor@gentoo.org> (Christoph Junghans's message of "Sat, 3 Jan 2015 22:27:48 -0700")
Christoph Junghans <ottxor@gentoo.org> 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@gentoo.org>
> ---
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;
}
next prev parent reply other threads:[~2015-01-06 23:02 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-12-19 2:14 [PATCH] git-log: added --invert-grep option Christoph Junghans
2014-12-19 6:50 ` Junio C Hamano
2014-12-24 3:03 ` Christoph Junghans
2014-12-24 3:03 ` [PATCH] git-log: added --grep-begin .. --grep-end syntax Christoph Junghans
2014-12-29 17:56 ` [PATCH] git-log: added --invert-grep option Junio C Hamano
2015-01-04 5:27 ` [PATCH] git-log: added --none-match option Christoph Junghans
2015-01-06 23:02 ` Junio C Hamano [this message]
2015-01-09 22:33 ` Christoph Junghans
2015-01-09 22:55 ` Junio C Hamano
2015-01-12 20:51 ` Junio C Hamano
2015-01-12 1:39 ` [PATCH v2] " Christoph Junghans
2015-01-13 1:33 ` [PATCH v2] log: teach --invert-grep option Christoph Junghans
2015-01-13 18:25 ` Junio C Hamano
2015-02-16 7:29 ` [PATCH] gitk: pass --invert-grep option down to "git log" Junio C Hamano
2015-03-22 3:39 ` Paul Mackerras
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=xmqq61cjo6lq.fsf@gitster.dls.corp.google.com \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
--cc=ottxor@gentoo.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.