@matheusbsbs / matheus-bagliano / commits / 842abf06f3
Fork 0

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 <hjemli@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Lars Hjemli committed Feb 20, 2008 at 23:13 UTC 842abf06f36b5b31050db6406265972e3e1cc189
1 file changed +14 -3
refs.c
+14 -3
@@ -352,6 +352,7 @@ int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *re
352 {
353 int len = strlen(path), retval;
354 char *gitdir;
355 + const char *tmp;
356
357 while (len && path[len-1] == '/')
358 len--;
@@ -359,9 +360,19 @@ int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *re
360 return -1;
361 gitdir = xmalloc(len + MAXREFLEN + 8);
362 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);
376 free(gitdir);
377 return retval;
378 }