* error: Unable to append to .git/logs/refs/remotes/origin/master: Permission denied
@ 2009-04-28 7:31 Ingo Molnar
2009-04-29 3:29 ` Jeff King
0 siblings, 1 reply; 8+ messages in thread
From: Ingo Molnar @ 2009-04-28 7:31 UTC (permalink / raw)
To: git
I had a portion of a repo owned by root accidentally, and the next
time i pulled as user mingo Git gave me this warning and suggestion:
aldebaran:~/git> git pull
error: Unable to append to .git/logs/refs/remotes/origin/master: Permission denied
From e2:git
! 66996ec..95110d7 master -> origin/master (unable to update local ref)
* [new tag] v1.6.3-rc2 -> v1.6.3-rc2
error: some local refs could not be updated; try running
'git remote prune origin' to remove any old, conflicting branches
Obviousy Git cannot update the ref there so the failure is OK, but
the git-remote advice it gives is confusing IMHO: the 'git remote
prune origin' cannot fix anything. (and it is clear from the fetch
permission failure that there's no chance to fix anything here.)
I suspect there are other, more typical failure modes where that
advice is useful - just wanted to point out that it's confusing
here.
Ingo
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: error: Unable to append to .git/logs/refs/remotes/origin/master: Permission denied
2009-04-28 7:31 error: Unable to append to .git/logs/refs/remotes/origin/master: Permission denied Ingo Molnar
@ 2009-04-29 3:29 ` Jeff King
2009-04-29 4:07 ` Jeff King
0 siblings, 1 reply; 8+ messages in thread
From: Jeff King @ 2009-04-29 3:29 UTC (permalink / raw)
To: Ingo Molnar; +Cc: git
On Tue, Apr 28, 2009 at 09:31:38AM +0200, Ingo Molnar wrote:
> aldebaran:~/git> git pull
> error: Unable to append to .git/logs/refs/remotes/origin/master: Permission denied
> From e2:git
> ! 66996ec..95110d7 master -> origin/master (unable to update local ref)
> * [new tag] v1.6.3-rc2 -> v1.6.3-rc2
> error: some local refs could not be updated; try running
> 'git remote prune origin' to remove any old, conflicting branches
>
> Obviousy Git cannot update the ref there so the failure is OK, but
> the git-remote advice it gives is confusing IMHO: the 'git remote
> prune origin' cannot fix anything. (and it is clear from the fetch
> permission failure that there's no chance to fix anything here.)
>
> I suspect there are other, more typical failure modes where that
> advice is useful - just wanted to point out that it's confusing
> here.
Yeah, I knew that when I wrote it:
$ git log -1 --format=%s%n%b f3cb169
fetch: give a hint to the user when local refs fail to update
There are basically two categories of update failures for
local refs:
1. problems outside of git, like disk full, bad
permissions, etc.
2. D/F conflicts on tracking branch ref names
In either case, there should already have been an error
message. In case '1', hopefully enough information has
already been given that the user can fix it. In the case of
'2', we can hint that the user can clean up their tracking
branch area by using 'git remote prune'.
Note that we don't actually know _which_ case we have, so
the user will receive the hint in case 1, as well. In this
case the suggestion won't do any good, but hopefully the
user is smart enough to figure out that it's just a hint.
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.
-Peff
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: error: Unable to append to .git/logs/refs/remotes/origin/master: Permission denied
2009-04-29 3:29 ` Jeff King
@ 2009-04-29 4:07 ` Jeff King
2009-04-29 7:32 ` Ingo Molnar
0 siblings, 1 reply; 8+ messages in thread
From: Jeff King @ 2009-04-29 4:07 UTC (permalink / raw)
To: Ingo Molnar; +Cc: git
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));
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: error: Unable to append to .git/logs/refs/remotes/origin/master: Permission denied
2009-04-29 4:07 ` Jeff King
@ 2009-04-29 7:32 ` Ingo Molnar
2009-04-29 8:06 ` Jeff King
0 siblings, 1 reply; 8+ messages in thread
From: Ingo Molnar @ 2009-04-29 7:32 UTC (permalink / raw)
To: Jeff King; +Cc: git
* Jeff King <peff@peff.net> wrote:
> 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.
it wasnt hard to figure out what's going on. So this was more of a
FYI, not really a bug report. Maybe if someone tries to pull into a
read-only repo the same could happen? My particular breakage (of a
single ref being root-owned - the rest was mingo owned) is atypical
enough to be ignored.
If there's no easy/clean solution then please ignore my report.
Ingo
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: error: Unable to append to .git/logs/refs/remotes/origin/master: Permission denied
2009-04-29 7:32 ` Ingo Molnar
@ 2009-04-29 8:06 ` Jeff King
2009-05-25 10:37 ` [PATCH 1/2] lock_ref: inform callers of unavailable ref Jeff King
2009-05-25 10:40 ` [PATCH 2/2] fetch: report ref storage DF errors more accurately Jeff King
0 siblings, 2 replies; 8+ messages in thread
From: Jeff King @ 2009-04-29 8:06 UTC (permalink / raw)
To: Ingo Molnar; +Cc: git
On Wed, Apr 29, 2009 at 09:32:56AM +0200, Ingo Molnar wrote:
> > 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.
>
> it wasnt hard to figure out what's going on. So this was more of a
> FYI, not really a bug report. Maybe if someone tries to pull into a
> read-only repo the same could happen? My particular breakage (of a
> single ref being root-owned - the rest was mingo owned) is atypical
> enough to be ignored.
Actually, it is a little bit tough to get your breakage. A pure
read-only repo would error out much earlier (permission denied on
FETCH_HEAD or writing to object db). But if yours was just "accidentally
fetched once as root", then that doesn't seem too uncommon.
> If there's no easy/clean solution then please ignore my report.
I think the patch I posted isn't too bad. We'll see what others say.
-Peff
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 1/2] lock_ref: inform callers of unavailable ref
2009-04-29 8:06 ` Jeff King
@ 2009-05-25 10:37 ` Jeff King
2009-05-25 10:40 ` [PATCH 2/2] fetch: report ref storage DF errors more accurately Jeff King
1 sibling, 0 replies; 8+ messages in thread
From: Jeff King @ 2009-05-25 10:37 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git
One of the ways that locking might fail is that there is a
DF conflict between two refs (e.g., you want to lock
"foo/bar" but "foo" already exists). In this case, we return
an error, but there is no way for the caller to know the
specific problem.
This patch sets errno to ENOTDIR, which is the most sensible
code. It's what we would see if the refs were stored purely
in the filesystem (but these days we must check the
namespace manually due to packed refs).
Signed-off-by: Jeff King <peff@peff.net>
---
We introduce a caller who cares in the next patch.
refs.c | 4 +++-
1 files changed, 3 insertions(+), 1 deletions(-)
diff --git a/refs.c b/refs.c
index 45ad556..24438c6 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));
--
1.6.3.1.250.g01b8b.dirty
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 2/2] fetch: report ref storage DF errors more accurately
2009-04-29 8:06 ` Jeff King
2009-05-25 10:37 ` [PATCH 1/2] lock_ref: inform callers of unavailable ref Jeff King
@ 2009-05-25 10:40 ` Jeff King
2009-05-25 22:23 ` Junio C Hamano
1 sibling, 1 reply; 8+ messages in thread
From: Jeff King @ 2009-05-25 10:40 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git
When we fail to store a fetched ref, we recommend that the
user try running "git prune" to remove up any old refs that
have been deleted by the remote, which would clear up any DF
conflicts. However, ref storage might fail for other
reasons (e.g., permissions problems) in which case the
advice is useless and misleading.
This patch detects when there is an actual DF situation and
only issues the advice when one is found.
Signed-off-by: Jeff King <peff@peff.net>
---
This is a followup to Ingo's bug report here:
http://thread.gmane.org/gmane.comp.version-control.git/117751
builtin-fetch.c | 11 ++++++++---
1 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/builtin-fetch.c b/builtin-fetch.c
index 77acabf..1eec64e 100644
--- a/builtin-fetch.c
+++ b/builtin-fetch.c
@@ -167,6 +167,9 @@ static struct ref *get_ref_map(struct transport *transport,
return ref_map;
}
+#define STORE_REF_ERROR_OTHER 1
+#define STORE_REF_ERROR_DF_CONFLICT 2
+
static int s_update_ref(const char *action,
struct ref *ref,
int check_old)
@@ -181,9 +184,11 @@ 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 ? STORE_REF_ERROR_DF_CONFLICT :
+ STORE_REF_ERROR_OTHER;
if (write_ref_sha1(lock, ref->new_sha1, msg) < 0)
- return 2;
+ return errno == ENOTDIR ? STORE_REF_ERROR_DF_CONFLICT :
+ STORE_REF_ERROR_OTHER;
return 0;
}
@@ -386,7 +391,7 @@ static int store_updated_refs(const char *raw_url, const char *remote_name,
}
free(url);
fclose(fp);
- if (rc & 2)
+ if (rc & STORE_REF_ERROR_DF_CONFLICT)
error("some local refs could not be updated; try running\n"
" 'git remote prune %s' to remove any old, conflicting "
"branches", remote_name);
--
1.6.3.1.250.g01b8b.dirty
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 2/2] fetch: report ref storage DF errors more accurately
2009-05-25 10:40 ` [PATCH 2/2] fetch: report ref storage DF errors more accurately Jeff King
@ 2009-05-25 22:23 ` Junio C Hamano
0 siblings, 0 replies; 8+ messages in thread
From: Junio C Hamano @ 2009-05-25 22:23 UTC (permalink / raw)
To: Jeff King; +Cc: git
Thanks.
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2009-05-25 22:24 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-04-28 7:31 error: Unable to append to .git/logs/refs/remotes/origin/master: Permission denied Ingo Molnar
2009-04-29 3:29 ` Jeff King
2009-04-29 4:07 ` Jeff King
2009-04-29 7:32 ` Ingo Molnar
2009-04-29 8:06 ` Jeff King
2009-05-25 10:37 ` [PATCH 1/2] lock_ref: inform callers of unavailable ref Jeff King
2009-05-25 10:40 ` [PATCH 2/2] fetch: report ref storage DF errors more accurately Jeff King
2009-05-25 22:23 ` Junio C Hamano
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).