log --grep-reflog: reject the option without -g
authorJunio C Hamano <gitster@pobox.com>
Sat, 29 Sep 2012 18:59:52 +0000 (11:59 -0700)
committerJunio C Hamano <gitster@pobox.com>
Sat, 29 Sep 2012 19:07:04 +0000 (12:07 -0700)
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/rev-list-options.txt
grep.c
grep.h
revision.c
t/t7810-grep.sh

index aa7cd9dcfb3bb85c920de5a491bf73c954616846..ca221060df0772d5cbbce64eb6269cbe9c1c4fc5 100644 (file)
@@ -56,8 +56,8 @@ endif::git-rev-list[]
        Limit the commits output to ones with reflog entries that
        match the specified pattern (regular expression). With
        more than one `--grep-reflog`, commits whose reflog message
-       matches any of the given patterns are chosen. Ignored unless
-       `--walk-reflogs` is given.
+       matches any of the given patterns are chosen.  It is an
+       error to use this option unless `--walk-reflogs` is in use.
 
 --grep=<pattern>::
 
diff --git a/grep.c b/grep.c
index d70dcdf0ef2d012f81c0ff0490961bd46d54312d..edc7776677ed201dbe117c207a680e1f832737e3 100644 (file)
--- a/grep.c
+++ b/grep.c
@@ -64,6 +64,8 @@ void append_header_grep_pattern(struct grep_opt *opt,
 {
        struct grep_pat *p = create_grep_pat(pat, strlen(pat), "header", 0,
                                             GREP_PATTERN_HEAD, field);
+       if (field == GREP_HEADER_REFLOG)
+               opt->use_reflog_filter = 1;
        do_append_grep_pat(&opt->header_tail, p);
 }
 
diff --git a/grep.h b/grep.h
index 6e78b96a2e8a548543bbbd707b079ef849953622..c256ac6e15b22e153623ae3395fb6ffc732b20b9 100644 (file)
--- a/grep.h
+++ b/grep.h
@@ -107,6 +107,7 @@ struct grep_opt {
 #define GREP_BINARY_TEXT       2
        int binary;
        int extended;
+       int use_reflog_filter;
        int pcre;
        int relative;
        int pathname;
index 109bec144398699093312eaf79088834ab198f90..9f5e9df93cc58c72180473474321754e5a4606f5 100644 (file)
@@ -1908,6 +1908,8 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct s
 
        if (revs->reflog_info && revs->graph)
                die("cannot combine --walk-reflogs with --graph");
+       if (!revs->reflog_info && revs->grep_filter.use_reflog_filter)
+               die("cannot use --grep-reflog without --walk-reflogs");
 
        return left;
 }
@@ -2217,12 +2219,19 @@ static int commit_match(struct commit *commit, struct rev_info *opt)
        struct strbuf buf = STRBUF_INIT;
        if (!opt->grep_filter.pattern_list && !opt->grep_filter.header_list)
                return 1;
-       if (opt->reflog_info) {
+
+       /* Prepend "fake" headers as needed */
+       if (opt->grep_filter.use_reflog_filter) {
                strbuf_addstr(&buf, "reflog ");
                get_reflog_message(&buf, opt->reflog_info);
                strbuf_addch(&buf, '\n');
-               strbuf_addstr(&buf, commit->buffer);
        }
+
+       /* Copy the commit to temporary if we are using "fake" headers */
+       if (buf.len)
+               strbuf_addstr(&buf, commit->buffer);
+
+       /* Find either in the commit object, or in the temporary */
        if (buf.len)
                retval = grep_buffer(&opt->grep_filter, buf.buf, buf.len);
        else
index 3a5d0fd77016d58ea11fe205dd0a28857a236632..f698001c996ea20847c574f04dad9a65684f324f 100755 (executable)
@@ -572,6 +572,10 @@ test_expect_success 'log grep (9)' '
        test_cmp expect actual
 '
 
+test_expect_success 'log --grep-reflog can only be used under -g' '
+       test_must_fail git log --grep-reflog="commit: third"
+'
+
 test_expect_success 'log with multiple --grep uses union' '
        git log --grep=i --grep=r --format=%s >actual &&
        {