On Tue, Apr 28, 2009 at 11:29:43PM -0400, Jeff King wrote: > Note the repeated use of "hopefully". :) Maybe the earlier message is > too hidden to rely on. We might be able to get by with checking "errno" > for ENOTDIR after trying to lock the ref and using a different message, > but I don't know how portable that will be. Hmm, that actually doesn't work. errno is properly EACCESS in your example, but the D/F problem doesn't actually set errno, since it is git itself, and not a failed syscall, that determines that "foo/bar" is not available because "foo" exists (and git must do it, because "foo" may be a packed ref). So I think we would need to simulate the errno setting, like the patch below. That should generate the hint only when it would actually be useful. --- diff --git a/builtin-fetch.c b/builtin-fetch.c index 0bb290b..ad00bd2 100644 --- a/builtin-fetch.c +++ b/builtin-fetch.c @@ -181,9 +181,9 @@ static int s_update_ref(const char *action, lock = lock_any_ref_for_update(ref->name, check_old ? ref->old_sha1 : NULL, 0); if (!lock) - return 2; + return errno == ENOTDIR ? 2 : 1; if (write_ref_sha1(lock, ref->new_sha1, msg) < 0) - return 2; + return errno == ENOTDIR ? 2 : 1; return 0; } diff --git a/refs.c b/refs.c index e65a3b4..79795d0 100644 --- a/refs.c +++ b/refs.c @@ -893,8 +893,10 @@ static struct ref_lock *lock_ref_sha1_basic(const char *ref, const unsigned char * name is a proper prefix of our refname. */ if (missing && - !is_refname_available(ref, NULL, get_packed_refs(), 0)) + !is_refname_available(ref, NULL, get_packed_refs(), 0)) { + last_errno = ENOTDIR; goto error_return; + } lock->lk = xcalloc(1, sizeof(struct lock_file)); -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html