diff options
author | Brad King <brad.king@kitware.com> | 2010-01-08 22:36:41 -0500 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2010-01-09 23:43:22 -0800 |
commit | 40c813e00c8de5725c7a6bb127fadedcce1f788f (patch) | |
tree | f32db8685fc9f12f07f05b9a8440d8d64791d64d | |
parent | 48cc95ed4a5c4554f8914af3f300558da31a22dc (diff) | |
download | git-40c813e00c8de5725c7a6bb127fadedcce1f788f.tar.gz |
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>
-rw-r--r-- | setup.c | 22 | ||||
-rwxr-xr-x | t/t2104-update-index-gitfile.sh | 2 |
2 files changed, 20 insertions, 4 deletions
@@ -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; } diff --git a/t/t2104-update-index-gitfile.sh b/t/t2104-update-index-gitfile.sh index ba719846a6..641607d89a 100755 --- a/t/t2104-update-index-gitfile.sh +++ b/t/t2104-update-index-gitfile.sh @@ -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 ' |