git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: error: Unable to append to .git/logs/refs/remotes/origin/master: Permission denied

From
Jeff King <peff@peff.net>
Date
Apr 29, 2009, 04:07 UTC
Message-ID
<20090429040719.GA14912@coredump.intra.peff.net>
In-Reply-To
<20090429032943.GB8826@coredump.intra.peff.net>
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));
 
Previous: Jeff KingNext: Ingo Molnar
Message 3 of 8 in “error: Unable to append to .git/logs/refs/remotes/origin/master: Permission denied”
  1. Ingo MolnarApr 28, 2009
  2. Jeff KingApr 29, 2009
  3. Jeff KingApr 29, 2009
  4. Ingo MolnarApr 29, 2009
  5. Jeff KingApr 29, 2009
  6. 1/2 lock_ref: inform callers of unavailable refJeff King, May 25, 2009
  7. 2/2 fetch: report ref storage DF errors more accuratelyJeff King, May 25, 2009
  8. Junio C HamanoMay 25, 2009

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.