From: Geert Bosch Date: Thu, 12 Apr 2007 20:29:10 GMT Subject: [PATCH] create_directories: simplify and avoid repeated copying Message-ID: <20070414013003.B0B4C2F1DC3@geert-boschs-computer.local> Signed-off-by: Geert Bosch --- 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