Skip to content

Commit 842abf0

Browse files
hjemligitster
authored andcommitted
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 <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent b44ebb1 commit 842abf0

File tree

1 file changed

+14
-3
lines changed

1 file changed

+14
-3
lines changed

refs.c

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -352,16 +352,27 @@ int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *re
352352
{
353353
int len = strlen(path), retval;
354354
char *gitdir;
355+
const char *tmp;
355356

356357
while (len && path[len-1] == '/')
357358
len--;
358359
if (!len)
359360
return -1;
360361
gitdir = xmalloc(len + MAXREFLEN + 8);
361362
memcpy(gitdir, path, len);
362-
memcpy(gitdir + len, "/.git/", 7);
363-
364-
retval = resolve_gitlink_ref_recursive(gitdir, len+6, refname, result, 0);
363+
memcpy(gitdir + len, "/.git", 6);
364+
len += 5;
365+
366+
tmp = read_gitfile_gently(gitdir);
367+
if (tmp) {
368+
free(gitdir);
369+
len = strlen(tmp);
370+
gitdir = xmalloc(len + MAXREFLEN + 3);
371+
memcpy(gitdir, tmp, len);
372+
}
373+
gitdir[len] = '/';
374+
gitdir[++len] = '\0';
375+
retval = resolve_gitlink_ref_recursive(gitdir, len, refname, result, 0);
365376
free(gitdir);
366377
return retval;
367378
}

0 commit comments

Comments
 (0)