add_file_to_index: skip rehashing if the cached stat already matches
authorJunio C Hamano <gitster@pobox.com>
Tue, 31 Jul 2007 00:12:58 +0000 (17:12 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 31 Jul 2007 00:49:50 +0000 (17:49 -0700)
An earlier commit 366bfcb6 broke git-add by moving read_cache()
call down, because it wanted the directory walking code to grab
paths that are already in the index.  The change serves its
purpose, but introduces a regression because the responsibility
of avoiding unnecessary reindexing by matching the cached stat
is shifted nowhere.

This makes it the job of add_file_to_index() function.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
read-cache.c

index a363f312c7f70d2a087dc16ebfe0969a03c1be42..e060392d1da89f4446431fa361cd0e2c95ec3925 100644 (file)
@@ -380,7 +380,7 @@ static int index_name_pos_also_unmerged(struct index_state *istate,
 
 int add_file_to_index(struct index_state *istate, const char *path, int verbose)
 {
-       int size, namelen;
+       int size, namelen, pos;
        struct stat st;
        struct cache_entry *ce;
 
@@ -414,6 +414,15 @@ int add_file_to_index(struct index_state *istate, const char *path, int verbose)
                ce->ce_mode = ce_mode_from_stat(ent, st.st_mode);
        }
 
+       pos = index_name_pos(istate, ce->name, namelen);
+       if (0 <= pos &&
+           !ce_stage(istate->cache[pos]) &&
+           !ie_modified(istate, istate->cache[pos], &st, 1)) {
+               /* Nothing changed, really */
+               free(ce);
+               return 0;
+       }
+
        if (index_path(ce->sha1, path, &st, 1))
                die("unable to index file %s", path);
        if (add_index_entry(istate, ce, ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE))