From: Junio C Hamano Date: Tue, 14 Oct 2014 17:49:45 +0000 (-0700) Subject: Merge branch 'mh/lockfile' X-Git-Tag: v2.2.0-rc0~53 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/bd107e1052a11cf7dd6baf9077eab52fbb9d9c90 Merge branch 'mh/lockfile' The lockfile API and its users have been cleaned up. * mh/lockfile: (38 commits) lockfile.h: extract new header file for the functions in lockfile.c hold_locked_index(): move from lockfile.c to read-cache.c hold_lock_file_for_append(): restore errno before returning get_locked_file_path(): new function lockfile.c: rename static functions lockfile: rename LOCK_NODEREF to LOCK_NO_DEREF commit_lock_file_to(): refactor a helper out of commit_lock_file() trim_last_path_component(): replace last_path_elm() resolve_symlink(): take a strbuf parameter resolve_symlink(): use a strbuf for internal scratch space lockfile: change lock_file::filename into a strbuf commit_lock_file(): use a strbuf to manage temporary space try_merge_strategy(): use a statically-allocated lock_file object try_merge_strategy(): remove redundant lock_file allocation struct lock_file: declare some fields volatile lockfile: avoid transitory invalid states git_config_set_multivar_in_file(): avoid call to rollback_lock_file() dump_marks(): remove a redundant call to rollback_lock_file() api-lockfile: document edge cases commit_lock_file(): rollback lock file on failure to rename ... --- bd107e1052a11cf7dd6baf9077eab52fbb9d9c90 diff --cc lockfile.c index d34a96df4f,d27e61cafc..7bfec4b773 --- a/lockfile.c +++ b/lockfile.c @@@ -216,19 -193,23 +193,26 @@@ int hold_lock_file_for_append(struct lo orig_fd = open(path, O_RDONLY); if (orig_fd < 0) { if (errno != ENOENT) { + int save_errno = errno; + if (flags & LOCK_DIE_ON_ERROR) die("cannot open '%s' for copying", path); - close(fd); - return error("cannot open '%s' for copying", path); + rollback_lock_file(lk); + error("cannot open '%s' for copying", path); + errno = save_errno; + return -1; } } else if (copy_fd(orig_fd, fd)) { + int save_errno = errno; + if (flags & LOCK_DIE_ON_ERROR) exit(128); + close(orig_fd); - close(fd); + rollback_lock_file(lk); + errno = save_errno; return -1; + } else { + close(orig_fd); } return fd; } diff --cc merge-recursive.c index 9fc71a2391,4b0884b7bb..fdb7d0f10b --- a/merge-recursive.c +++ b/merge-recursive.c @@@ -3,8 -3,9 +3,9 @@@ * Fredrik Kuivinen. * The thieves were Alex Riesen and Johannes Schindelin, in June/July 2006 */ -#include "advice.h" #include "cache.h" +#include "advice.h" + #include "lockfile.h" #include "cache-tree.h" #include "commit.h" #include "blob.h"