140
)
141
'
142
143
+test_expect_success "fetch test default followRemoteHEAD never" '
144
+ git -C two update-ref --no-deref -d refs/remotes/origin/HEAD &&
145
+ test_config -C two fetch.followRemoteHEAD "never" &&
146
+ GIT_TRACE_PACKET=$PWD/trace.out git -C two fetch &&
147
+ # Confirm that we do not even ask for HEAD when we are
148
+ # not going to act on it.
149
+ test_grep ! "ref-prefix HEAD" trace.out &&
150
+ test_must_fail git -C two rev-parse --verify refs/remotes/origin/HEAD
151
+'
152
+
153
test_expect_success "fetch test followRemoteHEAD never" '
154
git -C two update-ref --no-deref -d refs/remotes/origin/HEAD &&
155
test_config -C two remote.origin.followRemoteHEAD "never" &&
160
test_must_fail git -C two rev-parse --verify refs/remotes/origin/HEAD
161
'
162
163
+test_expect_success "fetch test default followRemoteHEAD warn no change" '
164
+ git -C two rev-parse --verify refs/remotes/origin/other &&
165
+ git -C two remote set-head origin other &&
166
+ git -C two rev-parse --verify refs/remotes/origin/HEAD &&
167
+ git -C two rev-parse --verify refs/remotes/origin/main &&
168
+ test_config -C two fetch.followRemoteHEAD "warn" &&
169
+ git -C two fetch >output &&
170
+ echo "${SQ}HEAD${SQ} at ${SQ}origin${SQ} is ${SQ}main${SQ}," \
171
+ "but we have ${SQ}other${SQ} locally." >expect &&
172
+ test_cmp expect output &&
173
+ head=$(git -C two rev-parse refs/remotes/origin/HEAD) &&
174
+ branch=$(git -C two rev-parse refs/remotes/origin/other) &&
175
+ test "z$head" = "z$branch"
176
+'
177
+
178
test_expect_success "fetch test followRemoteHEAD warn no change" '
179
git -C two rev-parse --verify refs/remotes/origin/other &&
180
git -C two remote set-head origin other &&
190
test "z$head" = "z$branch"
191
'
192
193
+test_expect_success "fetch test default followRemoteHEAD warn create" '
194
+ git -C two update-ref --no-deref -d refs/remotes/origin/HEAD &&
195
+ test_config -C two fetch.followRemoteHEAD "warn" &&
196
+ git -C two rev-parse --verify refs/remotes/origin/main &&
197
+ output=$(git -C two fetch) &&
198
+ test "z" = "z$output" &&
199
+ head=$(git -C two rev-parse refs/remotes/origin/HEAD) &&
200
+ branch=$(git -C two rev-parse refs/remotes/origin/main) &&
201
+ test "z$head" = "z$branch"
202
+'
203
+
204
test_expect_success "fetch test followRemoteHEAD warn create" '
205
git -C two update-ref --no-deref -d refs/remotes/origin/HEAD &&
206
test_config -C two remote.origin.followRemoteHEAD "warn" &&
212
test "z$head" = "z$branch"
213
'
214
215
+test_expect_success "fetch test default followRemoteHEAD warn detached" '
216
+ git -C two update-ref --no-deref -d refs/remotes/origin/HEAD &&
217
+ git -C two update-ref refs/remotes/origin/HEAD HEAD &&
218
+ HEAD=$(git -C two log --pretty="%H") &&
219
+ test_config -C two fetch.followRemoteHEAD "warn" &&
220
+ git -C two fetch >output &&
221
+ echo "${SQ}HEAD${SQ} at ${SQ}origin${SQ} is ${SQ}main${SQ}," \
222
+ "but we have a detached HEAD pointing to" \
223
+ "${SQ}${HEAD}${SQ} locally." >expect &&
224
+ test_cmp expect output
225
+'
226
+
227
test_expect_success "fetch test followRemoteHEAD warn detached" '
228
git -C two update-ref --no-deref -d refs/remotes/origin/HEAD &&
229
git -C two update-ref refs/remotes/origin/HEAD HEAD &&
236
test_cmp expect output
237
'
238
239
+test_expect_success "fetch test default followRemoteHEAD warn quiet" '
240
+ git -C two rev-parse --verify refs/remotes/origin/other &&
241
+ git -C two remote set-head origin other &&
242
+ git -C two rev-parse --verify refs/remotes/origin/HEAD &&
243
+ git -C two rev-parse --verify refs/remotes/origin/main &&
244
+ test_config -C two fetch.followRemoteHEAD "warn" &&
245
+ output=$(git -C two fetch --quiet) &&
246
+ test "z" = "z$output" &&
247
+ head=$(git -C two rev-parse refs/remotes/origin/HEAD) &&
248
+ branch=$(git -C two rev-parse refs/remotes/origin/other) &&
249
+ test "z$head" = "z$branch"
250
+'
251
+
252
test_expect_success "fetch test followRemoteHEAD warn quiet" '
253
git -C two rev-parse --verify refs/remotes/origin/other &&
254
git -C two remote set-head origin other &&
290
test "z$head" = "z$branch"
291
'
292
293
+test_expect_success "fetch test default followRemoteHEAD always" '
294
+ git -C two rev-parse --verify refs/remotes/origin/other &&
295
+ git -C two remote set-head origin other &&
296
+ git -C two rev-parse --verify refs/remotes/origin/HEAD &&
297
+ git -C two rev-parse --verify refs/remotes/origin/main &&
298
+ test_config -C two fetch.followRemoteHEAD "always" &&
299
+ git -C two fetch &&
300
+ head=$(git -C two rev-parse refs/remotes/origin/HEAD) &&
301
+ branch=$(git -C two rev-parse refs/remotes/origin/main) &&
302
+ test "z$head" = "z$branch"
303
+'
304
+
305
test_expect_success "fetch test followRemoteHEAD always" '
306
git -C two rev-parse --verify refs/remotes/origin/other &&
307
git -C two remote set-head origin other &&
314
test "z$head" = "z$branch"
315
'
316
317
+test_expect_success 'per-remote followRemoteHEAD takes priority over fetch default' '
318
+ git -C two rev-parse --verify refs/remotes/origin/other &&
319
+ git -C two remote set-head origin other &&
320
+ git -C two rev-parse --verify refs/remotes/origin/HEAD &&
321
+ git -C two rev-parse --verify refs/remotes/origin/main &&
322
+ test_config -C two fetch.followRemoteHEAD "never" &&
323
+ test_config -C two remote.origin.followRemoteHEAD "always" &&
324
+ git -C two fetch &&
325
+ head=$(git -C two rev-parse refs/remotes/origin/HEAD) &&
326
+ branch=$(git -C two rev-parse refs/remotes/origin/main) &&
327
+ test "z$head" = "z$branch"
328
+'
329
+
330
+test_expect_success 'default followRemoteHEAD does not kick in with refspecs' '
331
+ git -C two remote set-head origin other &&
332
+ test_config -C two fetch.followRemoteHEAD always &&
333
+ git -C two fetch origin refs/heads/main:refs/remotes/origin/main &&
334
+ echo refs/remotes/origin/other >expect &&
335
+ git -C two symbolic-ref refs/remotes/origin/HEAD >actual &&
336
+ test_cmp expect actual
337
+'
338
+
339
test_expect_success 'followRemoteHEAD does not kick in with refspecs' '
340
git -C two remote set-head origin other &&
341
test_config -C two remote.origin.followRemoteHEAD always &&
345
test_cmp expect actual
346
'
347
348
+test_expect_success 'default followRemoteHEAD create does not overwrite dangling symref' '
349
+ test_when_finished "git -C two remote remove custom-head" &&
350
+ git -C two remote add -m does-not-exist custom-head ../one &&
351
+ test_config -C two fetch.followRemoteHEAD create &&
352
+ git -C two fetch custom-head &&
353
+ echo refs/remotes/custom-head/does-not-exist >expect &&
354
+ git -C two symbolic-ref refs/remotes/custom-head/HEAD >actual &&
355
+ test_cmp expect actual
356
+'
357
+
358
test_expect_success 'followRemoteHEAD create does not overwrite dangling symref' '
359
test_when_finished "git -C two remote remove custom-head" &&
360
git -C two remote add -m does-not-exist custom-head ../one &&