diff options
author | Junio C Hamano <gitster@pobox.com> | 2007-07-18 17:00:36 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2007-07-18 17:00:36 -0700 |
commit | c1c10a3f272ec0908e63bc105a5ffe94c1279fba (patch) | |
tree | e81e4266bdc05f7015507d89aa357e8cc2005308 /entry.c | |
parent | 726f9bced9717fb8b3c1e91228be1cdce514a98e (diff) | |
parent | 281a53bb79786a6d7e54f9715cc8ad46fc2bdb0e (diff) | |
download | git-c1c10a3f272ec0908e63bc105a5ffe94c1279fba.tar.gz |
Merge branch 'maint'
* maint:
Force listingblocks to be monospaced in manpages
Do not expect unlink(2) to fail on a directory.
Diffstat (limited to 'entry.c')
-rw-r--r-- | entry.c | 37 |
1 files changed, 30 insertions, 7 deletions
@@ -8,17 +8,40 @@ static void create_directories(const char *path, const struct checkout *state) const char *slash = path; while ((slash = strchr(slash+1, '/')) != NULL) { + struct stat st; + int stat_status; + len = slash - path; memcpy(buf, path, len); buf[len] = 0; + + if (len <= state->base_dir_len) + /* + * checkout-index --prefix=<dir>; <dir> is + * allowed to be a symlink to an existing + * directory. + */ + stat_status = stat(buf, &st); + else + /* + * if there currently is a symlink, we would + * want to replace it with a real directory. + */ + stat_status = lstat(buf, &st); + + if (!stat_status && S_ISDIR(st.st_mode)) + continue; /* ok, it is already a directory. */ + + /* + * We know stat_status == 0 means something exists + * there and this mkdir would fail, but that is an + * error codepath; we do not care, as we unlink and + * mkdir again in such a case. + */ 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 */ - } + if (errno == EEXIST && state->force && + !unlink(buf) && !mkdir(buf, 0777)) + continue; die("cannot create directory at %s", buf); } } |