Skip to content

Commit

Permalink
Use nonrelative paths instead of absolute paths for cloned repositories
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Daniel Barkalow authored and Junio C Hamano committed Jun 6, 2008
1 parent 9e1f0a8 commit 1b9a946
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 2 deletions.
4 changes: 2 additions & 2 deletions builtin-clone.c
Original file line number Diff line number Diff line change
Expand Up @@ -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));
}
}

Expand All @@ -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));
}
}

Expand Down
1 change: 1 addition & 0 deletions cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 *);
Expand Down
36 changes: 36 additions & 0 deletions path.c
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down

0 comments on commit 1b9a946

Please sign in to comment.