#!/bin/sh test_description='CRLF merge conflict across text=auto change * [master] remove .gitattributes ! [side] add line from b -- + [side] add line from b * [master] remove .gitattributes * [master^] add line from a * [master~2] normalize file *+ [side^] Initial ' . ./test-lib.sh test_have_prereq SED_STRIPS_CR && SED_OPTIONS=-b compare_files () { tr '\015\000' QN <"$1" >"$1".expect && tr '\015\000' QN <"$2" >"$2".actual && test_cmp "$1".expect "$2".actual && rm "$1".expect "$2".actual } test_expect_success setup ' git config core.autocrlf false && echo first line | append_cr >file && echo first line >control_file && echo only line >inert_file && git add file control_file inert_file && test_tick && git commit -m "Initial" && git tag initial && git branch side && echo "* text=auto" >.gitattributes && echo first line >file && git add .gitattributes file && test_tick && git commit -m "normalize file" && echo same line | append_cr >>file && echo same line >>control_file && git add file control_file && test_tick && git commit -m "add line from a" && git tag a && git rm .gitattributes && rm file && git checkout file && test_tick && git commit -m "remove .gitattributes" && git tag c && git checkout side && echo same line | append_cr >>file && echo same line >>control_file && git add file control_file && test_tick && git commit -m "add line from b" && git tag b && git checkout master ' test_expect_success 'set up fuzz_conflict() helper' ' fuzz_conflict() { sed $SED_OPTIONS -e "s/^\([<>=]......\) .*/\1/" "$@" } ' test_expect_success 'Merge after setting text=auto' ' cat <<-\EOF >expected && first line same line EOF if test_have_prereq NATIVE_CRLF; then append_cr expected.temp && mv expected.temp expected fi && git config merge.renormalize true && git rm -fr . && rm -f .gitattributes && git reset --hard a && git merge b && compare_files expected file ' test_expect_success 'Merge addition of text=auto eol=LF' ' git config core.eol lf && cat <<-\EOF >expected && first line same line EOF git config merge.renormalize true && git rm -fr . && rm -f .gitattributes && git reset --hard b && git merge a && compare_files expected file ' test_expect_success 'Merge addition of text=auto eol=CRLF' ' git config core.eol crlf && cat <<-\EOF >expected && first line same line EOF append_cr expected.temp && mv expected.temp expected && git config merge.renormalize true && git rm -fr . && rm -f .gitattributes && git reset --hard b && echo >&2 "After git reset --hard b" && git ls-files -s --eol >&2 && git merge a && compare_files expected file ' test_expect_success 'Detect CRLF/LF conflict after setting text=auto' ' git config core.eol native && echo "<<<<<<<" >expected && echo first line >>expected && echo same line >>expected && echo ======= >>expected && echo first line | append_cr >>expected && echo same line | append_cr >>expected && echo ">>>>>>>" >>expected && git config merge.renormalize false && rm -f .gitattributes && git reset --hard a && test_must_fail git merge b && fuzz_conflict file >file.fuzzy && compare_files expected file.fuzzy ' test_expect_success 'Detect LF/CRLF conflict from addition of text=auto' ' echo "<<<<<<<" >expected && echo first line | append_cr >>expected && echo same line | append_cr >>expected && echo ======= >>expected && echo first line >>expected && echo same line >>expected && echo ">>>>>>>" >>expected && git config merge.renormalize false && rm -f .gitattributes && git reset --hard b && test_must_fail git merge a && fuzz_conflict file >file.fuzzy && compare_files expected file.fuzzy ' test_expect_failure 'checkout -m after setting text=auto' ' cat <<-\EOF >expected && first line same line EOF git config merge.renormalize true && git rm -fr . && rm -f .gitattributes && git reset --hard initial && git checkout a -- . && git checkout -m b && compare_files expected file ' test_expect_failure 'checkout -m addition of text=auto' ' cat <<-\EOF >expected && first line same line EOF git config merge.renormalize true && git rm -fr . && rm -f .gitattributes file && git reset --hard initial && git checkout b -- . && git checkout -m a && compare_files expected file ' test_expect_failure 'cherry-pick patch from after text=auto was added' ' append_cr <<-\EOF >expected && first line same line EOF git config merge.renormalize true && git rm -fr . && git reset --hard b && test_must_fail git cherry-pick a >err 2>&1 && grep "[Nn]othing added" err && compare_files expected file ' test_expect_success 'Test delete/normalize conflict' ' git checkout -f side && git rm -fr . && rm -f .gitattributes && git reset --hard initial && git rm file && git commit -m "remove file" && git checkout master && git reset --hard a^ && git merge side ' test_done