| 1 | #!/bin/sh |
| 2 | |
| 3 | test_description='git grep in binary files' |
| 4 | |
| 5 | . ./test-lib.sh |
| 6 | |
| 7 | test_expect_success 'setup' " |
| 8 | echo 'binaryQfileQm[*]cQ*æQð' | q_to_nul >a && |
| 9 | git add a && |
| 10 | git commit -m. |
| 11 | " |
| 12 | |
| 13 | test_expect_success 'git grep ina a' ' |
| 14 | echo Binary file a matches >expect && |
| 15 | git grep ina a >actual && |
| 16 | test_cmp expect actual |
| 17 | ' |
| 18 | |
| 19 | test_expect_success 'git grep -ah ina a' ' |
| 20 | git grep -ah ina a >actual && |
| 21 | test_cmp a actual |
| 22 | ' |
| 23 | |
| 24 | test_expect_success 'git grep -I ina a' ' |
| 25 | test_must_fail git grep -I ina a >actual && |
| 26 | test_must_be_empty actual |
| 27 | ' |
| 28 | |
| 29 | test_expect_success 'git grep -c ina a' ' |
| 30 | echo a:1 >expect && |
| 31 | git grep -c ina a >actual && |
| 32 | test_cmp expect actual |
| 33 | ' |
| 34 | |
| 35 | test_expect_success 'git grep -l ina a' ' |
| 36 | echo a >expect && |
| 37 | git grep -l ina a >actual && |
| 38 | test_cmp expect actual |
| 39 | ' |
| 40 | |
| 41 | test_expect_success 'git grep -L bar a' ' |
| 42 | echo a >expect && |
| 43 | git grep -L bar a >actual && |
| 44 | test_cmp expect actual |
| 45 | ' |
| 46 | |
| 47 | test_expect_success 'git grep -q ina a' ' |
| 48 | git grep -q ina a >actual && |
| 49 | test_must_be_empty actual |
| 50 | ' |
| 51 | |
| 52 | test_expect_success 'git grep -F ile a' ' |
| 53 | git grep -F ile a |
| 54 | ' |
| 55 | |
| 56 | test_expect_success 'git grep -Fi iLE a' ' |
| 57 | git grep -Fi iLE a |
| 58 | ' |
| 59 | |
| 60 | # This test actually passes on platforms where regexec() supports the |
| 61 | # flag REG_STARTEND. |
| 62 | test_expect_success 'git grep ile a' ' |
| 63 | git grep ile a |
| 64 | ' |
| 65 | |
| 66 | test_expect_failure !CYGWIN,!MACOS 'git grep .fi a' ' |
| 67 | git grep .fi a |
| 68 | ' |
| 69 | |
| 70 | test_expect_success 'grep respects binary diff attribute' ' |
| 71 | echo text >t && |
| 72 | git add t && |
| 73 | echo t:text >expect && |
| 74 | git grep text t >actual && |
| 75 | test_cmp expect actual && |
| 76 | echo "t -diff" >.gitattributes && |
| 77 | echo "Binary file t matches" >expect && |
| 78 | git grep text t >actual && |
| 79 | test_cmp expect actual |
| 80 | ' |
| 81 | |
| 82 | test_expect_success 'grep --cached respects binary diff attribute' ' |
| 83 | git grep --cached text t >actual && |
| 84 | test_cmp expect actual |
| 85 | ' |
| 86 | |
| 87 | test_expect_success 'grep --cached respects binary diff attribute (2)' ' |
| 88 | git add .gitattributes && |
| 89 | rm .gitattributes && |
| 90 | git grep --cached text t >actual && |
| 91 | test_when_finished "git rm --cached .gitattributes" && |
| 92 | test_when_finished "git checkout .gitattributes" && |
| 93 | test_cmp expect actual |
| 94 | ' |
| 95 | |
| 96 | test_expect_success 'grep revision respects binary diff attribute' ' |
| 97 | git commit -m new && |
| 98 | echo "Binary file HEAD:t matches" >expect && |
| 99 | git grep text HEAD -- t >actual && |
| 100 | test_when_finished "git reset HEAD^" && |
| 101 | test_cmp expect actual |
| 102 | ' |
| 103 | |
| 104 | test_expect_success 'grep respects not-binary diff attribute' ' |
| 105 | echo binQary | q_to_nul >b && |
| 106 | git add b && |
| 107 | echo "Binary file b matches" >expect && |
| 108 | git grep bin b >actual && |
| 109 | test_cmp expect actual && |
| 110 | echo "b diff" >.gitattributes && |
| 111 | echo "b:binQary" >expect && |
| 112 | git grep bin b >actual.raw && |
| 113 | nul_to_q <actual.raw >actual && |
| 114 | test_cmp expect actual |
| 115 | ' |
| 116 | |
| 117 | test_expect_success 'setup textconv filters' ' |
| 118 | write_script nul_to_q_textconv <<-\EOF && |
| 119 | tr "\000" "Q" <"$1" |
| 120 | EOF |
| 121 | echo a diff=foo >.gitattributes && |
| 122 | git config diff.foo.textconv "\"$(pwd)\""/nul_to_q_textconv |
| 123 | ' |
| 124 | |
| 125 | test_expect_success 'grep does not honor textconv' ' |
| 126 | test_must_fail git grep Qfile |
| 127 | ' |
| 128 | |
| 129 | test_expect_success 'grep --textconv honors textconv' ' |
| 130 | echo "a:binaryQfileQm[*]cQ*æQð" >expect && |
| 131 | git grep --textconv Qfile >actual && |
| 132 | test_cmp expect actual |
| 133 | ' |
| 134 | |
| 135 | test_expect_success 'grep --no-textconv does not honor textconv' ' |
| 136 | test_must_fail git grep --no-textconv Qfile |
| 137 | ' |
| 138 | |
| 139 | test_expect_success 'grep --textconv blob honors textconv' ' |
| 140 | echo "HEAD:a:binaryQfileQm[*]cQ*æQð" >expect && |
| 141 | git grep --textconv Qfile HEAD:a >actual && |
| 142 | test_cmp expect actual |
| 143 | ' |
| 144 | |
| 145 | test_done |