git log: Unify header_filter and message_filter into one.

Now we can tell the built-in grep to grep only in head or in
body, use that to update --author, --committer, and --grep.

Unfortunately, to make --and, --not and other grep boolean
expressions useful, as in:

	# Things written by Junio committed and by Linus and log
	# does not talk about diff.

	git log --author=Junio --and --committer=Linus \
		--grep-not --grep=diff

we will need to do another round of built-in grep core
enhancement, because grep boolean expressions are designed to
work on one line at a time.

Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Junio C Hamano 2006-09-20 13:21:56 -07:00
parent 480c1ca6fd
commit 2d10c55537
3 changed files with 28 additions and 55 deletions

View File

@ -269,9 +269,7 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)
revs.diff)
usage(rev_list_usage);
save_commit_buffer = revs.verbose_header ||
revs.header_filter ||
revs.message_filter;
save_commit_buffer = revs.verbose_header || revs.grep_filter;
track_object_refs = 0;
if (bisect_list)
revs.limited = 1;

View File

@ -674,20 +674,25 @@ 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)
{
if (!revs->grep_filter) {
struct grep_opt *opt = xcalloc(1, sizeof(*opt));
opt->status_only = 1;
opt->pattern_tail = &(opt->pattern_list);
opt->regflags = REG_NEWLINE;
revs->grep_filter = opt;
}
append_grep_pattern(revs->grep_filter, ptn,
"command line", 0, what);
}
static void add_header_grep(struct rev_info *revs, const char *field, const char *pattern)
{
char *pat;
const char *prefix;
int patlen, fldlen;
if (!revs->header_filter) {
struct grep_opt *opt = xcalloc(1, sizeof(*opt));
opt->status_only = 1;
opt->pattern_tail = &(opt->pattern_list);
opt->regflags = REG_NEWLINE;
revs->header_filter = opt;
}
fldlen = strlen(field);
patlen = strlen(pattern);
pat = xmalloc(patlen + fldlen + 10);
@ -697,21 +702,12 @@ static void add_header_grep(struct rev_info *revs, const char *field, const char
pattern++;
}
sprintf(pat, "^%s %s%s", field, prefix, pattern);
append_grep_pattern(revs->header_filter, pat,
"command line", 0, GREP_PATTERN);
add_grep(revs, pat, GREP_PATTERN_HEAD);
}
static void add_message_grep(struct rev_info *revs, const char *pattern)
{
if (!revs->message_filter) {
struct grep_opt *opt = xcalloc(1, sizeof(*opt));
opt->status_only = 1;
opt->pattern_tail = &(opt->pattern_list);
opt->regflags = REG_NEWLINE;
revs->message_filter = opt;
}
append_grep_pattern(revs->message_filter, pattern,
"command line", 0, GREP_PATTERN);
add_grep(revs, pattern, GREP_PATTERN_BODY);
}
static void add_ignore_packed(struct rev_info *revs, const char *name)
@ -955,6 +951,10 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch
revs->relative_date = 1;
continue;
}
/*
* Grepping the commit log
*/
if (!strncmp(arg, "--author=", 9)) {
add_header_grep(revs, "author", arg+9);
continue;
@ -967,6 +967,7 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch
add_message_grep(revs, arg+7);
continue;
}
opts = diff_opt_parse(&revs->diffopt, argv+i, argc-i);
if (opts > 0) {
revs->diff = 1;
@ -1027,10 +1028,8 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch
if (diff_setup_done(&revs->diffopt) < 0)
die("diff_setup_done failed");
if (revs->header_filter)
compile_grep_patterns(revs->header_filter);
if (revs->message_filter)
compile_grep_patterns(revs->message_filter);
if (revs->grep_filter)
compile_grep_patterns(revs->grep_filter);
return left;
}
@ -1106,34 +1105,11 @@ static void mark_boundary_to_show(struct commit *commit)
static int commit_match(struct commit *commit, struct rev_info *opt)
{
char *header, *message;
unsigned long header_len, message_len;
if (!opt->header_filter && !opt->message_filter)
if (!opt->grep_filter)
return 1;
header = commit->buffer;
message = strstr(header, "\n\n");
if (message) {
message += 2;
header_len = message - header - 1;
message_len = strlen(message);
}
else {
header_len = strlen(header);
message = header;
message_len = 0;
}
if (opt->header_filter &&
!grep_buffer(opt->header_filter, NULL, header, header_len))
return 0;
if (opt->message_filter &&
!grep_buffer(opt->message_filter, NULL, message, message_len))
return 0;
return 1;
return grep_buffer(opt->grep_filter,
NULL, /* we say nothing, not even filename */
commit->buffer, strlen(commit->buffer));
}
struct commit *get_revision(struct rev_info *revs)

View File

@ -72,8 +72,7 @@ struct rev_info {
const char *extra_headers;
/* Filter by commit log message */
struct grep_opt *header_filter;
struct grep_opt *message_filter;
struct grep_opt *grep_filter;
/* special limits */
int max_count;