diff options
author | Michael Haggerty <mhagger@alum.mit.edu> | 2015-05-11 17:25:16 +0200 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2015-05-11 11:50:20 -0700 |
commit | 5b2d8d6f2184381b76c13504a2f5ec8a62cd584e (patch) | |
tree | 88b3577217ab62679ae9d3107b176cf0e6df71f1 /refs.c | |
parent | 4a32b2e08be8daf965949956e8ea16718797a031 (diff) | |
download | git-5b2d8d6f2184381b76c13504a2f5ec8a62cd584e.tar.gz |
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>
Diffstat (limited to 'refs.c')
-rw-r--r-- | refs.c | 16 |
1 files changed, 12 insertions, 4 deletions
@@ -2369,8 +2369,12 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname, ref_file = git_path("%s", orig_refname); if (remove_empty_directories(ref_file)) { last_errno = errno; - strbuf_addf(err, "there are still refs under '%s'", - orig_refname); + + if (!verify_refname_available(orig_refname, extras, skip, + get_loose_refs(&ref_cache), err)) + strbuf_addf(err, "there are still refs under '%s'", + orig_refname); + goto error_return; } refname = resolve_ref_unsafe(orig_refname, resolve_flags, @@ -2380,8 +2384,12 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname, *type_p = type; if (!refname) { last_errno = errno; - strbuf_addf(err, "unable to resolve reference %s: %s", - orig_refname, strerror(errno)); + if (last_errno != ENOTDIR || + !verify_refname_available(orig_refname, extras, skip, + get_loose_refs(&ref_cache), err)) + strbuf_addf(err, "unable to resolve reference %s: %s", + orig_refname, strerror(last_errno)); + goto error_return; } /* |