* [PATCH] write_index(): update index_stat->timestamp after flushing to disk
@ 2009-02-22 14:09 Kjetil Barvik
0 siblings, 0 replies; only message in thread
From: Kjetil Barvik @ 2009-02-22 14:09 UTC (permalink / raw)
To: git; +Cc: Junio C Hamano, Kjetil Barvik
Since this timestamp is used to check for racy-clean files, it is
important to keep it uptodate.
For the 'git checkout' command without the '-q' option, this make a
huge difference. Before, each and every file which was updated, was
racy-clean after the call to unpack_trees() and write_index() but
before the GIT process ended.
And because of the call to show_local_changes() in builtin-checkout.c,
we ended up reading those files back into memory, doing a SHA1 to
check if the files was really different from the index. And, of
course, no file was different.
With this fix, 'git checkout' without the '-q' option should now be
almost as fast as with the '-q' option, but not quite, as we still do
some few lstat(2) calls more without the '-q' option.
Signed-off-by: Kjetil Barvik <barvik@broadpark.no>
---
patch aginst the 'next' branch this time! :-)
cache.h | 2 +-
read-cache.c | 11 +++++++++--
2 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/cache.h b/cache.h
index 20446c1..7e454a7 100644
--- a/cache.h
+++ b/cache.h
@@ -430,7 +430,7 @@ extern int read_index_preload(struct index_state *, const char **pathspec);
extern int read_index_from(struct index_state *, const char *path);
extern int is_index_unborn(struct index_state *);
extern int read_index_unmerged(struct index_state *);
-extern int write_index(const struct index_state *, int newfd);
+extern int write_index(struct index_state *, int newfd);
extern int discard_index(struct index_state *);
extern int unmerged_index(const struct index_state *);
extern int verify_path(const char *path);
diff --git a/read-cache.c b/read-cache.c
index bb07371..4212719 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -1528,13 +1528,14 @@ static int ce_write_entry(git_SHA_CTX *c, int fd, struct cache_entry *ce)
return ce_write(c, fd, ondisk, size);
}
-int write_index(const struct index_state *istate, int newfd)
+int write_index(struct index_state *istate, int newfd)
{
git_SHA_CTX c;
struct cache_header hdr;
int i, err, removed, extended;
struct cache_entry **cache = istate->cache;
int entries = istate->cache_nr;
+ struct stat st;
for (i = removed = extended = 0; i < entries; i++) {
if (cache[i]->ce_flags & CE_REMOVE)
@@ -1578,7 +1579,13 @@ int write_index(const struct index_state *istate, int newfd)
if (err)
return -1;
}
- return ce_flush(&c, newfd);
+ if (ce_flush(&c, newfd) || fstat(newfd, &st))
+ return -1;
+ istate->timestamp.sec = (unsigned int)st.st_ctime;
+#ifdef USE_NSEC
+ istate->timestamp.nsec = (unsigned int)st.st_ctim.tv_nsec;
+#endif
+ return 0;
}
/*
--
1.6.1.349.g99fa5
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2009-02-22 14:13 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-02-22 14:09 [PATCH] write_index(): update index_stat->timestamp after flushing to disk Kjetil Barvik
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).