| 1 | #!/bin/sh |
| 2 | |
| 3 | test_description='combined and merge diff handle binary files and textconv' |
| 4 | GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main |
| 5 | export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME |
| 6 | |
| 7 | . ./test-lib.sh |
| 8 | |
| 9 | test_expect_success 'setup binary merge conflict' ' |
| 10 | echo oneQ1 | q_to_nul >binary && |
| 11 | git add binary && |
| 12 | git commit -m one && |
| 13 | echo twoQ2 | q_to_nul >binary && |
| 14 | git commit -a -m two && |
| 15 | two=$(git rev-parse --short HEAD:binary) && |
| 16 | git checkout -b branch-binary HEAD^ && |
| 17 | echo threeQ3 | q_to_nul >binary && |
| 18 | git commit -a -m three && |
| 19 | three=$(git rev-parse --short HEAD:binary) && |
| 20 | test_must_fail git merge main && |
| 21 | echo resolvedQhooray | q_to_nul >binary && |
| 22 | git commit -a -m resolved && |
| 23 | res=$(git rev-parse --short HEAD:binary) |
| 24 | ' |
| 25 | |
| 26 | cat >expect <<EOF |
| 27 | resolved |
| 28 | |
| 29 | diff --git a/binary b/binary |
| 30 | index $three..$res 100644 |
| 31 | Binary files a/binary and b/binary differ |
| 32 | resolved |
| 33 | |
| 34 | diff --git a/binary b/binary |
| 35 | index $two..$res 100644 |
| 36 | Binary files a/binary and b/binary differ |
| 37 | EOF |
| 38 | test_expect_success 'diff -m indicates binary-ness' ' |
| 39 | git show --format=%s -m >actual && |
| 40 | test_cmp expect actual |
| 41 | ' |
| 42 | |
| 43 | cat >expect <<EOF |
| 44 | resolved |
| 45 | |
| 46 | diff --combined binary |
| 47 | index $three,$two..$res |
| 48 | Binary files differ |
| 49 | EOF |
| 50 | test_expect_success 'diff -c indicates binary-ness' ' |
| 51 | git show --format=%s -c >actual && |
| 52 | test_cmp expect actual |
| 53 | ' |
| 54 | |
| 55 | cat >expect <<EOF |
| 56 | resolved |
| 57 | |
| 58 | diff --cc binary |
| 59 | index $three,$two..$res |
| 60 | Binary files differ |
| 61 | EOF |
| 62 | test_expect_success 'diff --cc indicates binary-ness' ' |
| 63 | git show --format=%s --cc >actual && |
| 64 | test_cmp expect actual |
| 65 | ' |
| 66 | |
| 67 | test_expect_success 'setup non-binary with binary attribute' ' |
| 68 | git checkout main && |
| 69 | test_commit one text && |
| 70 | test_commit two text && |
| 71 | two=$(git rev-parse --short HEAD:text) && |
| 72 | git checkout -b branch-text HEAD^ && |
| 73 | test_commit three text && |
| 74 | three=$(git rev-parse --short HEAD:text) && |
| 75 | test_must_fail git merge main && |
| 76 | test_commit resolved text && |
| 77 | res=$(git rev-parse --short HEAD:text) && |
| 78 | echo text -diff >.gitattributes |
| 79 | ' |
| 80 | |
| 81 | cat >expect <<EOF |
| 82 | resolved |
| 83 | |
| 84 | diff --git a/text b/text |
| 85 | index $three..$res 100644 |
| 86 | Binary files a/text and b/text differ |
| 87 | resolved |
| 88 | |
| 89 | diff --git a/text b/text |
| 90 | index $two..$res 100644 |
| 91 | Binary files a/text and b/text differ |
| 92 | EOF |
| 93 | test_expect_success 'diff -m respects binary attribute' ' |
| 94 | git show --format=%s -m >actual && |
| 95 | test_cmp expect actual |
| 96 | ' |
| 97 | |
| 98 | cat >expect <<EOF |
| 99 | resolved |
| 100 | |
| 101 | diff --combined text |
| 102 | index $three,$two..$res |
| 103 | Binary files differ |
| 104 | EOF |
| 105 | test_expect_success 'diff -c respects binary attribute' ' |
| 106 | git show --format=%s -c >actual && |
| 107 | test_cmp expect actual |
| 108 | ' |
| 109 | |
| 110 | cat >expect <<EOF |
| 111 | resolved |
| 112 | |
| 113 | diff --cc text |
| 114 | index $three,$two..$res |
| 115 | Binary files differ |
| 116 | EOF |
| 117 | test_expect_success 'diff --cc respects binary attribute' ' |
| 118 | git show --format=%s --cc >actual && |
| 119 | test_cmp expect actual |
| 120 | ' |
| 121 | |
| 122 | test_expect_success 'setup textconv attribute' ' |
| 123 | echo "text diff=upcase" >.gitattributes && |
| 124 | git config diff.upcase.textconv "tr a-z A-Z <" |
| 125 | ' |
| 126 | |
| 127 | cat >expect <<EOF |
| 128 | resolved |
| 129 | |
| 130 | diff --git a/text b/text |
| 131 | index $three..$res 100644 |
| 132 | --- a/text |
| 133 | +++ b/text |
| 134 | @@ -1 +1 @@ |
| 135 | -THREE |
| 136 | +RESOLVED |
| 137 | resolved |
| 138 | |
| 139 | diff --git a/text b/text |
| 140 | index $two..$res 100644 |
| 141 | --- a/text |
| 142 | +++ b/text |
| 143 | @@ -1 +1 @@ |
| 144 | -TWO |
| 145 | +RESOLVED |
| 146 | EOF |
| 147 | test_expect_success 'diff -m respects textconv attribute' ' |
| 148 | git show --format=%s -m >actual && |
| 149 | test_cmp expect actual |
| 150 | ' |
| 151 | |
| 152 | cat >expect <<EOF |
| 153 | resolved |
| 154 | |
| 155 | diff --combined text |
| 156 | index $three,$two..$res |
| 157 | --- a/text |
| 158 | +++ b/text |
| 159 | @@@ -1,1 -1,1 +1,1 @@@ |
| 160 | - THREE |
| 161 | -TWO |
| 162 | ++RESOLVED |
| 163 | EOF |
| 164 | test_expect_success 'diff -c respects textconv attribute' ' |
| 165 | git show --format=%s -c >actual && |
| 166 | test_cmp expect actual |
| 167 | ' |
| 168 | |
| 169 | cat >expect <<EOF |
| 170 | resolved |
| 171 | |
| 172 | diff --cc text |
| 173 | index $three,$two..$res |
| 174 | --- a/text |
| 175 | +++ b/text |
| 176 | @@@ -1,1 -1,1 +1,1 @@@ |
| 177 | - THREE |
| 178 | -TWO |
| 179 | ++RESOLVED |
| 180 | EOF |
| 181 | test_expect_success 'diff --cc respects textconv attribute' ' |
| 182 | git show --format=%s --cc >actual && |
| 183 | test_cmp expect actual |
| 184 | ' |
| 185 | |
| 186 | cat >expect <<EOF |
| 187 | diff --combined text |
| 188 | index $three,$two..$res |
| 189 | --- a/text |
| 190 | +++ b/text |
| 191 | @@@ -1,1 -1,1 +1,1 @@@ |
| 192 | - three |
| 193 | -two |
| 194 | ++resolved |
| 195 | EOF |
| 196 | test_expect_success 'diff-tree plumbing does not respect textconv' ' |
| 197 | git diff-tree HEAD -c -p >full && |
| 198 | tail -n +2 full >actual && |
| 199 | test_cmp expect actual |
| 200 | ' |
| 201 | |
| 202 | cat >expect <<EOF |
| 203 | diff --cc text |
| 204 | index $three,$two..0000000 |
| 205 | --- a/text |
| 206 | +++ b/text |
| 207 | @@@ -1,1 -1,1 +1,5 @@@ |
| 208 | ++<<<<<<< HEAD |
| 209 | +THREE |
| 210 | ++======= |
| 211 | + TWO |
| 212 | ++>>>>>>> MAIN |
| 213 | EOF |
| 214 | test_expect_success 'diff --cc respects textconv on worktree file' ' |
| 215 | git reset --hard HEAD^ && |
| 216 | test_must_fail git merge main && |
| 217 | git diff >actual && |
| 218 | test_cmp expect actual |
| 219 | ' |
| 220 | |
| 221 | test_done |