diff options
author | Jason Riedy <ejr@EECS.Berkeley.EDU> | 2006-02-09 17:56:13 -0800 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2006-02-09 18:38:52 -0800 |
commit | 67d42212ff104aaafa97b943cb369b8444f61581 (patch) | |
tree | bb274c269ed074409f0119690ddf788ee9a1b797 | |
parent | ce1610ead63221738225c415300f3d32620ced04 (diff) | |
download | git-67d42212ff104aaafa97b943cb369b8444f61581.tar.gz git-67d42212ff104aaafa97b943cb369b8444f61581.tar.xz |
stat() for existence in safe_create_leading_directories()
Use stat() to explicitly check for existence rather than
relying on the non-portable EEXIST error in sha1_file.c's
safe_create_leading_directories(). There certainly are
optimizations possible, but then the code becomes almost
the same as that in coreutil's lib/mkdir-p.c.
Other uses of EEXIST seem ok. Tested on Solaris 8, AIX 5.2L,
and a few Linux versions. AIX has some unrelated (I think)
failures right now; I haven't tried many recent gits there.
Anyone have an old Ultrix box to break everything? ;)
Also remove extraneous #includes. Everything's already in
git-compat-util.h, included through cache.h.
Signed-off-by: Jason Riedy <ejr@cs.berkeley.edu>
Signed-off-by: Junio C Hamano <junkio@cox.net>
-rw-r--r-- | sha1_file.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/sha1_file.c b/sha1_file.c index 20f6419bd..3d11a9bfd 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 <sys/types.h> -#include <dirent.h> #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; |