]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Use nonrelative paths instead of absolute paths for cloned repositories
authorDaniel Barkalow <barkalow@iabervon.org>
Fri, 6 Jun 2008 03:15:19 +0000 (23:15 -0400)
committerJunio C Hamano <gitster@pobox.com>
Fri, 6 Jun 2008 18:23:10 +0000 (11:23 -0700)
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>
builtin-clone.c
cache.h
path.c

index f4accbe541dc36d9c80b0bce63c3247af8abf4a0..71909520710ab046fe04723f5a25ac9a53374025 100644 (file)
@@ -76,7 +76,7 @@ static char *get_repo_path(const char *repo, int *is_bundle)
                path = mkpath("%s%s", repo, suffix[i]);
                if (!stat(path, &st) && S_ISDIR(st.st_mode)) {
                        *is_bundle = 0;
-                       return xstrdup(make_absolute_path(path));
+                       return xstrdup(make_nonrelative_path(path));
                }
        }
 
@@ -85,7 +85,7 @@ static char *get_repo_path(const char *repo, int *is_bundle)
                path = mkpath("%s%s", repo, bundle_suffix[i]);
                if (!stat(path, &st) && S_ISREG(st.st_mode)) {
                        *is_bundle = 1;
-                       return xstrdup(make_absolute_path(path));
+                       return xstrdup(make_nonrelative_path(path));
                }
        }
 
diff --git a/cache.h b/cache.h
index 092a997b073090e14feaa4825e821af040101eb6..0a63c0eae60ea41025b153874e9dbbbb0523f6b7 100644 (file)
--- a/cache.h
+++ b/cache.h
@@ -524,6 +524,7 @@ static inline int is_absolute_path(const char *path)
        return path[0] == '/';
 }
 const char *make_absolute_path(const char *path);
+const char *make_nonrelative_path(const char *path);
 
 /* Read and unpack a sha1 file into memory, write memory to a sha1 file */
 extern int sha1_object_info(const unsigned char *, unsigned long *);
diff --git a/path.c b/path.c
index b7c24a2aacf87ffea6bd6380dbff44e5d317b240..4945f2abc50be08aa5e0cc2f9be562c74c47b9d7 100644 (file)
--- 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