Signed-off-by: Nguyễn Thái Ngọc Duy <pclo...@gmail.com>
---
 builtin/blame.c        |  2 +-
 builtin/update-index.c |  4 ++--
 cache-tree.c           | 15 +++++++++++----
 cache-tree.h           |  2 +-
 cache.h                |  1 +
 read-cache.c           |  6 +++---
 unpack-trees.c         |  2 +-
 7 files changed, 20 insertions(+), 12 deletions(-)

diff --git a/builtin/blame.c b/builtin/blame.c
index 88cb799..914d919 100644
--- a/builtin/blame.c
+++ b/builtin/blame.c
@@ -2126,7 +2126,7 @@ static struct commit *fake_working_tree_commit(struct 
diff_options *opt,
         * right now, but someday we might optimize diff-index --cached
         * with cache-tree information.
         */
-       cache_tree_invalidate_path(active_cache_tree, path);
+       cache_tree_invalidate_path(&the_index, path);
 
        return commit;
 }
diff --git a/builtin/update-index.c b/builtin/update-index.c
index e0e881b..fa3c441 100644
--- a/builtin/update-index.c
+++ b/builtin/update-index.c
@@ -55,7 +55,7 @@ static int mark_ce_flags(const char *path, int flag, int mark)
                        active_cache[pos]->ce_flags |= flag;
                else
                        active_cache[pos]->ce_flags &= ~flag;
-               cache_tree_invalidate_path(active_cache_tree, path);
+               cache_tree_invalidate_path(&the_index, path);
                active_cache_changed |= CE_ENTRY_CHANGED;
                return 0;
        }
@@ -267,7 +267,7 @@ static void chmod_path(int flip, const char *path)
        default:
                goto fail;
        }
-       cache_tree_invalidate_path(active_cache_tree, path);
+       cache_tree_invalidate_path(&the_index, path);
        active_cache_changed |= CE_ENTRY_CHANGED;
        report("chmod %cx '%s'", flip, path);
        return;
diff --git a/cache-tree.c b/cache-tree.c
index 52f8692..23ddc73 100644
--- a/cache-tree.c
+++ b/cache-tree.c
@@ -98,7 +98,7 @@ struct cache_tree_sub *cache_tree_sub(struct cache_tree *it, 
const char *path)
        return find_subtree(it, path, pathlen, 1);
 }
 
-void cache_tree_invalidate_path(struct cache_tree *it, const char *path)
+static int do_invalidate_path(struct cache_tree *it, const char *path)
 {
        /* a/b/c
         * ==> invalidate self
@@ -116,7 +116,7 @@ void cache_tree_invalidate_path(struct cache_tree *it, 
const char *path)
 #endif
 
        if (!it)
-               return;
+               return 0;
        slash = strchrnul(path, '/');
        namelen = slash - path;
        it->entry_count = -1;
@@ -137,11 +137,18 @@ void cache_tree_invalidate_path(struct cache_tree *it, 
const char *path)
                                (it->subtree_nr - pos - 1));
                        it->subtree_nr--;
                }
-               return;
+               return 1;
        }
        down = find_subtree(it, path, namelen, 0);
        if (down)
-               cache_tree_invalidate_path(down->cache_tree, slash + 1);
+               do_invalidate_path(down->cache_tree, slash + 1);
+       return 1;
+}
+
+void cache_tree_invalidate_path(struct index_state *istate, const char *path)
+{
+       if (do_invalidate_path(istate->cache_tree, path))
+               istate->cache_changed |= CACHE_TREE_CHANGED;
 }
 
 static int verify_cache(const struct cache_entry * const *cache,
diff --git a/cache-tree.h b/cache-tree.h
index f1923ad..dfbcfab 100644
--- a/cache-tree.h
+++ b/cache-tree.h
@@ -23,7 +23,7 @@ struct cache_tree {
 
 struct cache_tree *cache_tree(void);
 void cache_tree_free(struct cache_tree **);
-void cache_tree_invalidate_path(struct cache_tree *, const char *);
+void cache_tree_invalidate_path(struct index_state *, const char *);
 struct cache_tree_sub *cache_tree_sub(struct cache_tree *, const char *);
 
 void cache_tree_write(struct strbuf *, struct cache_tree *root);
diff --git a/cache.h b/cache.h
index 7155052..4c288e8 100644
--- a/cache.h
+++ b/cache.h
@@ -273,6 +273,7 @@ static inline unsigned int canon_mode(unsigned int mode)
 #define CE_ENTRY_ADDED         (1 << 2)
 #define SOMETHING_CHANGED      (1 << 3) /* unclassified changes go here */
 #define RESOLVE_UNDO_CHANGED   (1 << 4)
+#define CACHE_TREE_CHANGED     (1 << 5)
 
 struct index_state {
        struct cache_entry **cache;
diff --git a/read-cache.c b/read-cache.c
index 6971fc4..f1265d4 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -65,7 +65,7 @@ void rename_index_entry_at(struct index_state *istate, int 
nr, const char *new_n
        new->ce_namelen = namelen;
        memcpy(new->name, new_name, namelen + 1);
 
-       cache_tree_invalidate_path(istate->cache_tree, old->name);
+       cache_tree_invalidate_path(istate, old->name);
        remove_index_entry_at(istate, nr);
        add_index_entry(istate, new, 
ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE);
 }
@@ -521,7 +521,7 @@ int remove_file_from_index(struct index_state *istate, 
const char *path)
        int pos = index_name_pos(istate, path, strlen(path));
        if (pos < 0)
                pos = -pos-1;
-       cache_tree_invalidate_path(istate->cache_tree, path);
+       cache_tree_invalidate_path(istate, path);
        while (pos < istate->cache_nr && !strcmp(istate->cache[pos]->name, 
path))
                remove_index_entry_at(istate, pos);
        return 0;
@@ -939,7 +939,7 @@ static int add_index_entry_with_check(struct index_state 
*istate, struct cache_e
        int skip_df_check = option & ADD_CACHE_SKIP_DFCHECK;
        int new_only = option & ADD_CACHE_NEW_ONLY;
 
-       cache_tree_invalidate_path(istate->cache_tree, ce->name);
+       cache_tree_invalidate_path(istate, ce->name);
        pos = index_name_stage_pos(istate, ce->name, ce_namelen(ce), 
ce_stage(ce));
 
        /* existing match? Just replace it. */
diff --git a/unpack-trees.c b/unpack-trees.c
index a722685..3beff8a 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c
@@ -1263,7 +1263,7 @@ static void invalidate_ce_path(const struct cache_entry 
*ce,
                               struct unpack_trees_options *o)
 {
        if (ce)
-               cache_tree_invalidate_path(o->src_index->cache_tree, ce->name);
+               cache_tree_invalidate_path(o->src_index, ce->name);
 }
 
 /*
-- 
1.9.1.346.ga2b5940

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to