summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 480c1ca)
raw | patch | inline | side by side (parent: 480c1ca)
author | Junio C Hamano <junkio@cox.net> | |
Wed, 20 Sep 2006 20:21:56 +0000 (13:21 -0700) | ||
committer | Junio C Hamano <junkio@cox.net> | |
Wed, 20 Sep 2006 20:21:56 +0000 (13:21 -0700) |
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>
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>
builtin-rev-list.c | patch | blob | history | |
revision.c | patch | blob | history | |
revision.h | patch | blob | history |
diff --git a/builtin-rev-list.c b/builtin-rev-list.c
index dbfee750aace175bd8d06fb3e7d1f6d0083c163e..fb7fc92145b6a8baec340176abf40c6b37f45a8e 100644 (file)
--- a/builtin-rev-list.c
+++ b/builtin-rev-list.c
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;
diff --git a/revision.c b/revision.c
index bca122961e0fded660f34e65659d93f00c91bdfc..93f25130a05ccca3e3e6c65b750f256246ae16be 100644 (file)
--- a/revision.c
+++ b/revision.c
return 0;
}
-static void add_header_grep(struct rev_info *revs, const char *field, const char *pattern)
+static void add_grep(struct rev_info *revs, const char *ptn, enum grep_pat_token what)
{
- char *pat;
- const char *prefix;
- int patlen, fldlen;
-
- if (!revs->header_filter) {
+ 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->header_filter = opt;
+ 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;
fldlen = strlen(field);
patlen = strlen(pattern);
@@ -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;
}
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)
diff --git a/revision.h b/revision.h
index 60030e53f4214a3082b05108eee86f207fff1eaa..3adab9590a14e25c2659a1933db4af456c263a5b 100644 (file)
--- a/revision.h
+++ b/revision.h
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;