summaryrefslogtreecommitdiff
path: root/path.c
diff options
context:
space:
mode:
authorDaniel Barkalow <barkalow@iabervon.org>2008-06-05 23:15:19 -0400
committerJunio C Hamano <gitster@pobox.com>2008-06-06 11:23:10 -0700
commit1b9a9467f8b9a8da2fe58d10ae16779492aa7737 (patch)
treec15c63ad7811864c4845e3466e25431a98202cfd /path.c
parent9e1f0a85c68323830ea117092c55192b17aa3ac8 (diff)
downloadgit-1b9a9467f8b9a8da2fe58d10ae16779492aa7737.tar.gz
Use nonrelative paths instead of absolute paths for cloned repositories
Particularly for the "alternates" file, if one will be created, we want a path that doesn't depend on the current directory, but we want to retain any symlinks in the path as given and any in the user's view of the current directory when the path was given. Signed-off-by: Daniel Barkalow <barkalow@iabervon.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'path.c')
-rw-r--r--path.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/path.c b/path.c
index b7c24a2aac..4945f2abc5 100644
--- a/path.c
+++ b/path.c
@@ -291,6 +291,42 @@ int adjust_shared_perm(const char *path)
return 0;
}
+static const char *get_pwd_cwd(void)
+{
+ static char cwd[PATH_MAX + 1];
+ char *pwd;
+ struct stat cwd_stat, pwd_stat;
+ if (getcwd(cwd, PATH_MAX) == NULL)
+ return NULL;
+ pwd = getenv("PWD");
+ if (pwd && strcmp(pwd, cwd)) {
+ stat(cwd, &cwd_stat);
+ if (!stat(pwd, &pwd_stat) &&
+ pwd_stat.st_dev == cwd_stat.st_dev &&
+ pwd_stat.st_ino == cwd_stat.st_ino) {
+ strlcpy(cwd, pwd, PATH_MAX);
+ }
+ }
+ return cwd;
+}
+
+const char *make_nonrelative_path(const char *path)
+{
+ static char buf[PATH_MAX + 1];
+
+ if (path[0] == '/') {
+ if (strlcpy(buf, path, PATH_MAX) >= PATH_MAX)
+ die ("Too long path: %.*s", 60, path);
+ } else {
+ const char *cwd = get_pwd_cwd();
+ if (!cwd)
+ die("Cannot determine the current working directory");
+ if (snprintf(buf, PATH_MAX, "%s/%s", cwd, path) >= PATH_MAX)
+ die ("Too long path: %.*s", 60, path);
+ }
+ return buf;
+}
+
/* We allow "recursive" symbolic links. Only within reason, though. */
#define MAXDEPTH 5