From 9ce2e7b317277b1a27bbcef77fab4d053019b8d8 Mon Sep 17 00:00:00 2001 From: Edward Thomson Date: Thu, 17 Sep 2015 12:48:37 -0400 Subject: [PATCH] `mkdir`: cope with root path on win32 --- src/fileops.c | 7 ++++--- src/path.h | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/fileops.c b/src/fileops.c index 739a98fc4..57d2ce9c3 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 c76e90343..7e156fce8 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);