diff options
author | Shawn Pearce <spearce@spearce.org> | 2006-07-12 01:00:16 -0400 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2006-07-12 23:16:29 -0700 |
commit | 756aaf4ac5906e79b22001a96dd4f6aec0d1c89d (patch) | |
tree | 6965c8ab9c2f8830db0dc7efaa825a4eb2ce21dd | |
parent | d3ba675aae3c6c5722ad15cd9d0f3b7634e976ce (diff) | |
download | git-756aaf4ac5906e79b22001a96dd4f6aec0d1c89d.tar.gz git-756aaf4ac5906e79b22001a96dd4f6aec0d1c89d.tar.xz |
Make lazy mkdir more robust.
Linus Torvalds <torvalds@osdl.org> wrote:
It's entirely possible that we should just make that whole
if (ret == ENOENT)
go away. Yes, it's the right error code if a subdirectory is missing, and
yes, POSIX requires it, and yes, WXP is probably just a horrible piece of
sh*t, but on the other hand, I don't think git really has any serious
reason to even care.
-rw-r--r-- | sha1_file.c | 26 |
1 files changed, 12 insertions, 14 deletions
diff --git a/sha1_file.c b/sha1_file.c index 8734d501f..e666aec50 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -1331,31 +1331,29 @@ char *write_sha1_file_prepare(void *buf, static int link_temp_to_file(const char *tmpfile, char *filename) { int ret; + char *dir; if (!link(tmpfile, filename)) return 0; /* - * Try to mkdir the last path component if that failed - * with an ENOENT. + * Try to mkdir the last path component if that failed. * * Re-try the "link()" regardless of whether the mkdir * succeeds, since a race might mean that somebody * else succeeded. */ ret = errno; - if (ret == ENOENT) { - char *dir = strrchr(filename, '/'); - if (dir) { - *dir = 0; - mkdir(filename, 0777); - if (adjust_shared_perm(filename)) - return -2; - *dir = '/'; - if (!link(tmpfile, filename)) - return 0; - ret = errno; - } + dir = strrchr(filename, '/'); + if (dir) { + *dir = 0; + mkdir(filename, 0777); + if (adjust_shared_perm(filename)) + return -2; + *dir = '/'; + if (!link(tmpfile, filename)) + return 0; + ret = errno; } return ret; } |