Linus Torvalds [off-list ref] writes:
quoted hunk
@@ -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: