From: Lars Hjemli Date: Wed, 20 Feb 2008 22:13:14 +0000 (+0100) Subject: Teach resolve_gitlink_ref() about the .git file X-Git-Tag: v1.5.6-rc0~93^2~2 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=842abf0;p=git.git Teach resolve_gitlink_ref() about the .git file When .git in a submodule is a file, resolve_gitlink_ref() needs to pick up the real GIT_DIR of the submodule from that file. Signed-off-by: Lars Hjemli Signed-off-by: Junio C Hamano --- diff --git a/refs.c b/refs.c index 1b0050eee..a81fb291f 100644 --- a/refs.c +++ b/refs.c @@ -352,6 +352,7 @@ int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *re { int len = strlen(path), retval; char *gitdir; + const char *tmp; while (len && path[len-1] == '/') len--; @@ -359,9 +360,19 @@ int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *re return -1; gitdir = xmalloc(len + MAXREFLEN + 8); memcpy(gitdir, path, len); - memcpy(gitdir + len, "/.git/", 7); - - retval = resolve_gitlink_ref_recursive(gitdir, len+6, refname, result, 0); + memcpy(gitdir + len, "/.git", 6); + len += 5; + + tmp = read_gitfile_gently(gitdir); + if (tmp) { + free(gitdir); + len = strlen(tmp); + gitdir = xmalloc(len + MAXREFLEN + 3); + memcpy(gitdir, tmp, len); + } + gitdir[len] = '/'; + gitdir[++len] = '\0'; + retval = resolve_gitlink_ref_recursive(gitdir, len, refname, result, 0); free(gitdir); return retval; }