Commit 9ce2e7b317277b1a27bbcef77fab4d053019b8d8

Edward Thomson 2015-09-17T12:48:37

`mkdir`: cope with root path on win32

diff --git a/src/fileops.c b/src/fileops.c
index 739a98f..57d2ce9 100644
--- a/src/fileops.c
+++ b/src/fileops.c
@@ -408,7 +408,7 @@ int git_futils_mkdir(
 	struct git_futils_mkdir_options opts = { 0 };
 	struct stat st;
 	size_t depth = 0;
-	int len = 0, error;
+	int len = 0, root_len, error;
 
 	if ((error = git_buf_puts(&make_path, path)) < 0 ||
 		(error = mkdir_canonicalize(&make_path, flags)) < 0 ||
@@ -416,6 +416,8 @@ int git_futils_mkdir(
 		make_path.size == 0)
 		goto done;
 
+	root_len = git_path_root(make_path.ptr);
+
 	/* find the first parent directory that exists.  this will be used
 	 * as the base to dirname_relative.
 	 */
@@ -442,8 +444,7 @@ int git_futils_mkdir(
 		/* we've walked all the given path's parents and it's either relative
 		 * or rooted.  either way, give up and make the entire path.
 		 */
-		if (len == 1 &&
-			(parent_path.ptr[0] == '.' || parent_path.ptr[0] == '/')) {
+		if ((len == 1 && parent_path.ptr[0] == '.') || len == root_len+1) {
 			relative = make_path.ptr;
 			break;
 		}
diff --git a/src/path.h b/src/path.h
index c76e903..7e156fc 100644
--- a/src/path.h
+++ b/src/path.h
@@ -72,7 +72,7 @@ extern const char *git_path_topdir(const char *path);
  * This will return a number >= 0 which is the offset to the start of the
  * path, if the path is rooted (i.e. "/rooted/path" returns 0 and
  * "c:/windows/rooted/path" returns 2).  If the path is not rooted, this
- * returns < 0.
+ * returns -1.
  */
 extern int git_path_root(const char *path);