diff options
author | Junio C Hamano <gitster@pobox.com> | 2007-07-30 17:12:58 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2007-07-30 17:49:50 -0700 |
commit | 0781b8a9b2fe760fc4ed519a3a26e4b9bd6ccffe (patch) | |
tree | 5698aa2ab33ca555cca63072fcd881b4fad82e13 | |
parent | git-svn: Translate invalid characters in refname (diff) | |
download | tgif-0781b8a9b2fe760fc4ed519a3a26e4b9bd6ccffe.tar.xz |
add_file_to_index: skip rehashing if the cached stat already matches
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>
-rw-r--r-- | read-cache.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/read-cache.c b/read-cache.c index a363f312c7..e060392d1d 100644 --- a/read-cache.c +++ b/read-cache.c @@ -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)) |