read-cache: close index.lock in do_write_index

Teach do_write_index() to close the index.lock file before getting the mtime and updating the istate.timestamp fields. On Windows, a file's mtime is not updated until the file is closed. On Linux, the mtime is set after the last flush. Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com> Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jeff Hostetler committed Apr 26, 2017 at 22:05 UTC 9f41c7a6b3e3cc3ac4a739364400393fa2492880
1 file changed +9 -4
read-cache.c
+9 -4
@@ -2011,9 +2011,10 @@ void update_index_if_able(struct index_state *istate, struct lock_file *lockfile
2011 rollback_lock_file(lockfile);
2012 }
2013
2014 -static int do_write_index(struct index_state *istate, int newfd,
2014 +static int do_write_index(struct index_state *istate, struct tempfile *tempfile,
2015 int strip_extensions)
2016 {
2017 + int newfd = tempfile->fd;
2018 git_SHA_CTX c;
2019 struct cache_header hdr;
2020 int i, err, removed, extended, hdr_version;
@@ -2122,7 +2123,11 @@ static int do_write_index(struct index_state *istate, int newfd,
2123 return -1;
2124 }
2125
2125 - if (ce_flush(&c, newfd, istate->sha1) || fstat(newfd, &st))
2126 + if (ce_flush(&c, newfd, istate->sha1))
2127 + return -1;
2128 + if (close_tempfile(tempfile))
2129 + return error(_("could not close '%s'"), tempfile->filename.buf);
2130 + if (stat(tempfile->filename.buf, &st))
2131 return -1;
2132 istate->timestamp.sec = (unsigned int)st.st_mtime;
2133 istate->timestamp.nsec = ST_MTIME_NSEC(st);
@@ -2145,7 +2150,7 @@ static int commit_locked_index(struct lock_file *lk)
2150 static int do_write_locked_index(struct index_state *istate, struct lock_file *lock,
2151 unsigned flags)
2152 {
2148 - int ret = do_write_index(istate, get_lock_file_fd(lock), 0);
2153 + int ret = do_write_index(istate, &lock->tempfile, 0);
2154 if (ret)
2155 return ret;
2156 assert((flags & (COMMIT_LOCK | CLOSE_LOCK)) !=
@@ -2183,7 +2188,7 @@ static int write_shared_index(struct index_state *istate,
2188 return do_write_locked_index(istate, lock, flags);
2189 }
2190 move_cache_to_base_index(istate);
2186 - ret = do_write_index(si->base, fd, 1);
2191 + ret = do_write_index(si->base, &temporary_sharedindex, 1);
2192 if (ret) {
2193 delete_tempfile(&temporary_sharedindex);
2194 return ret;