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