t / t7002-grep.shon commit Merge branch 'np/maint-1.6.3-deepen' (8e4384f)
   1#!/bin/sh
   2#
   3# Copyright (c) 2006 Junio C Hamano
   4#
   5
   6test_description='git grep various.
   7'
   8
   9. ./test-lib.sh
  10
  11cat >hello.c <<EOF
  12#include <stdio.h>
  13int main(int argc, const char **argv)
  14{
  15        printf("Hello world.\n");
  16        return 0;
  17}
  18EOF
  19
  20test_expect_success setup '
  21        {
  22                echo foo mmap bar
  23                echo foo_mmap bar
  24                echo foo_mmap bar mmap
  25                echo foo mmap bar_mmap
  26                echo foo_mmap bar mmap baz
  27        } >file &&
  28        echo vvv >v &&
  29        echo ww w >w &&
  30        echo x x xx x >x &&
  31        echo y yy >y &&
  32        echo zzz > z &&
  33        mkdir t &&
  34        echo test >t/t &&
  35        echo vvv >t/v &&
  36        mkdir t/a &&
  37        echo vvv >t/a/v &&
  38        git add . &&
  39        test_tick &&
  40        git commit -m initial
  41'
  42
  43test_expect_success 'grep should not segfault with a bad input' '
  44        test_must_fail git grep "("
  45'
  46
  47for H in HEAD ''
  48do
  49        case "$H" in
  50        HEAD)   HC='HEAD:' L='HEAD' ;;
  51        '')     HC= L='in working tree' ;;
  52        esac
  53
  54        test_expect_success "grep -w $L" '
  55                {
  56                        echo ${HC}file:1:foo mmap bar
  57                        echo ${HC}file:3:foo_mmap bar mmap
  58                        echo ${HC}file:4:foo mmap bar_mmap
  59                        echo ${HC}file:5:foo_mmap bar mmap baz
  60                } >expected &&
  61                git grep -n -w -e mmap $H >actual &&
  62                diff expected actual
  63        '
  64
  65        test_expect_success "grep -w $L (w)" '
  66                : >expected &&
  67                ! git grep -n -w -e "^w" >actual &&
  68                test_cmp expected actual
  69        '
  70
  71        test_expect_success "grep -w $L (x)" '
  72                {
  73                        echo ${HC}x:1:x x xx x
  74                } >expected &&
  75                git grep -n -w -e "x xx* x" $H >actual &&
  76                diff expected actual
  77        '
  78
  79        test_expect_success "grep -w $L (y-1)" '
  80                {
  81                        echo ${HC}y:1:y yy
  82                } >expected &&
  83                git grep -n -w -e "^y" $H >actual &&
  84                diff expected actual
  85        '
  86
  87        test_expect_success "grep -w $L (y-2)" '
  88                : >expected &&
  89                if git grep -n -w -e "^y y" $H >actual
  90                then
  91                        echo should not have matched
  92                        cat actual
  93                        false
  94                else
  95                        diff expected actual
  96                fi
  97        '
  98
  99        test_expect_success "grep -w $L (z)" '
 100                : >expected &&
 101                if git grep -n -w -e "^z" $H >actual
 102                then
 103                        echo should not have matched
 104                        cat actual
 105                        false
 106                else
 107                        diff expected actual
 108                fi
 109        '
 110
 111        test_expect_success "grep $L (t-1)" '
 112                echo "${HC}t/t:1:test" >expected &&
 113                git grep -n -e test $H >actual &&
 114                diff expected actual
 115        '
 116
 117        test_expect_success "grep $L (t-2)" '
 118                echo "${HC}t:1:test" >expected &&
 119                (
 120                        cd t &&
 121                        git grep -n -e test $H
 122                ) >actual &&
 123                diff expected actual
 124        '
 125
 126        test_expect_success "grep $L (t-3)" '
 127                echo "${HC}t/t:1:test" >expected &&
 128                (
 129                        cd t &&
 130                        git grep --full-name -n -e test $H
 131                ) >actual &&
 132                diff expected actual
 133        '
 134
 135        test_expect_success "grep -c $L (no /dev/null)" '
 136                ! git grep -c test $H | grep /dev/null
 137        '
 138
 139        test_expect_success "grep --max-depth -1 $L" '
 140                {
 141                        echo ${HC}t/a/v:1:vvv
 142                        echo ${HC}t/v:1:vvv
 143                        echo ${HC}v:1:vvv
 144                } >expected &&
 145                git grep --max-depth -1 -n -e vvv $H >actual &&
 146                test_cmp expected actual
 147        '
 148
 149        test_expect_success "grep --max-depth 0 $L" '
 150                {
 151                        echo ${HC}v:1:vvv
 152                } >expected &&
 153                git grep --max-depth 0 -n -e vvv $H >actual &&
 154                test_cmp expected actual
 155        '
 156
 157        test_expect_success "grep --max-depth 0 -- '*' $L" '
 158                {
 159                        echo ${HC}t/a/v:1:vvv
 160                        echo ${HC}t/v:1:vvv
 161                        echo ${HC}v:1:vvv
 162                } >expected &&
 163                git grep --max-depth 0 -n -e vvv $H -- "*" >actual &&
 164                test_cmp expected actual
 165        '
 166
 167        test_expect_success "grep --max-depth 1 $L" '
 168                {
 169                        echo ${HC}t/v:1:vvv
 170                        echo ${HC}v:1:vvv
 171                } >expected &&
 172                git grep --max-depth 1 -n -e vvv $H >actual &&
 173                test_cmp expected actual
 174        '
 175
 176        test_expect_success "grep --max-depth 0 -- t $L" '
 177                {
 178                        echo ${HC}t/v:1:vvv
 179                } >expected &&
 180                git grep --max-depth 0 -n -e vvv $H -- t >actual &&
 181                test_cmp expected actual
 182        '
 183
 184done
 185
 186cat >expected <<EOF
 187file:foo mmap bar_mmap
 188EOF
 189
 190test_expect_success 'grep -e A --and -e B' '
 191        git grep -e "foo mmap" --and -e bar_mmap >actual &&
 192        test_cmp expected actual
 193'
 194
 195cat >expected <<EOF
 196file:foo_mmap bar mmap
 197file:foo_mmap bar mmap baz
 198EOF
 199
 200
 201test_expect_success 'grep ( -e A --or -e B ) --and -e B' '
 202        git grep \( -e foo_ --or -e baz \) \
 203                --and -e " mmap" >actual &&
 204        test_cmp expected actual
 205'
 206
 207cat >expected <<EOF
 208file:foo mmap bar
 209EOF
 210
 211test_expect_success 'grep -e A --and --not -e B' '
 212        git grep -e "foo mmap" --and --not -e bar_mmap >actual &&
 213        test_cmp expected actual
 214'
 215
 216cat >expected <<EOF
 217y:y yy
 218--
 219z:zzz
 220EOF
 221
 222# Create 1024 file names that sort between "y" and "z" to make sure
 223# the two files are handled by different calls to an external grep.
 224# This depends on MAXARGS in builtin-grep.c being 1024 or less.
 225c32="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"
 226test_expect_success 'grep -C1, hunk mark between files' '
 227        for a in $c32; do for b in $c32; do : >y-$a$b; done; done &&
 228        git add y-?? &&
 229        git grep -C1 "^[yz]" >actual &&
 230        test_cmp expected actual
 231'
 232
 233test_expect_success 'grep -C1 --no-ext-grep, hunk mark between files' '
 234        git grep -C1 --no-ext-grep "^[yz]" >actual &&
 235        test_cmp expected actual
 236'
 237
 238test_expect_success 'log grep setup' '
 239        echo a >>file &&
 240        test_tick &&
 241        GIT_AUTHOR_NAME="With * Asterisk" \
 242        GIT_AUTHOR_EMAIL="xyzzy@frotz.com" \
 243        git commit -a -m "second" &&
 244
 245        echo a >>file &&
 246        test_tick &&
 247        git commit -a -m "third"
 248
 249'
 250
 251test_expect_success 'log grep (1)' '
 252        git log --author=author --pretty=tformat:%s >actual &&
 253        ( echo third ; echo initial ) >expect &&
 254        test_cmp expect actual
 255'
 256
 257test_expect_success 'log grep (2)' '
 258        git log --author=" * " -F --pretty=tformat:%s >actual &&
 259        ( echo second ) >expect &&
 260        test_cmp expect actual
 261'
 262
 263test_expect_success 'log grep (3)' '
 264        git log --author="^A U" --pretty=tformat:%s >actual &&
 265        ( echo third ; echo initial ) >expect &&
 266        test_cmp expect actual
 267'
 268
 269test_expect_success 'log grep (4)' '
 270        git log --author="frotz\.com>$" --pretty=tformat:%s >actual &&
 271        ( echo second ) >expect &&
 272        test_cmp expect actual
 273'
 274
 275test_expect_success 'log grep (5)' '
 276        git log --author=Thor -F --grep=Thu --pretty=tformat:%s >actual &&
 277        ( echo third ; echo initial ) >expect &&
 278        test_cmp expect actual
 279'
 280
 281test_expect_success 'log grep (6)' '
 282        git log --author=-0700  --pretty=tformat:%s >actual &&
 283        >expect &&
 284        test_cmp expect actual
 285'
 286
 287test_expect_success 'grep with CE_VALID file' '
 288        git update-index --assume-unchanged t/t &&
 289        rm t/t &&
 290        test "$(git grep --no-ext-grep test)" = "t/t:test" &&
 291        git update-index --no-assume-unchanged t/t &&
 292        git checkout t/t
 293'
 294
 295cat >expected <<EOF
 296hello.c=#include <stdio.h>
 297hello.c:        return 0;
 298EOF
 299
 300test_expect_success 'grep -p with userdiff' '
 301        git config diff.custom.funcname "^#" &&
 302        echo "hello.c diff=custom" >.gitattributes &&
 303        git grep -p return >actual &&
 304        test_cmp expected actual
 305'
 306
 307cat >expected <<EOF
 308hello.c=int main(int argc, const char **argv)
 309hello.c:        return 0;
 310EOF
 311
 312test_expect_success 'grep -p' '
 313        rm -f .gitattributes &&
 314        git grep -p return >actual &&
 315        test_cmp expected actual
 316'
 317
 318cat >expected <<EOF
 319hello.c-#include <stdio.h>
 320hello.c=int main(int argc, const char **argv)
 321hello.c-{
 322hello.c-        printf("Hello world.\n");
 323hello.c:        return 0;
 324EOF
 325
 326test_expect_success 'grep -p -B5' '
 327        git grep -p -B5 return >actual &&
 328        test_cmp expected actual
 329'
 330
 331test_done