If CE_WATCHED is set, CE_VALID is controlled by CE_WATCHED and will be
cleared bfore writing to disk. Users of --assume-unchanged therefore
need to clear CE_WATCHED to avoid this side effect.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclo...@gmail.com>
---
 builtin/update-index.c | 12 ++++++++----
 read-cache.c           |  2 +-
 2 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/builtin/update-index.c b/builtin/update-index.c
index e3a10d7..9283fd6 100644
--- a/builtin/update-index.c
+++ b/builtin/update-index.c
@@ -50,9 +50,13 @@ static int mark_ce_flags(const char *path, int flag, int 
mark)
        int namelen = strlen(path);
        int pos = cache_name_pos(path, namelen);
        if (0 <= pos) {
-               if (mark)
-                       active_cache[pos]->ce_flags |= flag;
-               else
+               if (mark) {
+                       struct cache_entry *ce = active_cache[pos];
+                       if (flag == CE_VALID)
+                               ce->ce_flags = (ce->ce_flags & ~CE_WATCHED) | 
CE_VALID;
+                       else
+                               ce->ce_flags |= flag;
+               } else
                        active_cache[pos]->ce_flags &= ~flag;
                cache_tree_invalidate_path(active_cache_tree, path);
                active_cache_changed = 1;
@@ -235,7 +239,7 @@ static int add_cacheinfo(unsigned int mode, const unsigned 
char *sha1,
        ce->ce_namelen = len;
        ce->ce_mode = create_ce_mode(mode);
        if (assume_unchanged)
-               ce->ce_flags |= CE_VALID;
+               ce->ce_flags = (ce->ce_flags & ~CE_WATCHED) | CE_VALID;
        option = allow_add ? ADD_CACHE_OK_TO_ADD : 0;
        option |= allow_replace ? ADD_CACHE_OK_TO_REPLACE : 0;
        if (add_cache_entry(ce, option))
diff --git a/read-cache.c b/read-cache.c
index 098d3b6..8961864 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -133,7 +133,7 @@ void fill_stat_cache_info(struct cache_entry *ce, struct 
stat *st)
        fill_stat_data(&ce->ce_stat_data, st);
 
        if (assume_unchanged)
-               ce->ce_flags |= CE_VALID;
+               ce->ce_flags = (ce->ce_flags & ~CE_WATCHED) | CE_VALID;
 
        if (S_ISREG(st->st_mode))
                ce_mark_uptodate(ce);
-- 
1.8.5.2.240.g8478abd

--
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