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.
This commit is contained in:
Shawn Pearce 2006-07-12 01:00:16 -04:00 committed by Junio C Hamano
parent d3ba675aae
commit 756aaf4ac5

View File

@ -1331,31 +1331,29 @@ char *write_sha1_file_prepare(void *buf,
static int link_temp_to_file(const char *tmpfile, char *filename) static int link_temp_to_file(const char *tmpfile, char *filename)
{ {
int ret; int ret;
char *dir;
if (!link(tmpfile, filename)) if (!link(tmpfile, filename))
return 0; return 0;
/* /*
* Try to mkdir the last path component if that failed * Try to mkdir the last path component if that failed.
* with an ENOENT.
* *
* Re-try the "link()" regardless of whether the mkdir * Re-try the "link()" regardless of whether the mkdir
* succeeds, since a race might mean that somebody * succeeds, since a race might mean that somebody
* else succeeded. * else succeeded.
*/ */
ret = errno; ret = errno;
if (ret == ENOENT) { dir = strrchr(filename, '/');
char *dir = strrchr(filename, '/'); if (dir) {
if (dir) { *dir = 0;
*dir = 0; mkdir(filename, 0777);
mkdir(filename, 0777); if (adjust_shared_perm(filename))
if (adjust_shared_perm(filename)) return -2;
return -2; *dir = '/';
*dir = '/'; if (!link(tmpfile, filename))
if (!link(tmpfile, filename)) return 0;
return 0; ret = errno;
ret = errno;
}
} }
return ret; return ret;
} }