Avoid running lstat(2) on the same cache entry.
authorJunio C Hamano <gitster@pobox.com>
Sat, 19 Jan 2008 07:45:24 +0000 (23:45 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 21 Jan 2008 20:44:31 +0000 (12:44 -0800)
commiteadb5831342bb2e756fa05c03642c4aa1929d4f5
tree7ae11a8f2038467abe6ed4c9aef5294433da2955
parent7fec10b7f41fa32e71aa6377bd04cd7c6fb419e0
Avoid running lstat(2) on the same cache entry.

Aside from the lstat(2) done for work tree files, there are
quite many lstat(2) calls in refname dwimming codepath.  This
patch is not about reducing them.

 * It adds a new ce_flag, CE_UPTODATE, that is meant to mark the
   cache entries that record a regular file blob that is up to
   date in the work tree.  If somebody later walks the index and
   wants to see if the work tree has changes, they do not have
   to be checked with lstat(2) again.

 * fill_stat_cache_info() marks the cache entry it just added
   with CE_UPTODATE.  This has the effect of marking the paths
   we write out of the index and lstat(2) immediately as "no
   need to lstat -- we know it is up-to-date", from quite a lot
   fo callers:

    - git-apply --index
    - git-update-index
    - git-checkout-index
    - git-add (uses add_file_to_index())
    - git-commit (ditto)
    - git-mv (ditto)

 * refresh_cache_ent() also marks the cache entry that are clean
   with CE_UPTODATE.

 * write_index is changed not to write CE_UPTODATE out to the
   index file, because CE_UPTODATE is meant to be transient only
   in core.  For the same reason, CE_UPDATE is not written to
   prevent an accident from happening.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
cache.h
diff.c
read-cache.c