Code

Merge branch 'tr/maint-word-diff-incomplete-line'
[git.git] / t / t7810-grep.sh
1 #!/bin/sh
2 #
3 # Copyright (c) 2006 Junio C Hamano
4 #
6 test_description='git grep various.
7 '
9 . ./test-lib.sh
11 cat >hello.c <<EOF
12 #include <stdio.h>
13 int main(int argc, const char **argv)
14 {
15         printf("Hello world.\n");
16         return 0;
17         /* char ?? */
18 }
19 EOF
21 test_expect_success setup '
22         {
23                 echo foo mmap bar
24                 echo foo_mmap bar
25                 echo foo_mmap bar mmap
26                 echo foo mmap bar_mmap
27                 echo foo_mmap bar mmap baz
28         } >file &&
29         {
30                 echo Hello world
31                 echo HeLLo world
32                 echo Hello_world
33                 echo HeLLo_world
34         } >hello_world &&
35         {
36                 echo "a+b*c"
37                 echo "a+bc"
38                 echo "abc"
39         } >ab &&
40         echo vvv >v &&
41         echo ww w >w &&
42         echo x x xx x >x &&
43         echo y yy >y &&
44         echo zzz > z &&
45         mkdir t &&
46         echo test >t/t &&
47         echo vvv >t/v &&
48         mkdir t/a &&
49         echo vvv >t/a/v &&
50         git add . &&
51         test_tick &&
52         git commit -m initial
53 '
55 test_expect_success 'grep should not segfault with a bad input' '
56         test_must_fail git grep "("
57 '
59 for H in HEAD ''
60 do
61         case "$H" in
62         HEAD)   HC='HEAD:' L='HEAD' ;;
63         '')     HC= L='in working tree' ;;
64         esac
66         test_expect_success "grep -w $L" '
67                 {
68                         echo ${HC}file:1:foo mmap bar
69                         echo ${HC}file:3:foo_mmap bar mmap
70                         echo ${HC}file:4:foo mmap bar_mmap
71                         echo ${HC}file:5:foo_mmap bar mmap baz
72                 } >expected &&
73                 git -c grep.linenumber=false grep -n -w -e mmap $H >actual &&
74                 test_cmp expected actual
75         '
77         test_expect_success "grep -w $L" '
78                 {
79                         echo ${HC}file:1:foo mmap bar
80                         echo ${HC}file:3:foo_mmap bar mmap
81                         echo ${HC}file:4:foo mmap bar_mmap
82                         echo ${HC}file:5:foo_mmap bar mmap baz
83                 } >expected &&
84                 git -c grep.linenumber=true grep -w -e mmap $H >actual &&
85                 test_cmp expected actual
86         '
88         test_expect_success "grep -w $L" '
89                 {
90                         echo ${HC}file:foo mmap bar
91                         echo ${HC}file:foo_mmap bar mmap
92                         echo ${HC}file:foo mmap bar_mmap
93                         echo ${HC}file:foo_mmap bar mmap baz
94                 } >expected &&
95                 git -c grep.linenumber=true grep --no-line-number -w -e mmap $H >actual &&
96                 test_cmp expected actual
97         '
99         test_expect_success "grep -w $L (w)" '
100                 : >expected &&
101                 test_must_fail git grep -n -w -e "^w" >actual &&
102                 test_cmp expected actual
103         '
105         test_expect_success "grep -w $L (x)" '
106                 {
107                         echo ${HC}x:1:x x xx x
108                 } >expected &&
109                 git grep -n -w -e "x xx* x" $H >actual &&
110                 test_cmp expected actual
111         '
113         test_expect_success "grep -w $L (y-1)" '
114                 {
115                         echo ${HC}y:1:y yy
116                 } >expected &&
117                 git grep -n -w -e "^y" $H >actual &&
118                 test_cmp expected actual
119         '
121         test_expect_success "grep -w $L (y-2)" '
122                 : >expected &&
123                 if git grep -n -w -e "^y y" $H >actual
124                 then
125                         echo should not have matched
126                         cat actual
127                         false
128                 else
129                         test_cmp expected actual
130                 fi
131         '
133         test_expect_success "grep -w $L (z)" '
134                 : >expected &&
135                 if git grep -n -w -e "^z" $H >actual
136                 then
137                         echo should not have matched
138                         cat actual
139                         false
140                 else
141                         test_cmp expected actual
142                 fi
143         '
145         test_expect_success "grep $L (t-1)" '
146                 echo "${HC}t/t:1:test" >expected &&
147                 git grep -n -e test $H >actual &&
148                 test_cmp expected actual
149         '
151         test_expect_success "grep $L (t-2)" '
152                 echo "${HC}t:1:test" >expected &&
153                 (
154                         cd t &&
155                         git grep -n -e test $H
156                 ) >actual &&
157                 test_cmp expected actual
158         '
160         test_expect_success "grep $L (t-3)" '
161                 echo "${HC}t/t:1:test" >expected &&
162                 (
163                         cd t &&
164                         git grep --full-name -n -e test $H
165                 ) >actual &&
166                 test_cmp expected actual
167         '
169         test_expect_success "grep -c $L (no /dev/null)" '
170                 ! git grep -c test $H | grep /dev/null
171         '
173         test_expect_success "grep --max-depth -1 $L" '
174                 {
175                         echo ${HC}t/a/v:1:vvv
176                         echo ${HC}t/v:1:vvv
177                         echo ${HC}v:1:vvv
178                 } >expected &&
179                 git grep --max-depth -1 -n -e vvv $H >actual &&
180                 test_cmp expected actual
181         '
183         test_expect_success "grep --max-depth 0 $L" '
184                 {
185                         echo ${HC}v:1:vvv
186                 } >expected &&
187                 git grep --max-depth 0 -n -e vvv $H >actual &&
188                 test_cmp expected actual
189         '
191         test_expect_success "grep --max-depth 0 -- '*' $L" '
192                 {
193                         echo ${HC}t/a/v:1:vvv
194                         echo ${HC}t/v:1:vvv
195                         echo ${HC}v:1:vvv
196                 } >expected &&
197                 git grep --max-depth 0 -n -e vvv $H -- "*" >actual &&
198                 test_cmp expected actual
199         '
201         test_expect_success "grep --max-depth 1 $L" '
202                 {
203                         echo ${HC}t/v:1:vvv
204                         echo ${HC}v:1:vvv
205                 } >expected &&
206                 git grep --max-depth 1 -n -e vvv $H >actual &&
207                 test_cmp expected actual
208         '
210         test_expect_success "grep --max-depth 0 -- t $L" '
211                 {
212                         echo ${HC}t/v:1:vvv
213                 } >expected &&
214                 git grep --max-depth 0 -n -e vvv $H -- t >actual &&
215                 test_cmp expected actual
216         '
218         test_expect_success "grep --max-depth 0 -- . t $L" '
219                 {
220                         echo ${HC}t/v:1:vvv
221                         echo ${HC}v:1:vvv
222                 } >expected &&
223                 git grep --max-depth 0 -n -e vvv $H -- . t >actual &&
224                 test_cmp expected actual
225         '
227         test_expect_success "grep --max-depth 0 -- t . $L" '
228                 {
229                         echo ${HC}t/v:1:vvv
230                         echo ${HC}v:1:vvv
231                 } >expected &&
232                 git grep --max-depth 0 -n -e vvv $H -- t . >actual &&
233                 test_cmp expected actual
234         '
235         test_expect_success "grep $L with grep.extendedRegexp=false" '
236                 echo "ab:a+bc" >expected &&
237                 git -c grep.extendedRegexp=false grep "a+b*c" ab >actual &&
238                 test_cmp expected actual
239         '
241         test_expect_success "grep $L with grep.extendedRegexp=true" '
242                 echo "ab:abc" >expected &&
243                 git -c grep.extendedRegexp=true grep "a+b*c" ab >actual &&
244                 test_cmp expected actual
245         '
246 done
248 cat >expected <<EOF
249 file:foo mmap bar_mmap
250 EOF
252 test_expect_success 'grep -e A --and -e B' '
253         git grep -e "foo mmap" --and -e bar_mmap >actual &&
254         test_cmp expected actual
257 cat >expected <<EOF
258 file:foo_mmap bar mmap
259 file:foo_mmap bar mmap baz
260 EOF
263 test_expect_success 'grep ( -e A --or -e B ) --and -e B' '
264         git grep \( -e foo_ --or -e baz \) \
265                 --and -e " mmap" >actual &&
266         test_cmp expected actual
269 cat >expected <<EOF
270 file:foo mmap bar
271 EOF
273 test_expect_success 'grep -e A --and --not -e B' '
274         git grep -e "foo mmap" --and --not -e bar_mmap >actual &&
275         test_cmp expected actual
278 test_expect_success 'grep should ignore GREP_OPTIONS' '
279         GREP_OPTIONS=-v git grep " mmap bar\$" >actual &&
280         test_cmp expected actual
283 test_expect_success 'grep -f, non-existent file' '
284         test_must_fail git grep -f patterns
287 cat >expected <<EOF
288 file:foo mmap bar
289 file:foo_mmap bar
290 file:foo_mmap bar mmap
291 file:foo mmap bar_mmap
292 file:foo_mmap bar mmap baz
293 EOF
295 cat >pattern <<EOF
296 mmap
297 EOF
299 test_expect_success 'grep -f, one pattern' '
300         git grep -f pattern >actual &&
301         test_cmp expected actual
304 cat >expected <<EOF
305 file:foo mmap bar
306 file:foo_mmap bar
307 file:foo_mmap bar mmap
308 file:foo mmap bar_mmap
309 file:foo_mmap bar mmap baz
310 t/a/v:vvv
311 t/v:vvv
312 v:vvv
313 EOF
315 cat >patterns <<EOF
316 mmap
317 vvv
318 EOF
320 test_expect_success 'grep -f, multiple patterns' '
321         git grep -f patterns >actual &&
322         test_cmp expected actual
325 cat >expected <<EOF
326 file:foo mmap bar
327 file:foo_mmap bar
328 file:foo_mmap bar mmap
329 file:foo mmap bar_mmap
330 file:foo_mmap bar mmap baz
331 t/a/v:vvv
332 t/v:vvv
333 v:vvv
334 EOF
336 cat >patterns <<EOF
338 mmap
340 vvv
342 EOF
344 test_expect_success 'grep -f, ignore empty lines' '
345         git grep -f patterns >actual &&
346         test_cmp expected actual
349 test_expect_success 'grep -f, ignore empty lines, read patterns from stdin' '
350         git grep -f - <patterns >actual &&
351         test_cmp expected actual
354 cat >expected <<EOF
355 y:y yy
356 --
357 z:zzz
358 EOF
360 test_expect_success 'grep -q, silently report matches' '
361         >empty &&
362         git grep -q mmap >actual &&
363         test_cmp empty actual &&
364         test_must_fail git grep -q qfwfq >actual &&
365         test_cmp empty actual
368 # Create 1024 file names that sort between "y" and "z" to make sure
369 # the two files are handled by different calls to an external grep.
370 # This depends on MAXARGS in builtin-grep.c being 1024 or less.
371 c32="0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v"
372 test_expect_success 'grep -C1, hunk mark between files' '
373         for a in $c32; do for b in $c32; do : >y-$a$b; done; done &&
374         git add y-?? &&
375         git grep -C1 "^[yz]" >actual &&
376         test_cmp expected actual
379 test_expect_success 'grep -C1 hunk mark between files' '
380         git grep -C1 "^[yz]" >actual &&
381         test_cmp expected actual
384 test_expect_success 'log grep setup' '
385         echo a >>file &&
386         test_tick &&
387         GIT_AUTHOR_NAME="With * Asterisk" \
388         GIT_AUTHOR_EMAIL="xyzzy@frotz.com" \
389         git commit -a -m "second" &&
391         echo a >>file &&
392         test_tick &&
393         git commit -a -m "third" &&
395         echo a >>file &&
396         test_tick &&
397         GIT_AUTHOR_NAME="Night Fall" \
398         GIT_AUTHOR_EMAIL="nitfol@frobozz.com" \
399         git commit -a -m "fourth"
402 test_expect_success 'log grep (1)' '
403         git log --author=author --pretty=tformat:%s >actual &&
404         ( echo third ; echo initial ) >expect &&
405         test_cmp expect actual
408 test_expect_success 'log grep (2)' '
409         git log --author=" * " -F --pretty=tformat:%s >actual &&
410         ( echo second ) >expect &&
411         test_cmp expect actual
414 test_expect_success 'log grep (3)' '
415         git log --author="^A U" --pretty=tformat:%s >actual &&
416         ( echo third ; echo initial ) >expect &&
417         test_cmp expect actual
420 test_expect_success 'log grep (4)' '
421         git log --author="frotz\.com>$" --pretty=tformat:%s >actual &&
422         ( echo second ) >expect &&
423         test_cmp expect actual
426 test_expect_success 'log grep (5)' '
427         git log --author=Thor -F --pretty=tformat:%s >actual &&
428         ( echo third ; echo initial ) >expect &&
429         test_cmp expect actual
432 test_expect_success 'log grep (6)' '
433         git log --author=-0700  --pretty=tformat:%s >actual &&
434         >expect &&
435         test_cmp expect actual
438 test_expect_success 'log --grep --author implicitly uses all-match' '
439         # grep matches initial and second but not third
440         # author matches only initial and third
441         git log --author="A U Thor" --grep=s --grep=l --format=%s >actual &&
442         echo initial >expect &&
443         test_cmp expect actual
446 test_expect_success 'log with multiple --author uses union' '
447         git log --author="Thor" --author="Aster" --format=%s >actual &&
448         {
449             echo third && echo second && echo initial
450         } >expect &&
451         test_cmp expect actual
454 test_expect_success 'log with --grep and multiple --author uses all-match' '
455         git log --author="Thor" --author="Night" --grep=i --format=%s >actual &&
456         {
457             echo third && echo initial
458         } >expect &&
459         test_cmp expect actual
462 test_expect_success 'log with --grep and multiple --author uses all-match' '
463         git log --author="Thor" --author="Night" --grep=q --format=%s >actual &&
464         >expect &&
465         test_cmp expect actual
468 test_expect_success 'grep with CE_VALID file' '
469         git update-index --assume-unchanged t/t &&
470         rm t/t &&
471         test "$(git grep test)" = "t/t:test" &&
472         git update-index --no-assume-unchanged t/t &&
473         git checkout t/t
476 cat >expected <<EOF
477 hello.c=#include <stdio.h>
478 hello.c:        return 0;
479 EOF
481 test_expect_success 'grep -p with userdiff' '
482         git config diff.custom.funcname "^#" &&
483         echo "hello.c diff=custom" >.gitattributes &&
484         git grep -p return >actual &&
485         test_cmp expected actual
488 cat >expected <<EOF
489 hello.c=int main(int argc, const char **argv)
490 hello.c:        return 0;
491 EOF
493 test_expect_success 'grep -p' '
494         rm -f .gitattributes &&
495         git grep -p return >actual &&
496         test_cmp expected actual
499 cat >expected <<EOF
500 hello.c-#include <stdio.h>
501 hello.c=int main(int argc, const char **argv)
502 hello.c-{
503 hello.c-        printf("Hello world.\n");
504 hello.c:        return 0;
505 EOF
507 test_expect_success 'grep -p -B5' '
508         git grep -p -B5 return >actual &&
509         test_cmp expected actual
512 cat >expected <<EOF
513 hello.c=int main(int argc, const char **argv)
514 hello.c-{
515 hello.c-        printf("Hello world.\n");
516 hello.c:        return 0;
517 hello.c-        /* char ?? */
518 hello.c-}
519 EOF
521 test_expect_success 'grep -W' '
522         git grep -W return >actual &&
523         test_cmp expected actual
526 cat >expected <<EOF
527 hello.c=        printf("Hello world.\n");
528 hello.c:        return 0;
529 hello.c-        /* char ?? */
530 EOF
532 test_expect_success 'grep -W with userdiff' '
533         test_when_finished "rm -f .gitattributes" &&
534         git config diff.custom.xfuncname "(printf.*|})$" &&
535         echo "hello.c diff=custom" >.gitattributes &&
536         git grep -W return >actual &&
537         test_cmp expected actual
540 test_expect_success 'grep from a subdirectory to search wider area (1)' '
541         mkdir -p s &&
542         (
543                 cd s && git grep "x x x" ..
544         )
547 test_expect_success 'grep from a subdirectory to search wider area (2)' '
548         mkdir -p s &&
549         (
550                 cd s || exit 1
551                 ( git grep xxyyzz .. >out ; echo $? >status )
552                 ! test -s out &&
553                 test 1 = $(cat status)
554         )
557 cat >expected <<EOF
558 hello.c:int main(int argc, const char **argv)
559 EOF
561 test_expect_success 'grep -Fi' '
562         git grep -Fi "CHAR *" >actual &&
563         test_cmp expected actual
566 test_expect_success 'outside of git repository' '
567         rm -fr non &&
568         mkdir -p non/git/sub &&
569         echo hello >non/git/file1 &&
570         echo world >non/git/sub/file2 &&
571         {
572                 echo file1:hello &&
573                 echo sub/file2:world
574         } >non/expect.full &&
575         echo file2:world >non/expect.sub &&
576         (
577                 GIT_CEILING_DIRECTORIES="$(pwd)/non/git" &&
578                 export GIT_CEILING_DIRECTORIES &&
579                 cd non/git &&
580                 test_must_fail git grep o &&
581                 git grep --no-index o >../actual.full &&
582                 test_cmp ../expect.full ../actual.full
583                 cd sub &&
584                 test_must_fail git grep o &&
585                 git grep --no-index o >../../actual.sub &&
586                 test_cmp ../../expect.sub ../../actual.sub
587         ) &&
589         echo ".*o*" >non/git/.gitignore &&
590         (
591                 GIT_CEILING_DIRECTORIES="$(pwd)/non/git" &&
592                 export GIT_CEILING_DIRECTORIES &&
593                 cd non/git &&
594                 test_must_fail git grep o &&
595                 git grep --no-index --exclude-standard o >../actual.full &&
596                 test_cmp ../expect.full ../actual.full &&
598                 {
599                         echo ".gitignore:.*o*"
600                         cat ../expect.full
601                 } >../expect.with.ignored &&
602                 git grep --no-index --no-exclude o >../actual.full &&
603                 test_cmp ../expect.with.ignored ../actual.full
604         )
607 test_expect_success 'inside git repository but with --no-index' '
608         rm -fr is &&
609         mkdir -p is/git/sub &&
610         echo hello >is/git/file1 &&
611         echo world >is/git/sub/file2 &&
612         echo ".*o*" >is/git/.gitignore &&
613         {
614                 echo file1:hello &&
615                 echo sub/file2:world
616         } >is/expect.unignored &&
617         {
618                 echo ".gitignore:.*o*" &&
619                 cat is/expect.unignored
620         } >is/expect.full &&
621         : >is/expect.empty &&
622         echo file2:world >is/expect.sub &&
623         (
624                 cd is/git &&
625                 git init &&
626                 test_must_fail git grep o >../actual.full &&
627                 test_cmp ../expect.empty ../actual.full &&
629                 git grep --untracked o >../actual.unignored &&
630                 test_cmp ../expect.unignored ../actual.unignored &&
632                 git grep --no-index o >../actual.full &&
633                 test_cmp ../expect.full ../actual.full &&
635                 git grep --no-index --exclude-standard o >../actual.unignored &&
636                 test_cmp ../expect.unignored ../actual.unignored &&
638                 cd sub &&
639                 test_must_fail git grep o >../../actual.sub &&
640                 test_cmp ../../expect.empty ../../actual.sub &&
642                 git grep --no-index o >../../actual.sub &&
643                 test_cmp ../../expect.sub ../../actual.sub &&
645                 git grep --untracked o >../../actual.sub &&
646                 test_cmp ../../expect.sub ../../actual.sub
647         )
650 test_expect_success 'setup double-dash tests' '
651 cat >double-dash <<EOF &&
652 --
653 ->
654 other
655 EOF
656 git add double-dash
659 cat >expected <<EOF
660 double-dash:->
661 EOF
662 test_expect_success 'grep -- pattern' '
663         git grep -- "->" >actual &&
664         test_cmp expected actual
666 test_expect_success 'grep -- pattern -- pathspec' '
667         git grep -- "->" -- double-dash >actual &&
668         test_cmp expected actual
670 test_expect_success 'grep -e pattern -- path' '
671         git grep -e "->" -- double-dash >actual &&
672         test_cmp expected actual
675 cat >expected <<EOF
676 double-dash:--
677 EOF
678 test_expect_success 'grep -e -- -- path' '
679         git grep -e -- -- double-dash >actual &&
680         test_cmp expected actual
683 cat >expected <<EOF
684 hello.c:int main(int argc, const char **argv)
685 hello.c:        printf("Hello world.\n");
686 EOF
688 test_expect_success LIBPCRE 'grep --perl-regexp pattern' '
689         git grep --perl-regexp "\p{Ps}.*?\p{Pe}" hello.c >actual &&
690         test_cmp expected actual
693 test_expect_success LIBPCRE 'grep -P pattern' '
694         git grep -P "\p{Ps}.*?\p{Pe}" hello.c >actual &&
695         test_cmp expected actual
698 test_expect_success 'grep pattern with grep.extendedRegexp=true' '
699         >empty &&
700         test_must_fail git -c grep.extendedregexp=true \
701                 grep "\p{Ps}.*?\p{Pe}" hello.c >actual &&
702         test_cmp empty actual
705 test_expect_success LIBPCRE 'grep -P pattern with grep.extendedRegexp=true' '
706         git -c grep.extendedregexp=true \
707                 grep -P "\p{Ps}.*?\p{Pe}" hello.c >actual &&
708         test_cmp expected actual
711 test_expect_success LIBPCRE 'grep -P -v pattern' '
712         {
713                 echo "ab:a+b*c"
714                 echo "ab:a+bc"
715         } >expected &&
716         git grep -P -v "abc" ab >actual &&
717         test_cmp expected actual
720 test_expect_success LIBPCRE 'grep -P -i pattern' '
721         cat >expected <<-EOF &&
722         hello.c:        printf("Hello world.\n");
723         EOF
724         git grep -P -i "PRINTF\([^\d]+\)" hello.c >actual &&
725         test_cmp expected actual
728 test_expect_success LIBPCRE 'grep -P -w pattern' '
729         {
730                 echo "hello_world:Hello world"
731                 echo "hello_world:HeLLo world"
732         } >expected &&
733         git grep -P -w "He((?i)ll)o" hello_world >actual &&
734         test_cmp expected actual
737 test_expect_success 'grep -G invalidpattern properly dies ' '
738         test_must_fail git grep -G "a["
741 test_expect_success 'grep -E invalidpattern properly dies ' '
742         test_must_fail git grep -E "a["
745 test_expect_success LIBPCRE 'grep -P invalidpattern properly dies ' '
746         test_must_fail git grep -P "a["
749 test_expect_success 'grep -G -E -F pattern' '
750         echo "ab:a+b*c" >expected &&
751         git grep -G -E -F "a+b*c" ab >actual &&
752         test_cmp expected actual
755 test_expect_success 'grep -E -F -G pattern' '
756         echo "ab:a+bc" >expected &&
757         git grep -E -F -G "a+b*c" ab >actual &&
758         test_cmp expected actual
761 test_expect_success 'grep -F -G -E pattern' '
762         echo "ab:abc" >expected &&
763         git grep -F -G -E "a+b*c" ab >actual &&
764         test_cmp expected actual
767 test_expect_success 'grep -G -F -P -E pattern' '
768         >empty &&
769         test_must_fail git grep -G -F -P -E "a\x{2b}b\x{2a}c" ab >actual &&
770         test_cmp empty actual
773 test_expect_success LIBPCRE 'grep -G -F -E -P pattern' '
774         echo "ab:a+b*c" >expected &&
775         git grep -G -F -E -P "a\x{2b}b\x{2a}c" ab >actual &&
776         test_cmp expected actual
779 test_config() {
780         git config "$1" "$2" &&
781         test_when_finished "git config --unset $1"
784 cat >expected <<EOF
785 hello.c<RED>:<RESET>int main(int argc, const char **argv)
786 hello.c<RED>-<RESET>{
787 <RED>--<RESET>
788 hello.c<RED>:<RESET>    /* char ?? */
789 hello.c<RED>-<RESET>}
790 <RED>--<RESET>
791 hello_world<RED>:<RESET>Hello_world
792 hello_world<RED>-<RESET>HeLLo_world
793 EOF
795 test_expect_success 'grep --color, separator' '
796         test_config color.grep.context          normal &&
797         test_config color.grep.filename         normal &&
798         test_config color.grep.function         normal &&
799         test_config color.grep.linenumber       normal &&
800         test_config color.grep.match            normal &&
801         test_config color.grep.selected         normal &&
802         test_config color.grep.separator        red &&
804         git grep --color=always -A1 -e char -e lo_w hello.c hello_world |
805         test_decode_color >actual &&
806         test_cmp expected actual
809 cat >expected <<EOF
810 hello.c:int main(int argc, const char **argv)
811 hello.c:        /* char ?? */
813 hello_world:Hello_world
814 EOF
816 test_expect_success 'grep --break' '
817         git grep --break -e char -e lo_w hello.c hello_world >actual &&
818         test_cmp expected actual
821 cat >expected <<EOF
822 hello.c:int main(int argc, const char **argv)
823 hello.c-{
824 --
825 hello.c:        /* char ?? */
826 hello.c-}
828 hello_world:Hello_world
829 hello_world-HeLLo_world
830 EOF
832 test_expect_success 'grep --break with context' '
833         git grep --break -A1 -e char -e lo_w hello.c hello_world >actual &&
834         test_cmp expected actual
837 cat >expected <<EOF
838 hello.c
839 int main(int argc, const char **argv)
840         /* char ?? */
841 hello_world
842 Hello_world
843 EOF
845 test_expect_success 'grep --heading' '
846         git grep --heading -e char -e lo_w hello.c hello_world >actual &&
847         test_cmp expected actual
850 cat >expected <<EOF
851 <BOLD;GREEN>hello.c<RESET>
852 2:int main(int argc, const <BLACK;BYELLOW>char<RESET> **argv)
853 6:      /* <BLACK;BYELLOW>char<RESET> ?? */
855 <BOLD;GREEN>hello_world<RESET>
856 3:Hel<BLACK;BYELLOW>lo_w<RESET>orld
857 EOF
859 test_expect_success 'mimic ack-grep --group' '
860         test_config color.grep.context          normal &&
861         test_config color.grep.filename         "bold green" &&
862         test_config color.grep.function         normal &&
863         test_config color.grep.linenumber       normal &&
864         test_config color.grep.match            "black yellow" &&
865         test_config color.grep.selected         normal &&
866         test_config color.grep.separator        normal &&
868         git grep --break --heading -n --color \
869                 -e char -e lo_w hello.c hello_world |
870         test_decode_color >actual &&
871         test_cmp expected actual
874 test_done