Junio C Hamano wrote: > I think it is sane to abort with "permission denied", as it is "not a git > repository" but it is "we cannot even determine if that .git we see is a > git repository, and if it is, then we cannot do any git operation here as > we cannot read it". As to what you call "the current work flow", I think > it is not like we _support_ such usage, but more like it _happens to_ work > that way. Here's a patch. This doesn't address the issue of a damaged repository, but just catches access errors and permissions. >From 8f1c8f4d572fe62a26d1fca47abc976e78942697 Mon Sep 17 00:00:00 2001 From: William Pursell <bill.pursell@xxxxxxxxx> Date: Tue, 8 Jun 2010 00:16:43 -1000 Subject: [PATCH] Terminate on access errors This changes the way git finds a repository. Previously, if access is denied to .git (or $GIT_DIR), git will use the object directory in a higher level directory. With this patch, git will instead terminate and emit an error message indicating the access failure. Also, other errors (such as soft-link loops in GIT_OBJECT_DIRECTORIES) will cause termination. Signed-off-by: William Pursell <bill.pursell@xxxxxxxxx> --- setup.c | 18 +++++++++++++++--- 1 files changed, 15 insertions(+), 3 deletions(-) diff --git a/setup.c b/setup.c index 7e04602..a53331c 100644 --- a/setup.c +++ b/setup.c @@ -155,6 +155,18 @@ const char **get_pathspec(const char *prefix, const char **pathspec) } /* + * Wrapper around access that terminates on + * errors other than ENOENT. + */ +static int xaccess(const char *path, int amode) +{ + int status = access(path, amode); + if (status && errno != ENOENT) + die_errno("%s", path); + return status; +} + +/* * Test if it looks like we're at a git directory. * We want to see: * @@ -172,17 +184,17 @@ static int is_git_directory(const char *suspect) strcpy(path, suspect); if (getenv(DB_ENVIRONMENT)) { - if (access(getenv(DB_ENVIRONMENT), X_OK)) + if (xaccess(getenv(DB_ENVIRONMENT), X_OK)) return 0; } else { strcpy(path + len, "/objects"); - if (access(path, X_OK)) + if (xaccess(path, X_OK)) return 0; } strcpy(path + len, "/refs"); - if (access(path, X_OK)) + if (xaccess(path, X_OK)) return 0; strcpy(path + len, "/HEAD"); -- 1.7.1.245.g7c42e.dirty -- William Pursell -- 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