[PATCH] create_directories: simplify and avoid repeated copying
From: Geert Bosch <hidden>
Date: 2016-06-15 22:43:04
Subsystem:
the rest · Maintainer:
Linus Torvalds
Signed-off-by: Geert Bosch <redacted> --- I needed to change the logic of this function a bit for doing some local hacks^Wmodifications and thought it might be a slight improvement/simplification. No change in functionality and passed 'make test'. entry.c | 23 +++++++++-------------- 1 files changed, 9 insertions(+), 14 deletions(-)
diff --git a/entry.c b/entry.c
index d72f811..f966c59 100644
--- a/entry.c
+++ b/entry.c@@ -3,24 +3,19 @@ static void create_directories(const char *path, struct checkout *state) { - int len = strlen(path); - char *buf = xmalloc(len + 1); - const char *slash = path; + char *buf = xstrdup(path); + char *slash = buf; while ((slash = strchr(slash+1, '/')) != NULL) { - len = slash - path; - memcpy(buf, path, len); - buf[len] = 0; + *slash = 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 */ - } - die("cannot create directory at %s", buf); + struct stat st; + int force = (slash - buf) > state->base_dir_len && state->force; + if (errno != EEXIST || ((!force || unlink(buf) || mkdir(buf, 0777)) && + (stat(buf, &st) || !S_ISDIR(st.st_mode)))) + die("cannot create directory at %s", buf); } + *slash='/'; } free(buf); }
--
1.5.1