From: Johannes Schindelin <Johannes.Schindelin@gmx.de>
To: skimo@liacs.nl
Cc: Junio C Hamano <gitster@pobox.com>, git@vger.kernel.org
Subject: Re: [PATCH] revision: allow selection of commits that do not match a pattern
Date: Sat, 7 Jul 2007 20:35:35 +0100 (BST) [thread overview]
Message-ID: <Pine.LNX.4.64.0707071957370.4093@racer.site> (raw)
In-Reply-To: <20070707184224.GE1528MdfPADPa@greensroom.kotnet.org>
Hi,
On Sat, 7 Jul 2007, Sven Verdoolaege wrote:
> We do this by maintaining two lists of patterns, one for
> those that should match and one for those that should not match.
I would at least give one example in the commit message
> diff --git a/revision.c b/revision.c
> index 5184716..4b00ada 100644
> --- a/revision.c
> +++ b/revision.c
> @@ -821,40 +821,65 @@ int handle_revision_arg(const char *arg, struct rev_info *revs,
> return 0;
> }
>
> -static void add_grep(struct rev_info *revs, const char *ptn, enum grep_pat_token what)
> +static void add_grep_to_filter(struct grep_opt **filter, const char *ptn,
> + enum grep_pat_token what)
> {
> - if (!revs->grep_filter) {
> + if (!*filter) {
Why not keep it "add_grep", and do a
struct grep_opt **filter = negated ?
&revs->grep_neg_filter : &revs->grep_filter;
Hm? You avoid an extra function that way.
> +static void add_header_grep(struct rev_info *revs, const char *field,
> + const char *pattern)
> {
> char *pat;
> const char *prefix;
> int patlen, fldlen;
> + int negated = 0;
>
> fldlen = strlen(field);
> patlen = strlen(pattern);
> pat = xmalloc(patlen + fldlen + 10);
> prefix = ".*";
> + if (*pattern == '!') {
> + negated = 1;
> + pattern++;
> + }
> + if (pattern[0] == '\\' && pattern[1] == '!')
> + pattern++;
> if (*pattern == '^') {
> prefix = "";
> pattern++;
> }
> sprintf(pat, "^%s %s%s", field, prefix, pattern);
> - add_grep(revs, pat, GREP_PATTERN_HEAD);
> + add_grep(revs, pat, GREP_PATTERN_HEAD, negated);
> }
The parsing for "!" is again duplicated in add_message_grep(). Why not put
it into add_grep(), and do
negated = *pattern == '!';
sprintf(pat, "%s^%s %s%s", negated ? "!" : "", field, prefix,
pattern + negated);
instead? No need to change the signature of add_grep(), and all callers
get the '!' feature for free.
> @@ -1249,6 +1277,10 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch
> compile_grep_patterns(revs->grep_filter);
> }
>
> + if (revs->grep_neg_filter) {
> + compile_grep_patterns(revs->grep_neg_filter);
> + }
> +
Please lose the "{" and "}".
> @@ -1329,11 +1361,14 @@ static int rewrite_parents(struct rev_info *revs, struct commit *commit)
>
> static int commit_match(struct commit *commit, struct rev_info *opt)
> {
> - if (!opt->grep_filter)
> - return 1;
> - return grep_buffer(opt->grep_filter,
> + return (!opt->grep_filter ||
> + grep_buffer(opt->grep_filter,
> + NULL, /* we say nothing, not even filename */
> + commit->buffer, strlen(commit->buffer))) &&
> + (!opt->grep_neg_filter ||
> + !grep_buffer(opt->grep_neg_filter,
> NULL, /* we say nothing, not even filename */
> - commit->buffer, strlen(commit->buffer));
> + commit->buffer, strlen(commit->buffer)));
> }
Urgh! That's not nice on my eyes.
Also, I suspect that the semantics are not yet clear, what should happen
if all_match is unset.
BTW I suspect that a better way than having two filter lists is
demonstrated in builtin-grep.c.
Ciao,
Dscho
next prev parent reply other threads:[~2007-07-07 19:42 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-07-07 15:30 [PATCH] revision: allow selection of commits that do not match a pattern Sven Verdoolaege
2007-07-07 16:27 ` Johannes Schindelin
2007-07-07 16:52 ` Sven Verdoolaege
2007-07-07 17:33 ` Johannes Schindelin
2007-07-07 18:42 ` Sven Verdoolaege
2007-07-07 19:35 ` Johannes Schindelin [this message]
2007-07-07 20:22 ` Sven Verdoolaege
2007-07-08 10:57 ` [PATCH v3] " Sven Verdoolaege
2007-07-08 14:22 ` Johannes Schindelin
2007-07-08 14:57 ` Sven Verdoolaege
2007-07-11 17:42 ` Jeff King
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=Pine.LNX.4.64.0707071957370.4093@racer.site \
--to=johannes.schindelin@gmx.de \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=skimo@liacs.nl \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).