Both "git log" and "git reflog show" recognize this option.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclo...@gmail.com>
---
 Itch: how to show reflogs for checkout operation only?

 Instead of ignoring when -g is not given, we might want to imply -g.

 Still itch: grep highlight! For all applicable areas: commit headers
 including reflog messages, commit body, diff.

 Documentation/rev-list-options.txt |  5 +++++
 revision.c                         | 30 ++++++++++++++++++++++++++++++
 revision.h                         |  1 +
 3 files changed, 36 insertions(+)

diff --git a/Documentation/rev-list-options.txt 
b/Documentation/rev-list-options.txt
index 1fc2a18..aeaa58c 100644
--- a/Documentation/rev-list-options.txt
+++ b/Documentation/rev-list-options.txt
@@ -51,6 +51,11 @@ endif::git-rev-list[]
        commits whose author matches any of the given patterns are
        chosen (similarly for multiple `--committer=<pattern>`).
 
+--reflog-message=<pattern>::
+       Limit the commits output to ones with reflog messages that
+       match the specified pattern (regular expression). Ignored unless
+       --walk-reflogs is given.
+
 --grep=<pattern>::
 
        Limit the commits output to ones with log message that
diff --git a/revision.c b/revision.c
index ae12e11..ee55bb2 100644
--- a/revision.c
+++ b/revision.c
@@ -1053,6 +1053,11 @@ void init_revisions(struct rev_info *revs, const char 
*prefix)
        revs->grep_filter.header_tail = &(revs->grep_filter.header_list);
        revs->grep_filter.regflags = REG_NEWLINE;
 
+       revs->reflog_filter.status_only = 1;
+       revs->reflog_filter.pattern_tail = &(revs->reflog_filter.pattern_list);
+       revs->reflog_filter.header_tail = &(revs->reflog_filter.header_list);
+       revs->reflog_filter.regflags = REG_NEWLINE;
+
        diff_setup(&revs->diffopt);
        if (prefix && !revs->diffopt.prefix) {
                revs->diffopt.prefix = prefix;
@@ -1298,6 +1303,12 @@ static void add_message_grep(struct rev_info *revs, 
const char *pattern)
        add_grep(revs, pattern, GREP_PATTERN_BODY);
 }
 
+static void add_reflog_grep(struct rev_info *revs, const char *ptn)
+{
+       append_grep_pattern(&revs->reflog_filter, ptn,
+                           "command line", 0, GREP_PATTERN);
+}
+
 static int handle_revision_opt(struct rev_info *revs, int argc, const char 
**argv,
                               int *unkc, const char **unkv)
 {
@@ -1600,15 +1611,23 @@ static int handle_revision_opt(struct rev_info *revs, 
int argc, const char **arg
                return argcount;
        } else if (!strcmp(arg, "--grep-debug")) {
                revs->grep_filter.debug = 1;
+       } else if ((argcount = parse_long_opt("reflog-message",
+                                             argv, &optarg))) {
+               add_reflog_grep(revs, optarg);
+               return argcount;
        } else if (!strcmp(arg, "--extended-regexp") || !strcmp(arg, "-E")) {
                revs->grep_filter.regflags |= REG_EXTENDED;
+               revs->reflog_filter.regflags |= REG_EXTENDED;
        } else if (!strcmp(arg, "--regexp-ignore-case") || !strcmp(arg, "-i")) {
                revs->grep_filter.regflags |= REG_ICASE;
+               revs->reflog_filter.regflags |= REG_ICASE;
                DIFF_OPT_SET(&revs->diffopt, PICKAXE_IGNORE_CASE);
        } else if (!strcmp(arg, "--fixed-strings") || !strcmp(arg, "-F")) {
                revs->grep_filter.fixed = 1;
+               revs->reflog_filter.fixed = 1;
        } else if (!strcmp(arg, "--all-match")) {
                revs->grep_filter.all_match = 1;
+               revs->reflog_filter.all_match = 1;
        } else if ((argcount = parse_long_opt("encoding", argv, &optarg))) {
                if (strcmp(optarg, "none"))
                        git_log_output_encoding = xstrdup(optarg);
@@ -1891,6 +1910,7 @@ int setup_revisions(int argc, const char **argv, struct 
rev_info *revs, struct s
        diff_setup_done(&revs->diffopt);
 
        compile_grep_patterns(&revs->grep_filter);
+       compile_grep_patterns(&revs->reflog_filter);
 
        if (revs->reverse && revs->reflog_info)
                die("cannot combine --reverse with --walk-reflogs");
@@ -2242,6 +2262,16 @@ enum commit_action get_commit_action(struct rev_info 
*revs, struct commit *commi
                    ((revs->max_parents >= 0) && (n > revs->max_parents)))
                        return commit_ignore;
        }
+       if (revs->reflog_info &&
+           revs->reflog_filter.pattern_list) {
+               struct strbuf sb = STRBUF_INIT;
+               int ignore;
+               get_reflog_message(&sb, revs->reflog_info);
+               ignore = !grep_buffer(&revs->reflog_filter, sb.buf, sb.len);
+               strbuf_release(&sb);
+               if (ignore)
+                       return commit_ignore;
+       }
        if (!commit_match(commit, revs))
                return commit_ignore;
        if (revs->prune && revs->dense) {
diff --git a/revision.h b/revision.h
index a95bd0b..0ebe34b 100644
--- a/revision.h
+++ b/revision.h
@@ -145,6 +145,7 @@ struct rev_info {
 
        /* Filter by commit log message */
        struct grep_opt grep_filter;
+       struct grep_opt reflog_filter;
 
        /* Display history graph */
        struct git_graph *graph;
-- 
1.7.12.1.406.g6ab07c4

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to