X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=sha1_file.c;h=3d11a9bfdc56c00056c2057af5e6455742ab31f5;hb=d60fc1c8649f80c006b9f493c542461e81608d4b;hp=20f6419bde22ee81b69f02e0336ecf92aa2e1323;hpb=949964c4af740015c53cb7630fea8795e0f710a0;p=git.git diff --git a/sha1_file.c b/sha1_file.c index 20f6419b..3d11a9bf 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -6,8 +6,6 @@ * This handles basic git sha1 object files - packing, unpacking, * creation etc. */ -#include -#include #include "cache.h" #include "delta.h" #include "pack.h" @@ -74,6 +72,8 @@ int adjust_shared_perm(const char *path) int safe_create_leading_directories(char *path) { char *pos = path; + struct stat st; + if (*pos == '/') pos++; @@ -82,12 +82,17 @@ int safe_create_leading_directories(char *path) if (!pos) break; *pos = 0; - if (mkdir(path, 0777) < 0) { - if (errno != EEXIST) { + if (!stat(path, &st)) { + /* path exists */ + if (!S_ISDIR(st.st_mode)) { *pos = '/'; - return -1; + return -3; } } + else if (mkdir(path, 0777)) { + *pos = '/'; + return -1; + } else if (adjust_shared_perm(path)) { *pos = '/'; return -2;