Signed-off-by: Christian Couder <chriscool@xxxxxxxxxxxxx> --- builtin/apply.c | 38 ++++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/builtin/apply.c b/builtin/apply.c index 49ef4c9..32c38f0 100644 --- a/builtin/apply.c +++ b/builtin/apply.c @@ -4136,6 +4136,12 @@ static int add_index_file(struct apply_state *state, return 0; } +/* + * Returns: + * -1 if an unrecoverable error happened + * 0 if everything went well + * 1 if a recoverable error happened + */ static int try_create_file(const char *path, unsigned int mode, const char *buf, unsigned long size) { int fd; @@ -4145,28 +4151,32 @@ static int try_create_file(const char *path, unsigned int mode, const char *buf, struct stat st; if (!lstat(path, &st) && S_ISDIR(st.st_mode)) return 0; - return mkdir(path, 0777); + return !!mkdir(path, 0777); } if (has_symlinks && S_ISLNK(mode)) /* Although buf:size is counted string, it also is NUL * terminated. */ - return symlink(buf, path); + return !!symlink(buf, path); fd = open(path, O_CREAT | O_EXCL | O_WRONLY, (mode & 0100) ? 0777 : 0666); if (fd < 0) - return -1; + return 1; if (convert_to_working_tree(path, buf, size, &nbuf)) { size = nbuf.len; buf = nbuf.buf; } - write_or_die(fd, buf, size); + + if (!write_or_whine_pipe(fd, buf, size, path)) { + strbuf_release(&nbuf); + return -1; + } strbuf_release(&nbuf); if (close(fd) < 0) - die_errno(_("closing file '%s'"), path); + return error(_("closing file '%s': %s"), path, strerror(errno)); return 0; } @@ -4181,16 +4191,25 @@ static void create_one_file(struct apply_state *state, const char *buf, unsigned long size) { + int res; + if (state->cached) return; - if (!try_create_file(path, mode, buf, size)) + + res = try_create_file(path, mode, buf, size); + if (!res) return; + if (res < 0) + exit(1); if (errno == ENOENT) { if (safe_create_leading_directories(path)) return; - if (!try_create_file(path, mode, buf, size)) + res = try_create_file(path, mode, buf, size); + if (!res) return; + if (res < 0) + exit(1); } if (errno == EEXIST || errno == EACCES) { @@ -4208,12 +4227,15 @@ static void create_one_file(struct apply_state *state, for (;;) { char newpath[PATH_MAX]; mksnpath(newpath, sizeof(newpath), "%s~%u", path, nr); - if (!try_create_file(newpath, mode, buf, size)) { + res = try_create_file(newpath, mode, buf, size); + if (!res) { if (!rename(newpath, path)) return; unlink_or_warn(newpath); break; } + if (res < 0) + exit(1); if (errno != EEXIST) break; ++nr; -- 2.8.1.300.g5fed0c0 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html