diff options
author | Junio C Hamano <gitster@pobox.com> | 2017-06-13 13:27:02 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2017-06-13 13:27:02 -0700 |
commit | f24e079cb6ecaa217e593c2d2620187044ba1b0d (patch) | |
tree | 4e3e3017dd1714a07f58e1774e1d3bf6f870e36e | |
parent | f4683b4e9cad5e0077fe0a067b15f69c828581bb (diff) | |
parent | 9f41c7a6b3e3cc3ac4a739364400393fa2492880 (diff) | |
download | git-f24e079cb6ecaa217e593c2d2620187044ba1b0d.tar.gz git-f24e079cb6ecaa217e593c2d2620187044ba1b0d.tar.xz |
Merge branch 'jh/close-index-before-stat' into maint
The timestamp of the index file is now taken after the file is
closed, to help Windows, on which a stale timestamp is reported by
fstat() on a file that is opened for writing and data was written
but not yet closed.
* jh/close-index-before-stat:
read-cache: close index.lock in do_write_index
-rw-r--r-- | read-cache.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/read-cache.c b/read-cache.c index 0d0081a11..f12da0dbb 100644 --- a/read-cache.c +++ b/read-cache.c @@ -2187,9 +2187,10 @@ void update_index_if_able(struct index_state *istate, struct lock_file *lockfile rollback_lock_file(lockfile); } -static int do_write_index(struct index_state *istate, int newfd, +static int do_write_index(struct index_state *istate, struct tempfile *tempfile, int strip_extensions) { + int newfd = tempfile->fd; git_SHA_CTX c; struct cache_header hdr; int i, err, removed, extended, hdr_version; @@ -2298,7 +2299,11 @@ static int do_write_index(struct index_state *istate, int newfd, return -1; } - if (ce_flush(&c, newfd, istate->sha1) || fstat(newfd, &st)) + if (ce_flush(&c, newfd, istate->sha1)) + return -1; + if (close_tempfile(tempfile)) + return error(_("could not close '%s'"), tempfile->filename.buf); + if (stat(tempfile->filename.buf, &st)) return -1; istate->timestamp.sec = (unsigned int)st.st_mtime; istate->timestamp.nsec = ST_MTIME_NSEC(st); @@ -2321,7 +2326,7 @@ static int commit_locked_index(struct lock_file *lk) static int do_write_locked_index(struct index_state *istate, struct lock_file *lock, unsigned flags) { - int ret = do_write_index(istate, get_lock_file_fd(lock), 0); + int ret = do_write_index(istate, &lock->tempfile, 0); if (ret) return ret; assert((flags & (COMMIT_LOCK | CLOSE_LOCK)) != @@ -2418,7 +2423,7 @@ static int write_shared_index(struct index_state *istate, return do_write_locked_index(istate, lock, flags); } move_cache_to_base_index(istate); - ret = do_write_index(si->base, fd, 1); + ret = do_write_index(si->base, &temporary_sharedindex, 1); if (ret) { delete_tempfile(&temporary_sharedindex); return ret; |