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
}