lock_ref_sha1_basic(): improve diagnostics for ref D/F conflicts

If there is a failure to lock a reference that is likely caused by a
D/F conflict (e.g., trying to lock "refs/foo/bar" when reference
"refs/foo" already exists), invoke verify_refname_available() to try
to generate a more helpful error message.

That function might not detect an error. For example, some
non-reference file might be blocking the deletion of an
otherwise-empty directory tree, or there might be a race with another
process that just deleted the offending reference. In such cases,
generate the strerror-based error message like before.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
This commit is contained in:
Michael Haggerty
2015-05-11 17:25:16 +02:00
committed by Junio C Hamano
parent 4a32b2e08b
commit 5b2d8d6f21
2 changed files with 16 additions and 8 deletions

View File

@ -36,7 +36,7 @@ test_expect_success 'existing loose ref is a simple prefix of new' '
prefix=refs/1l &&
test_update_rejected $prefix "a c e" false "b c/x d" \
"unable to resolve reference $prefix/c/x: Not a directory"
"$Q$prefix/c$Q exists; cannot create $Q$prefix/c/x$Q"
'
@ -52,7 +52,7 @@ test_expect_success 'existing loose ref is a deeper prefix of new' '
prefix=refs/2l &&
test_update_rejected $prefix "a c e" false "b c/x/y d" \
"unable to resolve reference $prefix/c/x/y: Not a directory"
"$Q$prefix/c$Q exists; cannot create $Q$prefix/c/x/y$Q"
'
@ -68,7 +68,7 @@ test_expect_success 'new ref is a simple prefix of existing loose' '
prefix=refs/3l &&
test_update_rejected $prefix "a c/x e" false "b c d" \
"there are still refs under $Q$prefix/c$Q"
"$Q$prefix/c/x$Q exists; cannot create $Q$prefix/c$Q"
'
@ -84,7 +84,7 @@ test_expect_success 'new ref is a deeper prefix of existing loose' '
prefix=refs/4l &&
test_update_rejected $prefix "a c/x/y e" false "b c d" \
"there are still refs under $Q$prefix/c$Q"
"$Q$prefix/c/x/y$Q exists; cannot create $Q$prefix/c$Q"
'