t / t7811-grep-open.shon commit Merge branch 'mo/perl-bidi-pipe-envfix' (8e949a4)
   1#!/bin/sh
   2
   3test_description='git grep --open-files-in-pager
   4'
   5
   6. ./test-lib.sh
   7. "$TEST_DIRECTORY"/lib-pager.sh
   8unset PAGER GIT_PAGER
   9
  10test_expect_success 'setup' '
  11        test_commit initial grep.h "
  12enum grep_pat_token {
  13        GREP_PATTERN,
  14        GREP_PATTERN_HEAD,
  15        GREP_PATTERN_BODY,
  16        GREP_AND,
  17        GREP_OPEN_PAREN,
  18        GREP_CLOSE_PAREN,
  19        GREP_NOT,
  20        GREP_OR,
  21};" &&
  22
  23        test_commit add-user revision.c "
  24        }
  25        if (seen_dashdash)
  26                read_pathspec_from_stdin(revs, &sb, prune);
  27        strbuf_release(&sb);
  28}
  29
  30static void add_grep(struct rev_info *revs, const char *ptn, enum grep_pat_token what)
  31{
  32        append_grep_pattern(&revs->grep_filter, ptn, \"command line\", 0, what);
  33" &&
  34
  35        mkdir subdir &&
  36        test_commit subdir subdir/grep.c "enum grep_pat_token" &&
  37
  38        test_commit uninteresting unrelated "hello, world" &&
  39
  40        echo GREP_PATTERN >untracked
  41'
  42
  43test_expect_success SIMPLEPAGER 'git grep -O' '
  44        cat >$less <<-\EOF &&
  45        #!/bin/sh
  46        printf "%s\n" "$@" >pager-args
  47        EOF
  48        chmod +x $less &&
  49        cat >expect.less <<-\EOF &&
  50        +/*GREP_PATTERN
  51        grep.h
  52        EOF
  53        echo grep.h >expect.notless &&
  54        >empty &&
  55
  56        PATH=.:$PATH git grep -O GREP_PATTERN >out &&
  57        {
  58                test_cmp expect.less pager-args ||
  59                test_cmp expect.notless pager-args
  60        } &&
  61        test_cmp empty out
  62'
  63
  64test_expect_success 'git grep -O --cached' '
  65        test_must_fail git grep --cached -O GREP_PATTERN >out 2>msg &&
  66        grep open-files-in-pager msg
  67'
  68
  69test_expect_success 'git grep -O --no-index' '
  70        rm -f expect.less pager-args out &&
  71        cat >expect <<-\EOF &&
  72        grep.h
  73        untracked
  74        EOF
  75        >empty &&
  76
  77        (
  78                GIT_PAGER='\''printf "%s\n" >pager-args'\'' &&
  79                export GIT_PAGER &&
  80                git grep --no-index -O GREP_PATTERN >out
  81        ) &&
  82        test_cmp expect pager-args &&
  83        test_cmp empty out
  84'
  85
  86test_expect_success 'setup: fake "less"' '
  87        cat >less <<-\EOF &&
  88        #!/bin/sh
  89        printf "%s\n" "$@" >actual
  90        EOF
  91        chmod +x less
  92'
  93
  94test_expect_success 'git grep -O jumps to line in less' '
  95        cat >expect <<-\EOF &&
  96        +/*GREP_PATTERN
  97        grep.h
  98        EOF
  99        >empty &&
 100
 101        GIT_PAGER=./less git grep -O GREP_PATTERN >out &&
 102        test_cmp expect actual &&
 103        test_cmp empty out &&
 104
 105        git grep -O./less GREP_PATTERN >out2 &&
 106        test_cmp expect actual &&
 107        test_cmp empty out2
 108'
 109
 110test_expect_success 'modified file' '
 111        rm -f actual &&
 112        cat >expect <<-\EOF &&
 113        +/*enum grep_pat_token
 114        grep.h
 115        revision.c
 116        subdir/grep.c
 117        unrelated
 118        EOF
 119        >empty &&
 120
 121        echo "enum grep_pat_token" >unrelated &&
 122        test_when_finished "git checkout HEAD unrelated" &&
 123        GIT_PAGER=./less git grep -F -O "enum grep_pat_token" >out &&
 124        test_cmp expect actual &&
 125        test_cmp empty out
 126'
 127
 128test_config() {
 129        git config "$1" "$2" &&
 130        test_when_finished "git config --unset $1"
 131}
 132
 133test_expect_success 'copes with color settings' '
 134        rm -f actual &&
 135        echo grep.h >expect &&
 136        test_config color.grep always &&
 137        test_config color.grep.filename yellow &&
 138        test_config color.grep.separator green &&
 139        git grep -O'\''printf "%s\n" >actual'\'' GREP_AND &&
 140        test_cmp expect actual
 141'
 142
 143test_expect_success 'run from subdir' '
 144        rm -f actual &&
 145        echo grep.c >expect &&
 146        >empty &&
 147
 148        (
 149                cd subdir &&
 150                export GIT_PAGER &&
 151                GIT_PAGER='\''printf "%s\n" >../args'\'' &&
 152                git grep -O "enum grep_pat_token" >../out &&
 153                git grep -O"pwd >../dir; :" "enum grep_pat_token" >../out2
 154        ) &&
 155        case $(cat dir) in
 156        *subdir)
 157                : good
 158                ;;
 159        *)
 160                false
 161                ;;
 162        esac &&
 163        test_cmp expect args &&
 164        test_cmp empty out &&
 165        test_cmp empty out2
 166'
 167
 168test_done