untracked cache: invalidate at index addition or removal

Ideally we should implement untracked_cache_remove_from_index() and
untracked_cache_add_to_index() so that they update untracked cache
right away instead of invalidating it and wait for read_directory()
next time to deal with it. But that may need some more work in
unpack-trees.c. So stay simple as the first step.

The new call in add_index_entry_with_check() may look strange because
new calls usually stay close to cache_tree_invalidate_path(). We do it
a bit later than c_t_i_p() in this function because if it's about
replacing the entry with the same name, we don't care (but cache-tree
does).

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Nguyễn Thái Ngọc Duy
2015-03-08 17:12:35 +07:00
committed by Junio C Hamano
parent f9e6c64958
commit e931371a8f
4 changed files with 44 additions and 2 deletions

31
dir.c
View File

@ -2502,3 +2502,34 @@ done2:
} }
return uc; return uc;
} }
void untracked_cache_invalidate_path(struct index_state *istate,
const char *path)
{
const char *sep;
struct untracked_cache_dir *d;
if (!istate->untracked || !istate->untracked->root)
return;
sep = strrchr(path, '/');
if (sep)
d = lookup_untracked(istate->untracked,
istate->untracked->root,
path, sep - path);
else
d = istate->untracked->root;
istate->untracked->dir_invalidated++;
d->valid = 0;
d->untracked_nr = 0;
}
void untracked_cache_remove_from_index(struct index_state *istate,
const char *path)
{
untracked_cache_invalidate_path(istate, path);
}
void untracked_cache_add_to_index(struct index_state *istate,
const char *path)
{
untracked_cache_invalidate_path(istate, path);
}

4
dir.h
View File

@ -298,6 +298,10 @@ static inline int dir_path_match(const struct dir_entry *ent,
has_trailing_dir); has_trailing_dir);
} }
void untracked_cache_invalidate_path(struct index_state *, const char *);
void untracked_cache_remove_from_index(struct index_state *, const char *);
void untracked_cache_add_to_index(struct index_state *, const char *);
void free_untracked_cache(struct untracked_cache *); void free_untracked_cache(struct untracked_cache *);
struct untracked_cache *read_untracked_extension(const void *data, unsigned long sz); struct untracked_cache *read_untracked_extension(const void *data, unsigned long sz);
void write_untracked_extension(struct strbuf *out, struct untracked_cache *untracked); void write_untracked_extension(struct strbuf *out, struct untracked_cache *untracked);

View File

@ -80,6 +80,7 @@ void rename_index_entry_at(struct index_state *istate, int nr, const char *new_n
memcpy(new->name, new_name, namelen + 1); memcpy(new->name, new_name, namelen + 1);
cache_tree_invalidate_path(istate, old->name); cache_tree_invalidate_path(istate, old->name);
untracked_cache_remove_from_index(istate, old->name);
remove_index_entry_at(istate, nr); remove_index_entry_at(istate, nr);
add_index_entry(istate, new, ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE); add_index_entry(istate, new, ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE);
} }
@ -539,6 +540,7 @@ int remove_file_from_index(struct index_state *istate, const char *path)
if (pos < 0) if (pos < 0)
pos = -pos-1; pos = -pos-1;
cache_tree_invalidate_path(istate, path); cache_tree_invalidate_path(istate, path);
untracked_cache_remove_from_index(istate, path);
while (pos < istate->cache_nr && !strcmp(istate->cache[pos]->name, path)) while (pos < istate->cache_nr && !strcmp(istate->cache[pos]->name, path))
remove_index_entry_at(istate, pos); remove_index_entry_at(istate, pos);
return 0; return 0;
@ -981,6 +983,8 @@ static int add_index_entry_with_check(struct index_state *istate, struct cache_e
} }
pos = -pos-1; pos = -pos-1;
untracked_cache_add_to_index(istate, ce->name);
/* /*
* Inserting a merged entry ("stage 0") into the index * Inserting a merged entry ("stage 0") into the index
* will always replace all non-merged entries.. * will always replace all non-merged entries..

View File

@ -9,6 +9,7 @@
#include "refs.h" #include "refs.h"
#include "attr.h" #include "attr.h"
#include "split-index.h" #include "split-index.h"
#include "dir.h"
/* /*
* Error messages expected by scripts out of plumbing commands such as * Error messages expected by scripts out of plumbing commands such as
@ -1259,8 +1260,10 @@ static int verify_uptodate_sparse(const struct cache_entry *ce,
static void invalidate_ce_path(const struct cache_entry *ce, static void invalidate_ce_path(const struct cache_entry *ce,
struct unpack_trees_options *o) struct unpack_trees_options *o)
{ {
if (ce) if (!ce)
cache_tree_invalidate_path(o->src_index, ce->name); return;
cache_tree_invalidate_path(o->src_index, ce->name);
untracked_cache_invalidate_path(o->src_index, ce->name);
} }
/* /*