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:
parent
480c1ca6fd
commit
2d10c55537
@ -269,9 +269,7 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)
|
|||||||
revs.diff)
|
revs.diff)
|
||||||
usage(rev_list_usage);
|
usage(rev_list_usage);
|
||||||
|
|
||||||
save_commit_buffer = revs.verbose_header ||
|
save_commit_buffer = revs.verbose_header || revs.grep_filter;
|
||||||
revs.header_filter ||
|
|
||||||
revs.message_filter;
|
|
||||||
track_object_refs = 0;
|
track_object_refs = 0;
|
||||||
if (bisect_list)
|
if (bisect_list)
|
||||||
revs.limited = 1;
|
revs.limited = 1;
|
||||||
|
76
revision.c
76
revision.c
@ -674,20 +674,25 @@ int handle_revision_arg(const char *arg, struct rev_info *revs,
|
|||||||
return 0;
|
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)
|
static void add_header_grep(struct rev_info *revs, const char *field, const char *pattern)
|
||||||
{
|
{
|
||||||
char *pat;
|
char *pat;
|
||||||
const char *prefix;
|
const char *prefix;
|
||||||
int patlen, fldlen;
|
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);
|
fldlen = strlen(field);
|
||||||
patlen = strlen(pattern);
|
patlen = strlen(pattern);
|
||||||
pat = xmalloc(patlen + fldlen + 10);
|
pat = xmalloc(patlen + fldlen + 10);
|
||||||
@ -697,21 +702,12 @@ static void add_header_grep(struct rev_info *revs, const char *field, const char
|
|||||||
pattern++;
|
pattern++;
|
||||||
}
|
}
|
||||||
sprintf(pat, "^%s %s%s", field, prefix, pattern);
|
sprintf(pat, "^%s %s%s", field, prefix, pattern);
|
||||||
append_grep_pattern(revs->header_filter, pat,
|
add_grep(revs, pat, GREP_PATTERN_HEAD);
|
||||||
"command line", 0, GREP_PATTERN);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void add_message_grep(struct rev_info *revs, const char *pattern)
|
static void add_message_grep(struct rev_info *revs, const char *pattern)
|
||||||
{
|
{
|
||||||
if (!revs->message_filter) {
|
add_grep(revs, pattern, GREP_PATTERN_BODY);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void add_ignore_packed(struct rev_info *revs, const char *name)
|
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;
|
revs->relative_date = 1;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Grepping the commit log
|
||||||
|
*/
|
||||||
if (!strncmp(arg, "--author=", 9)) {
|
if (!strncmp(arg, "--author=", 9)) {
|
||||||
add_header_grep(revs, "author", arg+9);
|
add_header_grep(revs, "author", arg+9);
|
||||||
continue;
|
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);
|
add_message_grep(revs, arg+7);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
opts = diff_opt_parse(&revs->diffopt, argv+i, argc-i);
|
opts = diff_opt_parse(&revs->diffopt, argv+i, argc-i);
|
||||||
if (opts > 0) {
|
if (opts > 0) {
|
||||||
revs->diff = 1;
|
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)
|
if (diff_setup_done(&revs->diffopt) < 0)
|
||||||
die("diff_setup_done failed");
|
die("diff_setup_done failed");
|
||||||
|
|
||||||
if (revs->header_filter)
|
if (revs->grep_filter)
|
||||||
compile_grep_patterns(revs->header_filter);
|
compile_grep_patterns(revs->grep_filter);
|
||||||
if (revs->message_filter)
|
|
||||||
compile_grep_patterns(revs->message_filter);
|
|
||||||
|
|
||||||
return left;
|
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)
|
static int commit_match(struct commit *commit, struct rev_info *opt)
|
||||||
{
|
{
|
||||||
char *header, *message;
|
if (!opt->grep_filter)
|
||||||
unsigned long header_len, message_len;
|
|
||||||
|
|
||||||
if (!opt->header_filter && !opt->message_filter)
|
|
||||||
return 1;
|
return 1;
|
||||||
|
return grep_buffer(opt->grep_filter,
|
||||||
header = commit->buffer;
|
NULL, /* we say nothing, not even filename */
|
||||||
message = strstr(header, "\n\n");
|
commit->buffer, strlen(commit->buffer));
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct commit *get_revision(struct rev_info *revs)
|
struct commit *get_revision(struct rev_info *revs)
|
||||||
|
@ -72,8 +72,7 @@ struct rev_info {
|
|||||||
const char *extra_headers;
|
const char *extra_headers;
|
||||||
|
|
||||||
/* Filter by commit log message */
|
/* Filter by commit log message */
|
||||||
struct grep_opt *header_filter;
|
struct grep_opt *grep_filter;
|
||||||
struct grep_opt *message_filter;
|
|
||||||
|
|
||||||
/* special limits */
|
/* special limits */
|
||||||
int max_count;
|
int max_count;
|
||||||
|
Loading…
Reference in New Issue
Block a user