t1404: add more tests of update-ref error handling
Some of the error messages will be improved in subsequent commits. Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Michael Haggerty committed
Jun 7, 2016 at 12:29 UTC
c5119dcf493a7b13b6a3e586e8d771a9e1d4975e
1 file changed
+219
-2
t/t1404-update-ref-errors.sh
+219
-2
@@ -39,8 +39,9 @@ test_expect_success 'setup' '
39
git commit --allow-empty -m Initial &&
40
C=$(git rev-parse HEAD) &&
41
git commit --allow-empty -m Second &&
42
- D=$(git rev-parse HEAD)
43
-
42
+ D=$(git rev-parse HEAD) &&
43
+ git commit --allow-empty -m Third &&
44
+ E=$(git rev-parse HEAD)
45
'
46
47
test_expect_success 'existing loose ref is a simple prefix of new' '
@@ -187,4 +188,220 @@ test_expect_success 'empty directory should not fool 1-arg delete' '
188
git update-ref --stdin
189
'
190
191
+# Test various errors when reading the old values of references...
192
+
193
+test_expect_success 'missing old value blocks update' '
194
+ prefix=refs/missing-update &&
195
+ cat >expected <<-EOF &&
196
+ fatal: cannot lock ref $Q$prefix/foo$Q: unable to resolve reference $Q$prefix/foo$Q
197
+ EOF
198
+ printf "%s\n" "update $prefix/foo $E $D" |
199
+ test_must_fail git update-ref --stdin 2>output.err &&
200
+ test_cmp expected output.err
201
+'
202
+
203
+test_expect_success 'incorrect old value blocks update' '
204
+ prefix=refs/incorrect-update &&
205
+ git update-ref $prefix/foo $C &&
206
+ cat >expected <<-EOF &&
207
+ fatal: cannot lock ref $Q$prefix/foo$Q: is at $C but expected $D
208
+ EOF
209
+ printf "%s\n" "update $prefix/foo $E $D" |
210
+ test_must_fail git update-ref --stdin 2>output.err &&
211
+ test_cmp expected output.err
212
+'
213
+
214
+test_expect_success 'existing old value blocks create' '
215
+ prefix=refs/existing-create &&
216
+ git update-ref $prefix/foo $C &&
217
+ cat >expected <<-EOF &&
218
+ fatal: cannot lock ref $Q$prefix/foo$Q: reference already exists
219
+ EOF
220
+ printf "%s\n" "create $prefix/foo $E" |
221
+ test_must_fail git update-ref --stdin 2>output.err &&
222
+ test_cmp expected output.err
223
+'
224
+
225
+test_expect_success 'incorrect old value blocks delete' '
226
+ prefix=refs/incorrect-delete &&
227
+ git update-ref $prefix/foo $C &&
228
+ cat >expected <<-EOF &&
229
+ fatal: cannot lock ref $Q$prefix/foo$Q: is at $C but expected $D
230
+ EOF
231
+ printf "%s\n" "delete $prefix/foo $D" |
232
+ test_must_fail git update-ref --stdin 2>output.err &&
233
+ test_cmp expected output.err
234
+'
235
+
236
+test_expect_success 'missing old value blocks indirect update' '
237
+ prefix=refs/missing-indirect-update &&
238
+ git symbolic-ref $prefix/symref $prefix/foo &&
239
+ cat >expected <<-EOF &&
240
+ fatal: cannot lock ref $Q$prefix/foo$Q: unable to resolve reference $Q$prefix/foo$Q
241
+ EOF
242
+ printf "%s\n" "update $prefix/symref $E $D" |
243
+ test_must_fail git update-ref --stdin 2>output.err &&
244
+ test_cmp expected output.err
245
+'
246
+
247
+test_expect_success 'incorrect old value blocks indirect update' '
248
+ prefix=refs/incorrect-indirect-update &&
249
+ git symbolic-ref $prefix/symref $prefix/foo &&
250
+ git update-ref $prefix/foo $C &&
251
+ cat >expected <<-EOF &&
252
+ fatal: cannot lock ref $Q$prefix/symref$Q: is at $C but expected $D
253
+ EOF
254
+ printf "%s\n" "update $prefix/symref $E $D" |
255
+ test_must_fail git update-ref --stdin 2>output.err &&
256
+ test_cmp expected output.err
257
+'
258
+
259
+test_expect_success 'existing old value blocks indirect create' '
260
+ prefix=refs/existing-indirect-create &&
261
+ git symbolic-ref $prefix/symref $prefix/foo &&
262
+ git update-ref $prefix/foo $C &&
263
+ cat >expected <<-EOF &&
264
+ fatal: cannot lock ref $Q$prefix/symref$Q: reference already exists
265
+ EOF
266
+ printf "%s\n" "create $prefix/symref $E" |
267
+ test_must_fail git update-ref --stdin 2>output.err &&
268
+ test_cmp expected output.err
269
+'
270
+
271
+test_expect_success 'incorrect old value blocks indirect delete' '
272
+ prefix=refs/incorrect-indirect-delete &&
273
+ git symbolic-ref $prefix/symref $prefix/foo &&
274
+ git update-ref $prefix/foo $C &&
275
+ cat >expected <<-EOF &&
276
+ fatal: cannot lock ref $Q$prefix/symref$Q: is at $C but expected $D
277
+ EOF
278
+ printf "%s\n" "delete $prefix/symref $D" |
279
+ test_must_fail git update-ref --stdin 2>output.err &&
280
+ test_cmp expected output.err
281
+'
282
+
283
+test_expect_success 'missing old value blocks indirect no-deref update' '
284
+ prefix=refs/missing-noderef-update &&
285
+ git symbolic-ref $prefix/symref $prefix/foo &&
286
+ cat >expected <<-EOF &&
287
+ fatal: cannot lock ref $Q$prefix/symref$Q: can${Q}t resolve old value
288
+ EOF
289
+ printf "%s\n" "option no-deref" "update $prefix/symref $E $D" |
290
+ test_must_fail git update-ref --stdin 2>output.err &&
291
+ test_cmp expected output.err
292
+'
293
+
294
+test_expect_success 'incorrect old value blocks indirect no-deref update' '
295
+ prefix=refs/incorrect-noderef-update &&
296
+ git symbolic-ref $prefix/symref $prefix/foo &&
297
+ git update-ref $prefix/foo $C &&
298
+ cat >expected <<-EOF &&
299
+ fatal: cannot lock ref $Q$prefix/symref$Q: is at $C but expected $D
300
+ EOF
301
+ printf "%s\n" "option no-deref" "update $prefix/symref $E $D" |
302
+ test_must_fail git update-ref --stdin 2>output.err &&
303
+ test_cmp expected output.err
304
+'
305
+
306
+test_expect_failure 'existing old value blocks indirect no-deref create' '
307
+ prefix=refs/existing-noderef-create &&
308
+ git symbolic-ref $prefix/symref $prefix/foo &&
309
+ git update-ref $prefix/foo $C &&
310
+ cat >expected <<-EOF &&
311
+ fatal: cannot lock ref $Q$prefix/symref$Q: reference already exists
312
+ EOF
313
+ printf "%s\n" "option no-deref" "create $prefix/symref $E" |
314
+ test_must_fail git update-ref --stdin 2>output.err &&
315
+ test_cmp expected output.err
316
+'
317
+
318
+test_expect_success 'incorrect old value blocks indirect no-deref delete' '
319
+ prefix=refs/incorrect-noderef-delete &&
320
+ git symbolic-ref $prefix/symref $prefix/foo &&
321
+ git update-ref $prefix/foo $C &&
322
+ cat >expected <<-EOF &&
323
+ fatal: cannot lock ref $Q$prefix/symref$Q: is at $C but expected $D
324
+ EOF
325
+ printf "%s\n" "option no-deref" "delete $prefix/symref $D" |
326
+ test_must_fail git update-ref --stdin 2>output.err &&
327
+ test_cmp expected output.err
328
+'
329
+
330
+test_expect_success 'non-empty directory blocks create' '
331
+ prefix=refs/ne-create &&
332
+ mkdir -p .git/$prefix/foo/bar &&
333
+ : >.git/$prefix/foo/bar/baz.lock &&
334
+ test_when_finished "rm -f .git/$prefix/foo/bar/baz.lock" &&
335
+ cat >expected <<-EOF &&
336
+ fatal: cannot lock ref $Q$prefix/foo$Q: there is a non-empty directory $Q.git/$prefix/foo$Q blocking reference $Q$prefix/foo$Q
337
+ EOF
338
+ printf "%s\n" "update $prefix/foo $C" |
339
+ test_must_fail git update-ref --stdin 2>output.err &&
340
+ test_cmp expected output.err &&
341
+ cat >expected <<-EOF &&
342
+ fatal: cannot lock ref $Q$prefix/foo$Q: unable to resolve reference $Q$prefix/foo$Q
343
+ EOF
344
+ printf "%s\n" "update $prefix/foo $D $C" |
345
+ test_must_fail git update-ref --stdin 2>output.err &&
346
+ test_cmp expected output.err
347
+'
348
+
349
+test_expect_success 'broken reference blocks create' '
350
+ prefix=refs/broken-create &&
351
+ mkdir -p .git/$prefix &&
352
+ echo "gobbledigook" >.git/$prefix/foo &&
353
+ test_when_finished "rm -f .git/$prefix/foo" &&
354
+ cat >expected <<-EOF &&
355
+ fatal: cannot lock ref $Q$prefix/foo$Q: unable to resolve reference $Q$prefix/foo$Q: reference broken
356
+ EOF
357
+ printf "%s\n" "update $prefix/foo $C" |
358
+ test_must_fail git update-ref --stdin 2>output.err &&
359
+ test_cmp expected output.err &&
360
+ cat >expected <<-EOF &&
361
+ fatal: cannot lock ref $Q$prefix/foo$Q: unable to resolve reference $Q$prefix/foo$Q: reference broken
362
+ EOF
363
+ printf "%s\n" "update $prefix/foo $D $C" |
364
+ test_must_fail git update-ref --stdin 2>output.err &&
365
+ test_cmp expected output.err
366
+'
367
+
368
+test_expect_success 'non-empty directory blocks indirect create' '
369
+ prefix=refs/ne-indirect-create &&
370
+ git symbolic-ref $prefix/symref $prefix/foo &&
371
+ mkdir -p .git/$prefix/foo/bar &&
372
+ : >.git/$prefix/foo/bar/baz.lock &&
373
+ test_when_finished "rm -f .git/$prefix/foo/bar/baz.lock" &&
374
+ cat >expected <<-EOF &&
375
+ fatal: cannot lock ref $Q$prefix/foo$Q: there is a non-empty directory $Q.git/$prefix/foo$Q blocking reference $Q$prefix/foo$Q
376
+ EOF
377
+ printf "%s\n" "update $prefix/symref $C" |
378
+ test_must_fail git update-ref --stdin 2>output.err &&
379
+ test_cmp expected output.err &&
380
+ cat >expected <<-EOF &&
381
+ fatal: cannot lock ref $Q$prefix/foo$Q: unable to resolve reference $Q$prefix/foo$Q
382
+ EOF
383
+ printf "%s\n" "update $prefix/symref $D $C" |
384
+ test_must_fail git update-ref --stdin 2>output.err &&
385
+ test_cmp expected output.err
386
+'
387
+
388
+test_expect_success 'broken reference blocks indirect create' '
389
+ prefix=refs/broken-indirect-create &&
390
+ git symbolic-ref $prefix/symref $prefix/foo &&
391
+ echo "gobbledigook" >.git/$prefix/foo &&
392
+ test_when_finished "rm -f .git/$prefix/foo" &&
393
+ cat >expected <<-EOF &&
394
+ fatal: cannot lock ref $Q$prefix/foo$Q: unable to resolve reference $Q$prefix/foo$Q: reference broken
395
+ EOF
396
+ printf "%s\n" "update $prefix/symref $C" |
397
+ test_must_fail git update-ref --stdin 2>output.err &&
398
+ test_cmp expected output.err &&
399
+ cat >expected <<-EOF &&
400
+ fatal: cannot lock ref $Q$prefix/foo$Q: unable to resolve reference $Q$prefix/foo$Q: reference broken
401
+ EOF
402
+ printf "%s\n" "update $prefix/symref $D $C" |
403
+ test_must_fail git update-ref --stdin 2>output.err &&
404
+ test_cmp expected output.err
405
+'
406
+
407
test_done