Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> writes: > @@ -136,8 +147,13 @@ static int write_entry(struct cache_entry *ce, char *path, struct checkout *stat > "symlink %s (%s)", path, strerror(errno)); > } > break; > + case S_IFDIRLNK: > + if (to_tempfile) > + return error("git-checkout-index: cannot create temporary subproject %s", path); > + if (mkdir(path, 0777) < 0) > + return error("git-checkout-index: cannot create subproject directory %s", path); > + break; > default: > return error("git-checkout-index: unknown file mode for %s", path); > } > Hmm. Perhaps something like this on top? diff --git a/entry.c b/entry.c index 9545e89..0874d61 100644 --- a/entry.c +++ b/entry.c @@ -1,6 +1,23 @@ #include "cache.h" #include "blob.h" +static int make_directory(const char *path, int unlink_as_needed) +{ + if (mkdir(path, 0777) < 0) { + if (errno == EEXIST) { + struct stat st; + if (unlink_as_needed && + !unlink(path) && + !mkdir(path, 0777)) + return 0; /* ok */ + if (!stat(path, &st) && S_ISDIR(st.st_mode)) + return 0; /* ok */ + } + return -1; + } + return 0; +} + static void create_directories(const char *path, struct checkout *state) { int len = strlen(path); @@ -8,19 +25,14 @@ static void create_directories(const char *path, struct checkout *state) const char *slash = path; while ((slash = strchr(slash+1, '/')) != NULL) { + int unlink_as_needed; + len = slash - path; memcpy(buf, path, len); buf[len] = 0; - if (mkdir(buf, 0777)) { - if (errno == EEXIST) { - struct stat st; - if (len > state->base_dir_len && state->force && !unlink(buf) && !mkdir(buf, 0777)) - continue; - if (!stat(buf, &st) && S_ISDIR(st.st_mode)) - continue; /* ok */ - } + unlink_as_needed = (state->base_dir_len < len && state->force); + if (make_directory(buf, unlink_as_needed) < 0) die("cannot create directory at %s", buf); - } } free(buf); } @@ -150,7 +162,7 @@ static int write_entry(struct cache_entry *ce, char *path, struct checkout *stat case S_IFDIRLNK: if (to_tempfile) return error("git-checkout-index: cannot create temporary subproject %s", path); - if (mkdir(path, 0777) < 0) + if (make_directory(path, 0)) return error("git-checkout-index: cannot create subproject directory %s", path); break; default: - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html