This patch adds convenience functions to work with absolute paths. The function is_absolute_path() should help the efforts to integrate the MinGW fork. Note that make_absolute_path() returns a pointer to a static buffer. Given a path which possibly contains "/../" and "/./", or which end in "/", normalize_path() returns a normalized path. Signed-off-by: Johannes Schindelin <johannes.schindelin@xxxxxx> --- cache.h | 6 ++++++ path.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 0 deletions(-) diff --git a/cache.h b/cache.h index 53801b8..b242147 100644 --- a/cache.h +++ b/cache.h @@ -358,6 +358,12 @@ int git_config_perm(const char *var, const char *value); int adjust_shared_perm(const char *path); int safe_create_leading_directories(char *path); char *enter_repo(char *path, int strict); +static inline int is_absolute_path(const char *path) +{ + return path[0] == '/'; +} +const char *make_absolute_path(const char *path); +char *normalize_path(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 c4ce962..92ce688 100644 --- a/path.c +++ b/path.c @@ -292,3 +292,57 @@ int adjust_shared_perm(const char *path) return -2; return 0; } + +const char *make_absolute_path(const char *path) +{ + static char buf[PATH_MAX]; + const int size = sizeof(buf); + int len; + + if (is_absolute_path(path)) + return path; + + if (!getcwd(buf, size)) + die ("Could not get current working directory"); + if (!strcmp(path, ".")) + return buf; + + len = strlen(buf); + if (snprintf(buf + len, size - len, "/%s", path) > size - 1) + die ("Could not make absolute path from '%s'", path); + return normalize_path(buf); +} + +/* strip out .. and . */ +char *normalize_path(char *path) +{ + int i, j; + + for (i = 0, j = 0; path[i]; i++, j++) { + if (path[i] == '.') { + if (path[i + 1] == '/') { + i++; j--; + continue; + } + if (path[i + 1] == '.' && (path[i + 2] == '/' || + !path[i + 2])) { + i += 1 + !!path[i + 2]; + j--; + while (j > 0 && path[--j] != '/') + ; /* do nothing */ + continue; + } + } + for (; path[i + 1]; i++, j++) { + path[j] = path[i]; + if (path[i] == '/') + break; + } + path[j] = path[i]; + } + if (j > 0 && path[j - 1] == '/') + j--; + path[j] = '\0'; + + return path; +} -- 1.5.3.rc2.42.gda8d-dirty - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html