grep: load funcname patterns for -W
authorThomas Rast <trast@student.ethz.ch>
Mon, 12 Dec 2011 21:16:06 +0000 (22:16 +0100)
committerJunio C Hamano <gitster@pobox.com>
Mon, 12 Dec 2011 23:45:42 +0000 (15:45 -0800)
git-grep avoids loading the funcname patterns unless they are needed.
ba8ea74 (grep: add option to show whole function as context,
2011-08-01) forgot to extend this test also to the new funcbody
feature.  Do so.

The catch is that we also have to disable threading when using
userdiff, as explained in grep_threads_ok().  So we must be careful to
introduce the same test there.

Signed-off-by: Thomas Rast <trast@student.ethz.ch>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
grep.c
t/t7810-grep.sh

diff --git a/grep.c b/grep.c
index b29d09c7f6a5a7f9621fb5287eb07e72ece7f484..7a070e97c462849dbff18c0e18a96591a6126e1f 100644 (file)
--- a/grep.c
+++ b/grep.c
@@ -948,8 +948,8 @@ int grep_threads_ok(const struct grep_opt *opt)
         * machinery in grep_buffer_1. The attribute code is not
         * thread safe, so we disable the use of threads.
         */
-       if (opt->funcname && !opt->unmatch_name_only && !opt->status_only &&
-           !opt->name_only)
+       if ((opt->funcname || opt->funcbody)
+           && !opt->unmatch_name_only && !opt->status_only && !opt->name_only)
                return 0;
 
        return 1;
@@ -1008,7 +1008,8 @@ static int grep_buffer_1(struct grep_opt *opt, const char *name,
        }
 
        memset(&xecfg, 0, sizeof(xecfg));
-       if (opt->funcname && !opt->unmatch_name_only && !opt->status_only &&
+       if ((opt->funcname || opt->funcbody)
+           && !opt->unmatch_name_only && !opt->status_only &&
            !opt->name_only && !binary_match_only && !collect_hits) {
                struct userdiff_driver *drv = userdiff_find_by_path(name);
                if (drv && drv->funcname.pattern) {
index 81263b78516cbe2949ad7e426a5e44af188cccdd..7ba5b16f99443c0dc5aaff8fbb4ce4ad8874a27c 100755 (executable)
@@ -523,6 +523,20 @@ test_expect_success 'grep -W' '
        test_cmp expected actual
 '
 
+cat >expected <<EOF
+hello.c=       printf("Hello world.\n");
+hello.c:       return 0;
+hello.c-       /* char ?? */
+EOF
+
+test_expect_success 'grep -W with userdiff' '
+       test_when_finished "rm -f .gitattributes" &&
+       git config diff.custom.xfuncname "(printf.*|})$" &&
+       echo "hello.c diff=custom" >.gitattributes &&
+       git grep -W return >actual &&
+       test_cmp expected actual
+'
+
 test_expect_success 'grep from a subdirectory to search wider area (1)' '
        mkdir -p s &&
        (