read-cache: be specific what part of the index has changed
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>
Fri, 13 Jun 2014 12:19:27 +0000 (19:19 +0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 13 Jun 2014 18:49:38 +0000 (11:49 -0700)
cache entry additions, removals and modifications are separated
out. The rest of changes are still in the catch-all flag
SOMETHING_CHANGED, which would be more specific later.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/update-index.c
cache.h
read-cache.c
resolve-undo.c
index 42cbe4ba1e4d1553934f13a06bf76156c078c6f0..d2654d643ddb87afbdaf8f14d9c854fd12f98f47 100644 (file)
@@ -56,7 +56,7 @@ static int mark_ce_flags(const char *path, int flag, int mark)
                else
                        active_cache[pos]->ce_flags &= ~flag;
                cache_tree_invalidate_path(active_cache_tree, path);
-               active_cache_changed = 1;
+               active_cache_changed = SOMETHING_CHANGED;
                return 0;
        }
        return -1;
@@ -268,7 +268,7 @@ static void chmod_path(int flip, const char *path)
                goto fail;
        }
        cache_tree_invalidate_path(active_cache_tree, path);
-       active_cache_changed = 1;
+       active_cache_changed = SOMETHING_CHANGED;
        report("chmod %cx '%s'", flip, path);
        return;
  fail:
@@ -889,7 +889,7 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
                            INDEX_FORMAT_LB, INDEX_FORMAT_UB);
 
                if (the_index.version != preferred_index_format)
-                       active_cache_changed = 1;
+                       active_cache_changed = SOMETHING_CHANGED;
                the_index.version = preferred_index_format;
        }
 
diff --git a/cache.h b/cache.h
index 57ad318679579b40e2d9456f02c3ac32ec8e00a2..31d4541bc682a9fcfa237dcff9a2ac90db3d7b19 100644 (file)
--- a/cache.h
+++ b/cache.h
@@ -268,6 +268,11 @@ static inline unsigned int canon_mode(unsigned int mode)
 
 #define cache_entry_size(len) (offsetof(struct cache_entry,name) + (len) + 1)
 
+#define SOMETHING_CHANGED      (1 << 0) /* unclassified changes go here */
+#define CE_ENTRY_CHANGED       (1 << 1)
+#define CE_ENTRY_REMOVED       (1 << 2)
+#define CE_ENTRY_ADDED         (1 << 3)
+
 struct index_state {
        struct cache_entry **cache;
        unsigned int version;
index c0c2e39cedcde3d080e35c9d87c1643a476e50f8..035c72e101fcb0935ba4e5fca5aa69a21d4cba51 100644 (file)
@@ -51,7 +51,7 @@ static void replace_index_entry(struct index_state *istate, int nr, struct cache
        remove_name_hash(istate, old);
        free(old);
        set_index_entry(istate, nr, ce);
-       istate->cache_changed = 1;
+       istate->cache_changed |= CE_ENTRY_CHANGED;
 }
 
 void rename_index_entry_at(struct index_state *istate, int nr, const char *new_name)
@@ -482,7 +482,7 @@ int remove_index_entry_at(struct index_state *istate, int pos)
        record_resolve_undo(istate, ce);
        remove_name_hash(istate, ce);
        free(ce);
-       istate->cache_changed = 1;
+       istate->cache_changed |= CE_ENTRY_REMOVED;
        istate->cache_nr--;
        if (pos >= istate->cache_nr)
                return 0;
@@ -512,7 +512,7 @@ void remove_marked_cache_entries(struct index_state *istate)
        }
        if (j == istate->cache_nr)
                return;
-       istate->cache_changed = 1;
+       istate->cache_changed |= CE_ENTRY_REMOVED;
        istate->cache_nr = j;
 }
 
@@ -1002,7 +1002,7 @@ int add_index_entry(struct index_state *istate, struct cache_entry *ce, int opti
                        istate->cache + pos,
                        (istate->cache_nr - pos - 1) * sizeof(ce));
        set_index_entry(istate, pos, ce);
-       istate->cache_changed = 1;
+       istate->cache_changed |= CE_ENTRY_ADDED;
        return 0;
 }
 
@@ -1101,6 +1101,7 @@ static struct cache_entry *refresh_cache_ent(struct index_state *istate,
            !(ce->ce_flags & CE_VALID))
                updated->ce_flags &= ~CE_VALID;
 
+       /* istate->cache_changed is updated in the caller */
        return updated;
 }
 
@@ -1182,7 +1183,7 @@ int refresh_index(struct index_state *istate, unsigned int flags,
                                 * means the index is not valid anymore.
                                 */
                                ce->ce_flags &= ~CE_VALID;
-                               istate->cache_changed = 1;
+                               istate->cache_changed |= CE_ENTRY_CHANGED;
                        }
                        if (quiet)
                                continue;
index 44c697c36d0b406330aeb084db1d6a4be715d6c6..e9dff57824577c09e5b6edbfe429bcbb1e7d3421 100644 (file)
@@ -110,7 +110,7 @@ void resolve_undo_clear_index(struct index_state *istate)
        string_list_clear(resolve_undo, 1);
        free(resolve_undo);
        istate->resolve_undo = NULL;
-       istate->cache_changed = 1;
+       istate->cache_changed = SOMETHING_CHANGED;
 }
 
 int unmerge_index_entry_at(struct index_state *istate, int pos)