On Sun, Jan 18, 2009 at 01:27:44PM -0800, Junio C Hamano wrote: > Junio C Hamano <gitster@xxxxxxxxx> writes: > > > I think (1) the solution (almost) makes sense, (2) the patch needs to be > > explained a lot better as you mentioned in your two messages, and (3) if > > it does not affect any other case than when you are in a subdirectory of > > the .git/ directory, then you are doing something funny anyway and > > performance issue Dscho mentions, if any, is not a concern. > > > > My "(almost)" in (1) above is because the patch uses this new behaviour > > even when you are inside the .git/ directory itself (or at the root of a > > bare repository), which is a very common case that we do not have to nor > > want to change the behaviour. It also invalidates the precondition of (3) > > above. > > And this is a trivial follow-up on top of Szeder's patch. Thanks. In the meantime I was working on a patch that sets relative path in this case, too. I got it almost working: all tests passed except '.git/objects/: is-bare-repository' in 't1500-rev-parse'. I couldn't figure it out why this test failed, however. In case somebody might be interested for such an uncommon case, the patch is below. Best, Gábor setup.c | 17 +++++++++++++++-- 1 files changed, 15 insertions(+), 2 deletions(-) diff --git a/setup.c b/setup.c index 6b277b6..b4d37d7 100644 --- a/setup.c +++ b/setup.c @@ -375,7 +375,7 @@ const char *setup_git_directory_gently(int *nongit_ok) static char cwd[PATH_MAX+1]; const char *gitdirenv; const char *gitfile_dir; - int len, offset, ceil_offset; + int len, offset, ceil_offset, cdup_count = 0; /* * Let's assume that we are in a git repository. @@ -453,10 +453,22 @@ const char *setup_git_directory_gently(int *nongit_ok) if (is_git_directory(DEFAULT_GIT_DIR_ENVIRONMENT)) break; if (is_git_directory(".")) { + char gd_rel_path[PATH_MAX]; inside_git_dir = 1; if (!work_tree_env) inside_work_tree = 0; - setenv(GIT_DIR_ENVIRONMENT, ".", 1); + if (cdup_count) { + char *p = gd_rel_path; + while (cdup_count-- > 1) { + *p++ = '.'; *p++ = '.'; *p++ = '/'; + } + *p++ = '.'; *p++ = '.'; + *p = '\0'; + } else { + gd_rel_path[0] = '.'; + gd_rel_path[1] = '\0'; + } + setenv(GIT_DIR_ENVIRONMENT, gd_rel_path, 1); check_repository_format_gently(nongit_ok); return NULL; } @@ -472,6 +484,7 @@ const char *setup_git_directory_gently(int *nongit_ok) } if (chdir("..")) die("Cannot change to %s/..: %s", cwd, strerror(errno)); + cdup_count++; } inside_git_dir = 0; -- 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