t / t7002-grep.shon commit Merge branch 'jk/maint-break-rename-reduce-memory' into maint (9a6b9cd)
   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
 216test_expect_success 'grep -f, non-existent file' '
 217        test_must_fail git grep -f patterns
 218'
 219
 220cat >expected <<EOF
 221file:foo mmap bar
 222file:foo_mmap bar
 223file:foo_mmap bar mmap
 224file:foo mmap bar_mmap
 225file:foo_mmap bar mmap baz
 226EOF
 227
 228cat >pattern <<EOF
 229mmap
 230EOF
 231
 232test_expect_success 'grep -f, one pattern' '
 233        git grep -f pattern >actual &&
 234        test_cmp expected actual
 235'
 236
 237cat >expected <<EOF
 238file:foo mmap bar
 239file:foo_mmap bar
 240file:foo_mmap bar mmap
 241file:foo mmap bar_mmap
 242file:foo_mmap bar mmap baz
 243t/a/v:vvv
 244t/v:vvv
 245v:vvv
 246EOF
 247
 248cat >patterns <<EOF
 249mmap
 250vvv
 251EOF
 252
 253test_expect_success 'grep -f, multiple patterns' '
 254        git grep -f patterns >actual &&
 255        test_cmp expected actual
 256'
 257
 258cat >expected <<EOF
 259file:foo mmap bar
 260file:foo_mmap bar
 261file:foo_mmap bar mmap
 262file:foo mmap bar_mmap
 263file:foo_mmap bar mmap baz
 264t/a/v:vvv
 265t/v:vvv
 266v:vvv
 267EOF
 268
 269cat >patterns <<EOF
 270
 271mmap
 272
 273vvv
 274
 275EOF
 276
 277test_expect_success 'grep -f, ignore empty lines' '
 278        git grep -f patterns >actual &&
 279        test_cmp expected actual
 280'
 281
 282cat >expected <<EOF
 283y:y yy
 284--
 285z:zzz
 286EOF
 287
 288# Create 1024 file names that sort between "y" and "z" to make sure
 289# the two files are handled by different calls to an external grep.
 290# This depends on MAXARGS in builtin-grep.c being 1024 or less.
 291c32="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"
 292test_expect_success 'grep -C1, hunk mark between files' '
 293        for a in $c32; do for b in $c32; do : >y-$a$b; done; done &&
 294        git add y-?? &&
 295        git grep -C1 "^[yz]" >actual &&
 296        test_cmp expected actual
 297'
 298
 299test_expect_success 'grep -C1 --no-ext-grep, hunk mark between files' '
 300        git grep -C1 --no-ext-grep "^[yz]" >actual &&
 301        test_cmp expected actual
 302'
 303
 304test_expect_success 'log grep setup' '
 305        echo a >>file &&
 306        test_tick &&
 307        GIT_AUTHOR_NAME="With * Asterisk" \
 308        GIT_AUTHOR_EMAIL="xyzzy@frotz.com" \
 309        git commit -a -m "second" &&
 310
 311        echo a >>file &&
 312        test_tick &&
 313        git commit -a -m "third"
 314
 315'
 316
 317test_expect_success 'log grep (1)' '
 318        git log --author=author --pretty=tformat:%s >actual &&
 319        ( echo third ; echo initial ) >expect &&
 320        test_cmp expect actual
 321'
 322
 323test_expect_success 'log grep (2)' '
 324        git log --author=" * " -F --pretty=tformat:%s >actual &&
 325        ( echo second ) >expect &&
 326        test_cmp expect actual
 327'
 328
 329test_expect_success 'log grep (3)' '
 330        git log --author="^A U" --pretty=tformat:%s >actual &&
 331        ( echo third ; echo initial ) >expect &&
 332        test_cmp expect actual
 333'
 334
 335test_expect_success 'log grep (4)' '
 336        git log --author="frotz\.com>$" --pretty=tformat:%s >actual &&
 337        ( echo second ) >expect &&
 338        test_cmp expect actual
 339'
 340
 341test_expect_success 'log grep (5)' '
 342        git log --author=Thor -F --grep=Thu --pretty=tformat:%s >actual &&
 343        ( echo third ; echo initial ) >expect &&
 344        test_cmp expect actual
 345'
 346
 347test_expect_success 'log grep (6)' '
 348        git log --author=-0700  --pretty=tformat:%s >actual &&
 349        >expect &&
 350        test_cmp expect actual
 351'
 352
 353test_expect_success 'grep with CE_VALID file' '
 354        git update-index --assume-unchanged t/t &&
 355        rm t/t &&
 356        test "$(git grep --no-ext-grep test)" = "t/t:test" &&
 357        git update-index --no-assume-unchanged t/t &&
 358        git checkout t/t
 359'
 360
 361cat >expected <<EOF
 362hello.c=#include <stdio.h>
 363hello.c:        return 0;
 364EOF
 365
 366test_expect_success 'grep -p with userdiff' '
 367        git config diff.custom.funcname "^#" &&
 368        echo "hello.c diff=custom" >.gitattributes &&
 369        git grep -p return >actual &&
 370        test_cmp expected actual
 371'
 372
 373cat >expected <<EOF
 374hello.c=int main(int argc, const char **argv)
 375hello.c:        return 0;
 376EOF
 377
 378test_expect_success 'grep -p' '
 379        rm -f .gitattributes &&
 380        git grep -p return >actual &&
 381        test_cmp expected actual
 382'
 383
 384cat >expected <<EOF
 385hello.c-#include <stdio.h>
 386hello.c=int main(int argc, const char **argv)
 387hello.c-{
 388hello.c-        printf("Hello world.\n");
 389hello.c:        return 0;
 390EOF
 391
 392test_expect_success 'grep -p -B5' '
 393        git grep -p -B5 return >actual &&
 394        test_cmp expected actual
 395'
 396
 397test_expect_success 'grep from a subdirectory to search wider area (1)' '
 398        mkdir -p s &&
 399        (
 400                cd s && git grep "x x x" ..
 401        )
 402'
 403
 404test_expect_success 'grep from a subdirectory to search wider area (2)' '
 405        mkdir -p s &&
 406        (
 407                cd s || exit 1
 408                ( git grep xxyyzz .. >out ; echo $? >status )
 409                ! test -s out &&
 410                test 1 = $(cat status)
 411        )
 412'
 413
 414test_done