Junio C Hamano venit, vidit, dixit 14.09.2012 01:26: > Junio C Hamano <gitster@xxxxxxxxx> writes: > >> One possible improvement we can make is to parse the command line in >> the last example with "--all-match" to >> >> [all-match] >> (or >> pattern_body<body>commit >> (or >> pattern_body<body>tag >> (or >> pattern_head<head 1>Linus >> (or >> pattern_head<head 0>Junio >> true >> ) >> ) >> ) >> ) >> >> so that the backbone becomes >> >> - Mentions commit, >> - Mentions tag, >> - Committed by Linus, >> - Authored by Junio >> >> to require that both commit and tag are mentioned in the message. > > And this is an attempt to do exactly that. Earlier, when we have > both header expression (which by the way has to be an OR node by > construction) and pattern expression (which could be anything), we > created a top-level OR node (again, look at this as if you are > reading LISP), > > OR > / \ > / \ > pattern OR > / \ / \ > ..... committer OR > / \ > author TRUE > > in other words, the three elements on the top-level backbone are > "pattern", "committer" and "author"; when there are more than one > elements in the "pattern", the top-level node of it is OR, so that > node is inspected by "all-match", hence the result ends up ignoring > the "--all-match" given from the command line. > > This patch turns it into > > OR > / \ > / \ > / OR > committer / \ > author \ > pattern > > when "--all-match" was given from the command line, so that the > "committer", "author" and elements on the top-level backbone in > "pattern" form the top-level backbone of the resulting expression to > be inspected by the "all-match" logic. > > Does this pass the expect-failure test in your [PATCH 5/6]? Just a quick heads up: I merged 38ed8ef (log --grep/--author: honor --all-match honored for multiple --grep patterns, 2012-09-13) from pu into my test branch, and this fixes what I had marked as known failure there. Thanks! [I still have to figure out the logic, but begin to understand that "(OR...) and "(AND...)" are linewise, and all-match is a bufferwise AND or something. Now, what is "*or*" ...] > grep.c | 19 +++++++++++++++++++ > 1 file changed, 19 insertions(+) > > diff --git c/grep.c w/grep.c > index be15c47..925aa92 100644 > --- c/grep.c > +++ w/grep.c > @@ -476,6 +476,22 @@ static struct grep_expr *prep_header_patterns(struct grep_opt *opt) > return header_expr; > } > > +static struct grep_expr *grep_splice_or(struct grep_expr *x, struct grep_expr *y) > +{ > + struct grep_expr *z = x; > + > + while (x) { > + assert(x->node == GREP_NODE_OR); > + if (x->u.binary.right && > + x->u.binary.right->node == GREP_NODE_TRUE) { > + x->u.binary.right = y; > + break; > + } > + x = x->u.binary.right; > + } > + return z; > +} > + > static void compile_grep_patterns_real(struct grep_opt *opt) > { > struct grep_pat *p; > @@ -510,6 +526,9 @@ static void compile_grep_patterns_real(struct grep_opt *opt) > > if (!opt->pattern_expression) > opt->pattern_expression = header_expr; > + else if (opt->all_match) > + opt->pattern_expression = grep_splice_or(header_expr, > + opt->pattern_expression); > else > opt->pattern_expression = grep_or_expr(opt->pattern_expression, > header_expr); > -- 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