Commit 87ac556f by Vicent Martí

Merge pull request #720 from nulltoken/fix/libgit2sharp_issue_153

Make git_futils_mkdir_r() able to cope with Windows network paths
parents c4c9de6a dc07184f
...@@ -241,28 +241,36 @@ void git_futils_mmap_free(git_map *out) ...@@ -241,28 +241,36 @@ void git_futils_mmap_free(git_map *out)
int git_futils_mkdir_r(const char *path, const char *base, const mode_t mode) int git_futils_mkdir_r(const char *path, const char *base, const mode_t mode)
{ {
int root_path_offset;
git_buf make_path = GIT_BUF_INIT; git_buf make_path = GIT_BUF_INIT;
size_t start; size_t start = 0;
char *pp, *sp; char *pp, *sp;
bool failed = false; bool failed = false;
if (base != NULL) { if (base != NULL) {
/*
* when a base is being provided, it is supposed to already exist.
* Therefore, no attempt is being made to recursively create this leading path
* segment. It's just skipped. */
start = strlen(base); start = strlen(base);
if (git_buf_joinpath(&make_path, base, path) < 0) if (git_buf_joinpath(&make_path, base, path) < 0)
return -1; return -1;
} else { } else {
start = 0; int root_path_offset;
if (git_buf_puts(&make_path, path) < 0) if (git_buf_puts(&make_path, path) < 0)
return -1; return -1;
root_path_offset = git_path_root(make_path.ptr);
if (root_path_offset > 0) {
/*
* On Windows, will skip the drive name (eg. C: or D:)
* or the leading part of a network path (eg. //computer_name ) */
start = root_path_offset;
}
} }
pp = make_path.ptr + start; pp = make_path.ptr + start;
root_path_offset = git_path_root(make_path.ptr);
if (root_path_offset > 0)
pp += root_path_offset; /* On Windows, will skip the drive name (eg. C: or D:) */
while (!failed && (sp = strchr(pp, '/')) != NULL) { while (!failed && (sp = strchr(pp, '/')) != NULL) {
if (sp != pp && git_path_isdir(make_path.ptr) == false) { if (sp != pp && git_path_isdir(make_path.ptr) == false) {
*sp = 0; *sp = 0;
......
...@@ -49,6 +49,9 @@ extern int git_futils_creat_locked_withpath(const char *path, const mode_t dirmo ...@@ -49,6 +49,9 @@ extern int git_futils_creat_locked_withpath(const char *path, const mode_t dirmo
/** /**
* Create a path recursively * Create a path recursively
*
* If a base parameter is being passed, it's expected to be valued with a path pointing to an already
* exisiting directory.
*/ */
extern int git_futils_mkdir_r(const char *path, const char *base, const mode_t mode); extern int git_futils_mkdir_r(const char *path, const char *base, const mode_t mode);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment