git log: Unify header_filter and message_filter into one.
authorJunio C Hamano <junkio@cox.net>
Wed, 20 Sep 2006 20:21:56 +0000 (13:21 -0700)
committerJunio 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>
builtin-rev-list.c
revision.c
revision.h

index dbfee750aace175bd8d06fb3e7d1f6d0083c163e..fb7fc92145b6a8baec340176abf40c6b37f45a8e 100644 (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;
index bca122961e0fded660f34e65659d93f00c91bdfc..93f25130a05ccca3e3e6c65b750f256246ae16be 100644 (file)
@@ -674,19 +674,24 @@ int handle_revision_arg(const char *arg, struct rev_info *revs,
        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;
 }
@@ -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)
index 60030e53f4214a3082b05108eee86f207fff1eaa..3adab9590a14e25c2659a1933db4af456c263a5b 100644 (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;