summaryrefslogtreecommitdiff
path: root/setup.c
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2010-01-08 22:36:41 -0500
committerJunio C Hamano <gitster@pobox.com>2010-01-09 23:43:22 -0800
commit40c813e00c8de5725c7a6bb127fadedcce1f788f (patch)
treef32db8685fc9f12f07f05b9a8440d8d64791d64d /setup.c
parent48cc95ed4a5c4554f8914af3f300558da31a22dc (diff)
downloadgit-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>
Diffstat (limited to 'setup.c')
-rw-r--r--setup.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/setup.c b/setup.c
index 2cf0f19937..7fc4251713 100644
--- a/setup.c
+++ b/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;
}