| #!/bin/sh |
| |
| test_description='combined and merge diff handle binary files and textconv' |
| GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main |
| export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME |
| |
| . ./test-lib.sh |
| |
| test_expect_success 'setup binary merge conflict' ' |
| echo oneQ1 | q_to_nul >binary && |
| git add binary && |
| git commit -m one && |
| echo twoQ2 | q_to_nul >binary && |
| git commit -a -m two && |
| two=$(git rev-parse --short HEAD:binary) && |
| git checkout -b branch-binary HEAD^ && |
| echo threeQ3 | q_to_nul >binary && |
| git commit -a -m three && |
| three=$(git rev-parse --short HEAD:binary) && |
| test_must_fail git merge main && |
| echo resolvedQhooray | q_to_nul >binary && |
| git commit -a -m resolved && |
| res=$(git rev-parse --short HEAD:binary) |
| ' |
| |
| cat >expect <<EOF |
| resolved |
| |
| diff --git a/binary b/binary |
| index $three..$res 100644 |
| Binary files a/binary and b/binary differ |
| resolved |
| |
| diff --git a/binary b/binary |
| index $two..$res 100644 |
| Binary files a/binary and b/binary differ |
| EOF |
| test_expect_success 'diff -m indicates binary-ness' ' |
| git show --format=%s -m >actual && |
| test_cmp expect actual |
| ' |
| |
| cat >expect <<EOF |
| resolved |
| |
| diff --combined binary |
| index $three,$two..$res |
| Binary files differ |
| EOF |
| test_expect_success 'diff -c indicates binary-ness' ' |
| git show --format=%s -c >actual && |
| test_cmp expect actual |
| ' |
| |
| cat >expect <<EOF |
| resolved |
| |
| diff --cc binary |
| index $three,$two..$res |
| Binary files differ |
| EOF |
| test_expect_success 'diff --cc indicates binary-ness' ' |
| git show --format=%s --cc >actual && |
| test_cmp expect actual |
| ' |
| |
| test_expect_success 'setup non-binary with binary attribute' ' |
| git checkout main && |
| test_commit one text && |
| test_commit two text && |
| two=$(git rev-parse --short HEAD:text) && |
| git checkout -b branch-text HEAD^ && |
| test_commit three text && |
| three=$(git rev-parse --short HEAD:text) && |
| test_must_fail git merge main && |
| test_commit resolved text && |
| res=$(git rev-parse --short HEAD:text) && |
| echo text -diff >.gitattributes |
| ' |
| |
| cat >expect <<EOF |
| resolved |
| |
| diff --git a/text b/text |
| index $three..$res 100644 |
| Binary files a/text and b/text differ |
| resolved |
| |
| diff --git a/text b/text |
| index $two..$res 100644 |
| Binary files a/text and b/text differ |
| EOF |
| test_expect_success 'diff -m respects binary attribute' ' |
| git show --format=%s -m >actual && |
| test_cmp expect actual |
| ' |
| |
| cat >expect <<EOF |
| resolved |
| |
| diff --combined text |
| index $three,$two..$res |
| Binary files differ |
| EOF |
| test_expect_success 'diff -c respects binary attribute' ' |
| git show --format=%s -c >actual && |
| test_cmp expect actual |
| ' |
| |
| cat >expect <<EOF |
| resolved |
| |
| diff --cc text |
| index $three,$two..$res |
| Binary files differ |
| EOF |
| test_expect_success 'diff --cc respects binary attribute' ' |
| git show --format=%s --cc >actual && |
| test_cmp expect actual |
| ' |
| |
| test_expect_success 'setup textconv attribute' ' |
| echo "text diff=upcase" >.gitattributes && |
| git config diff.upcase.textconv "tr a-z A-Z <" |
| ' |
| |
| cat >expect <<EOF |
| resolved |
| |
| diff --git a/text b/text |
| index $three..$res 100644 |
| --- a/text |
| +++ b/text |
| @@ -1 +1 @@ |
| -THREE |
| +RESOLVED |
| resolved |
| |
| diff --git a/text b/text |
| index $two..$res 100644 |
| --- a/text |
| +++ b/text |
| @@ -1 +1 @@ |
| -TWO |
| +RESOLVED |
| EOF |
| test_expect_success 'diff -m respects textconv attribute' ' |
| git show --format=%s -m >actual && |
| test_cmp expect actual |
| ' |
| |
| cat >expect <<EOF |
| resolved |
| |
| diff --combined text |
| index $three,$two..$res |
| --- a/text |
| +++ b/text |
| @@@ -1,1 -1,1 +1,1 @@@ |
| - THREE |
| -TWO |
| ++RESOLVED |
| EOF |
| test_expect_success 'diff -c respects textconv attribute' ' |
| git show --format=%s -c >actual && |
| test_cmp expect actual |
| ' |
| |
| cat >expect <<EOF |
| resolved |
| |
| diff --cc text |
| index $three,$two..$res |
| --- a/text |
| +++ b/text |
| @@@ -1,1 -1,1 +1,1 @@@ |
| - THREE |
| -TWO |
| ++RESOLVED |
| EOF |
| test_expect_success 'diff --cc respects textconv attribute' ' |
| git show --format=%s --cc >actual && |
| test_cmp expect actual |
| ' |
| |
| cat >expect <<EOF |
| diff --combined text |
| index $three,$two..$res |
| --- a/text |
| +++ b/text |
| @@@ -1,1 -1,1 +1,1 @@@ |
| - three |
| -two |
| ++resolved |
| EOF |
| test_expect_success 'diff-tree plumbing does not respect textconv' ' |
| git diff-tree HEAD -c -p >full && |
| tail -n +2 full >actual && |
| test_cmp expect actual |
| ' |
| |
| cat >expect <<EOF |
| diff --cc text |
| index $three,$two..0000000 |
| --- a/text |
| +++ b/text |
| @@@ -1,1 -1,1 +1,5 @@@ |
| ++<<<<<<< HEAD |
| +THREE |
| ++======= |
| + TWO |
| ++>>>>>>> MAIN |
| EOF |
| test_expect_success 'diff --cc respects textconv on worktree file' ' |
| git reset --hard HEAD^ && |
| test_must_fail git merge main && |
| git diff >actual && |
| test_cmp expect actual |
| ' |
| |
| test_done |