diff options
author | Junio C Hamano <gitster@pobox.com> | 2008-06-22 14:33:53 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2008-06-22 14:33:53 -0700 |
commit | 8bcff62baf7a17864620964c60d3a02d7c5b8d77 (patch) | |
tree | 16af8e6acf176389ea22102a316e376192b44adc | |
parent | Merge branch 'jk/test' (diff) | |
parent | Make git_dir a path relative to work_tree in setup_work_tree() (diff) | |
download | tgif-8bcff62baf7a17864620964c60d3a02d7c5b8d77.tar.xz |
Merge branch 'lt/maint-gitdir-relative'
* lt/maint-gitdir-relative:
Make git_dir a path relative to work_tree in setup_work_tree()
-rw-r--r-- | cache.h | 1 | ||||
-rw-r--r-- | path.c | 17 | ||||
-rw-r--r-- | setup.c | 3 |
3 files changed, 20 insertions, 1 deletions
@@ -525,6 +525,7 @@ static inline int is_absolute_path(const char *path) } const char *make_absolute_path(const char *path); const char *make_nonrelative_path(const char *path); +const char *make_relative_path(const char *abs, const char *base); /* Read and unpack a sha1 file into memory, write memory to a sha1 file */ extern int sha1_object_info(const unsigned char *, unsigned long *); @@ -330,6 +330,23 @@ const char *make_nonrelative_path(const char *path) /* We allow "recursive" symbolic links. Only within reason, though. */ #define MAXDEPTH 5 +const char *make_relative_path(const char *abs, const char *base) +{ + static char buf[PATH_MAX + 1]; + int baselen; + if (!base) + return abs; + baselen = strlen(base); + if (prefixcmp(abs, base)) + return abs; + if (abs[baselen] == '/') + baselen++; + else if (base[baselen - 1] != '/') + return abs; + strcpy(buf, abs + baselen); + return buf; +} + const char *make_absolute_path(const char *path) { static char bufs[2][PATH_MAX + 1], *buf = bufs[0], *next_buf = bufs[1]; @@ -292,9 +292,10 @@ void setup_work_tree(void) work_tree = get_git_work_tree(); git_dir = get_git_dir(); if (!is_absolute_path(git_dir)) - set_git_dir(make_absolute_path(git_dir)); + git_dir = make_absolute_path(git_dir); if (!work_tree || chdir(work_tree)) die("This operation must be run in a work tree"); + set_git_dir(make_relative_path(git_dir, work_tree)); initialized = 1; } |