Handle relative paths in submodule .git files

Commit 842abf0 (Teach resolve_gitlink_ref() about the .git file, 2008-02-20)
taught resolve_gitlink_ref() to call read_gitfile_gently() to resolve .git
files.  In this commit teach read_gitfile_gently() to interpret a relative
path in a .git file with respect to the file location.

This change allows update-index to recognize a submodule that uses a relative
path in its .git file.  It previously failed because the relative path was
wrongly interpreted with respect to the superproject directory.

Signed-off-by: Brad King <brad.king@kitware.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Brad King 2010-01-08 22:36:41 -05:00 коммит произвёл Junio C Hamano
Родитель 48cc95ed4a
Коммит 40c813e00c
2 изменённых файлов: 20 добавлений и 4 удалений

22
setup.c
Просмотреть файл

@ -252,6 +252,8 @@ static int check_repository_format_gently(int *nongit_ok)
const char *read_gitfile_gently(const char *path)
{
char *buf;
char *dir;
const char *slash;
struct stat st;
int fd;
size_t len;
@ -276,9 +278,23 @@ const char *read_gitfile_gently(const char *path)
if (len < 9)
die("No path in gitfile: %s", path);
buf[len] = '\0';
if (!is_git_directory(buf + 8))
die("Not a git repository: %s", buf + 8);
path = make_absolute_path(buf + 8);
dir = buf + 8;
if (!is_absolute_path(dir) && (slash = strrchr(path, '/'))) {
size_t pathlen = slash+1 - path;
size_t dirlen = pathlen + len - 8;
dir = xmalloc(dirlen + 1);
strncpy(dir, path, pathlen);
strncpy(dir + pathlen, buf + 8, len - 8);
dir[dirlen] = '\0';
free(buf);
buf = dir;
}
if (!is_git_directory(dir))
die("Not a git repository: %s", dir);
path = make_absolute_path(dir);
free(buf);
return path;
}

Просмотреть файл

@ -31,7 +31,7 @@ test_expect_success 'submodule with relative .git file' '
test_commit first)
'
test_expect_failure 'add gitlink to relative .git file' '
test_expect_success 'add gitlink to relative .git file' '
git update-index --add -- sub2
'