]> git.ipfire.org Git - thirdparty/git.git/blob - t/t6418-merge-text-auto.sh
repo-settings: rename the traditional default fetch.negotiationAlgorithm
[thirdparty/git.git] / t / t6418-merge-text-auto.sh
1 #!/bin/sh
2
3 test_description='CRLF merge conflict across text=auto change
4
5 * [main] remove .gitattributes
6 ! [side] add line from b
7 --
8 + [side] add line from b
9 * [main] remove .gitattributes
10 * [main^] add line from a
11 * [main~2] normalize file
12 *+ [side^] Initial
13 '
14
15 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
16 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
17
18 . ./test-lib.sh
19
20 test_have_prereq SED_STRIPS_CR && SED_OPTIONS=-b
21
22 compare_files () {
23 tr '\015\000' QN <"$1" >"$1".expect &&
24 tr '\015\000' QN <"$2" >"$2".actual &&
25 test_cmp "$1".expect "$2".actual &&
26 rm "$1".expect "$2".actual
27 }
28
29 test_expect_success setup '
30 git config core.autocrlf false &&
31
32 echo first line | append_cr >file &&
33 echo first line >control_file &&
34 echo only line >inert_file &&
35
36 git add file control_file inert_file &&
37 test_tick &&
38 git commit -m "Initial" &&
39 git tag initial &&
40 git branch side &&
41
42 echo "* text=auto" >.gitattributes &&
43 echo first line >file &&
44 git add .gitattributes file &&
45 test_tick &&
46 git commit -m "normalize file" &&
47
48 echo same line | append_cr >>file &&
49 echo same line >>control_file &&
50 git add file control_file &&
51 test_tick &&
52 git commit -m "add line from a" &&
53 git tag a &&
54
55 git rm .gitattributes &&
56 rm file &&
57 git checkout file &&
58 test_tick &&
59 git commit -m "remove .gitattributes" &&
60 git tag c &&
61
62 git checkout side &&
63 echo same line | append_cr >>file &&
64 echo same line >>control_file &&
65 git add file control_file &&
66 test_tick &&
67 git commit -m "add line from b" &&
68 git tag b &&
69
70 git checkout main
71 '
72
73 test_expect_success 'set up fuzz_conflict() helper' '
74 fuzz_conflict() {
75 sed $SED_OPTIONS -e "s/^\([<>=]......\) .*/\1/" "$@"
76 }
77 '
78
79 test_expect_success 'Merge after setting text=auto' '
80 cat <<-\EOF >expected &&
81 first line
82 same line
83 EOF
84
85 if test_have_prereq NATIVE_CRLF; then
86 append_cr <expected >expected.temp &&
87 mv expected.temp expected
88 fi &&
89 git config merge.renormalize true &&
90 git rm -fr . &&
91 rm -f .gitattributes &&
92 git reset --hard a &&
93 git merge b &&
94 compare_files expected file
95 '
96
97 test_expect_success 'Merge addition of text=auto eol=LF' '
98 git config core.eol lf &&
99 cat <<-\EOF >expected &&
100 first line
101 same line
102 EOF
103
104 git config merge.renormalize true &&
105 git rm -fr . &&
106 rm -f .gitattributes &&
107 git reset --hard b &&
108 git merge a &&
109 compare_files expected file
110 '
111
112 test_expect_success 'Merge addition of text=auto eol=CRLF' '
113 git config core.eol crlf &&
114 cat <<-\EOF >expected &&
115 first line
116 same line
117 EOF
118
119 append_cr <expected >expected.temp &&
120 mv expected.temp expected &&
121 git config merge.renormalize true &&
122 git rm -fr . &&
123 rm -f .gitattributes &&
124 git reset --hard b &&
125 echo >&2 "After git reset --hard b" &&
126 git ls-files -s --eol >&2 &&
127 git merge a &&
128 compare_files expected file
129 '
130
131 test_expect_success 'Detect CRLF/LF conflict after setting text=auto' '
132 git config core.eol native &&
133 echo "<<<<<<<" >expected &&
134 echo first line >>expected &&
135 echo same line >>expected &&
136 echo ======= >>expected &&
137 echo first line | append_cr >>expected &&
138 echo same line | append_cr >>expected &&
139 echo ">>>>>>>" >>expected &&
140 git config merge.renormalize false &&
141 rm -f .gitattributes &&
142 git reset --hard a &&
143 test_must_fail git merge b &&
144 fuzz_conflict file >file.fuzzy &&
145 compare_files expected file.fuzzy
146 '
147
148 test_expect_success 'Detect LF/CRLF conflict from addition of text=auto' '
149 echo "<<<<<<<" >expected &&
150 echo first line | append_cr >>expected &&
151 echo same line | append_cr >>expected &&
152 echo ======= >>expected &&
153 echo first line >>expected &&
154 echo same line >>expected &&
155 echo ">>>>>>>" >>expected &&
156 git config merge.renormalize false &&
157 rm -f .gitattributes &&
158 git reset --hard b &&
159 test_must_fail git merge a &&
160 fuzz_conflict file >file.fuzzy &&
161 compare_files expected file.fuzzy
162 '
163
164 test_expect_success 'checkout -m after setting text=auto' '
165 cat <<-\EOF >expected &&
166 first line
167 same line
168 EOF
169
170 git config merge.renormalize true &&
171 git rm -fr . &&
172 rm -f .gitattributes &&
173 git reset --hard initial &&
174 git restore --source=a -- . &&
175 git checkout -m b &&
176 git diff --no-index --ignore-cr-at-eol expected file
177 '
178
179 test_expect_success 'checkout -m addition of text=auto' '
180 cat <<-\EOF >expected &&
181 first line
182 same line
183 EOF
184
185 git config merge.renormalize true &&
186 git rm -fr . &&
187 rm -f .gitattributes file &&
188 git reset --hard initial &&
189 git restore --source=b -- . &&
190 git checkout -m a &&
191 git diff --no-index --ignore-cr-at-eol expected file
192 '
193
194 test_expect_success 'Test delete/normalize conflict' '
195 git checkout -f side &&
196 git rm -fr . &&
197 rm -f .gitattributes &&
198 git reset --hard initial &&
199 git rm file &&
200 git commit -m "remove file" &&
201 git checkout main &&
202 git reset --hard a^ &&
203 git merge side &&
204 test_path_is_missing file
205 '
206
207 test_done