Re: [PATCH 2/2] Teach "git-read-tree -u" to check out submodules as a directory
From: Junio C Hamano <hidden>
Date: 2016-06-15 22:43:04
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: