From: Linus Torvalds Date: Fri, 6 May 2005 23:48:43 +0000 (-0700) Subject: Revert bogus optimization that avoids index file writes X-Git-Tag: v0.99~612 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=ee267527aa80807f37caf1d00bcf1b5263945adb;p=git.git Revert bogus optimization that avoids index file writes It didn't properly mark all cache updates as being dirty, and causes merge errors due to that. In particular, it didn't notice when a file was force-removed. Besides, it was ugly as hell. I've put in place a slightly cleaner version, but I've not enabled the optimization because I don't want to be burned again. --- diff --git a/cache.h b/cache.h index 9de7709f9..a727cb4ef 100644 --- a/cache.h +++ b/cache.h @@ -98,7 +98,7 @@ static inline unsigned int create_ce_mode(unsigned int mode) const char *sha1_file_directory; struct cache_entry **active_cache; -unsigned int active_nr, active_alloc; +unsigned int active_nr, active_alloc, active_cache_changed; #define DB_ENVIRONMENT "SHA1_FILE_DIRECTORY" #define DEFAULT_DB_ENVIRONMENT ".git/objects" diff --git a/read-cache.c b/read-cache.c index 2a88d18b1..6a04cf194 100644 --- a/read-cache.c +++ b/read-cache.c @@ -7,7 +7,7 @@ #include "cache.h" struct cache_entry **active_cache = NULL; -unsigned int active_nr = 0, active_alloc = 0; +unsigned int active_nr = 0, active_alloc = 0, active_cache_changed = 0; int cache_match_stat(struct cache_entry *ce, struct stat *st) { @@ -99,6 +99,7 @@ int cache_name_pos(const char *name, int namelen) /* Remove entry, return true if there are more entries to go.. */ int remove_entry_at(int pos) { + active_cache_changed = 1; active_nr--; if (pos >= active_nr) return 0; @@ -130,6 +131,7 @@ int add_cache_entry(struct cache_entry *ce, int ok_to_add) /* existing match? Just replace it */ if (pos >= 0) { + active_cache_changed = 1; active_cache[pos] = ce; return 0; } @@ -161,6 +163,7 @@ int add_cache_entry(struct cache_entry *ce, int ok_to_add) if (active_nr > pos) memmove(active_cache + pos + 1, active_cache + pos, (active_nr - pos - 1) * sizeof(ce)); active_cache[pos] = ce; + active_cache_changed = 1; return 0; } diff --git a/update-cache.c b/update-cache.c index 97d5e8b6b..735d19920 100644 --- a/update-cache.c +++ b/update-cache.c @@ -15,12 +15,6 @@ */ static int allow_add = 0, allow_remove = 0, not_new = 0; -/* - * update-cache --refresh may not touch anything at all, in which case - * writing 1.6MB of the same thing is a waste. - */ -static int cache_changed = 0; - /* Three functions to allow overloaded pointer return; see linux/err.h */ static inline void *ERR_PTR(long error) { @@ -57,7 +51,7 @@ static void fill_stat_cache_info(struct cache_entry *ce, struct stat *st) ce->ce_size = htonl(st->st_size); } -static int add_file_to_cache_1(char *path) +static int add_file_to_cache(char *path) { int size, namelen; struct cache_entry *ce; @@ -101,35 +95,9 @@ static int add_file_to_cache_1(char *path) default: return -1; } - if (!cache_changed) { - /* If we have not smudged the cache, be careful - * to keep it clean. Find out if we have a matching - * cache entry that add_cache_entry would replace with, - * and if it matches then do not bother calling it. - */ - int pos = cache_name_pos(ce->name, namelen); - if ((0 <= pos) && - !memcmp(active_cache[pos], ce, sizeof(*ce))) { - free(ce); - /* magic to tell add_file_to_cache that - * we have not updated anything. - */ - return 999; - } - } return add_cache_entry(ce, allow_add); } -static int add_file_to_cache(char *path) -{ - int ret = add_file_to_cache_1(path); - if (ret == 0) - cache_changed = 1; - else if (ret == 999) - ret = 0; - return ret; -} - static int match_data(int fd, void *buffer, unsigned long size) { while (size) { @@ -236,7 +204,6 @@ static struct cache_entry *refresh_entry(struct cache_entry *ce) return ERR_PTR(-EINVAL); } - cache_changed = 1; size = ce_size(ce); updated = xmalloc(size); memcpy(updated, ce, size); @@ -270,6 +237,7 @@ static int refresh_cache(void) } continue; } + active_cache_changed = 1; active_cache[i] = new; } return has_errors; @@ -317,7 +285,6 @@ static int add_cacheinfo(char *arg1, char *arg2, char *arg3) if (!verify_path(arg3)) return -1; - cache_changed = 1; len = strlen(arg3); size = cache_entry_size(len); ce = xmalloc(size); @@ -412,11 +379,7 @@ int main(int argc, char **argv) if (add_file_to_cache(path)) die("Unable to add %s to database", path); } - - if (!cache_changed) - unlink(lockfile); - else if (write_cache(newfd, active_cache, active_nr) || - rename(lockfile, indexfile)) + if (write_cache(newfd, active_cache, active_nr) || rename(lockfile, indexfile)) die("Unable to write new cachefile"); lockfile_name = NULL;