Skip to content

Commit

Permalink
read-cache: mark updated entries for split index
Browse files Browse the repository at this point in the history
The large part of this patch just follows CE_ENTRY_CHANGED
marks. replace_index_entry() is updated to update
split_index->base->cache[] as well so base->cache[] does not reference
to a freed entry.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Nguyễn Thái Ngọc Duy authored and Junio C Hamano committed Jun 13, 2014
1 parent 045113a commit 078a58e
Show file tree
Hide file tree
Showing 7 changed files with 30 additions and 2 deletions.
2 changes: 2 additions & 0 deletions builtin/update-index.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +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;
active_cache[pos]->ce_flags |= CE_UPDATE_IN_BASE;
cache_tree_invalidate_path(&the_index, path);
active_cache_changed |= CE_ENTRY_CHANGED;
return 0;
Expand Down Expand Up @@ -268,6 +269,7 @@ static void chmod_path(int flip, const char *path)
goto fail;
}
cache_tree_invalidate_path(&the_index, path);
ce->ce_flags |= CE_UPDATE_IN_BASE;
active_cache_changed |= CE_ENTRY_CHANGED;
report("chmod %cx '%s'", flip, path);
return;
Expand Down
2 changes: 2 additions & 0 deletions cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,8 @@ struct cache_entry {
/* used to temporarily mark paths matched by pathspecs */
#define CE_MATCHED (1 << 26)

#define CE_UPDATE_IN_BASE (1 << 27)

/*
* Extended on-disk flags
*/
Expand Down
1 change: 1 addition & 0 deletions entry.c
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,7 @@ static int write_entry(struct cache_entry *ce,
if (!fstat_done)
lstat(ce->name, &st);
fill_stat_cache_info(ce, &st);
ce->ce_flags |= CE_UPDATE_IN_BASE;
state->istate->cache_changed |= CE_ENTRY_CHANGED;
}
return 0;
Expand Down
5 changes: 4 additions & 1 deletion read-cache.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ static struct cache_entry *refresh_cache_entry(struct cache_entry *ce,

/* changes that can be kept in $GIT_DIR/index (basically all extensions) */
#define EXTMASK (RESOLVE_UNDO_CHANGED | CACHE_TREE_CHANGED | \
CE_ENTRY_ADDED | CE_ENTRY_REMOVED)
CE_ENTRY_ADDED | CE_ENTRY_REMOVED | CE_ENTRY_CHANGED)

struct index_state the_index;
static const char *alternate_index_output;
Expand All @@ -54,9 +54,11 @@ static void replace_index_entry(struct index_state *istate, int nr, struct cache
{
struct cache_entry *old = istate->cache[nr];

replace_index_entry_in_base(istate, old, ce);
remove_name_hash(istate, old);
free(old);
set_index_entry(istate, nr, ce);
ce->ce_flags |= CE_UPDATE_IN_BASE;
istate->cache_changed |= CE_ENTRY_CHANGED;
}

Expand Down Expand Up @@ -1192,6 +1194,7 @@ int refresh_index(struct index_state *istate, unsigned int flags,
* means the index is not valid anymore.
*/
ce->ce_flags &= ~CE_VALID;
ce->ce_flags |= CE_UPDATE_IN_BASE;
istate->cache_changed |= CE_ENTRY_CHANGED;
}
if (quiet)
Expand Down
15 changes: 15 additions & 0 deletions split-index.c
Original file line number Diff line number Diff line change
Expand Up @@ -100,3 +100,18 @@ void save_or_free_index_entry(struct index_state *istate, struct cache_entry *ce
else
free(ce);
}

void replace_index_entry_in_base(struct index_state *istate,
struct cache_entry *old,
struct cache_entry *new)
{
if (old->index &&
istate->split_index &&
istate->split_index->base &&
old->index <= istate->split_index->base->cache_nr) {
new->index = old->index;
if (old != istate->split_index->base->cache[new->index - 1])
free(istate->split_index->base->cache[new->index - 1]);
istate->split_index->base->cache[new->index - 1] = new;
}
}
3 changes: 3 additions & 0 deletions split-index.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ struct split_index {

struct split_index *init_split_index(struct index_state *istate);
void save_or_free_index_entry(struct index_state *istate, struct cache_entry *ce);
void replace_index_entry_in_base(struct index_state *istate,
struct cache_entry *old,
struct cache_entry *new);
int read_link_extension(struct index_state *istate,
const void *data, unsigned long sz);
int write_link_extension(struct strbuf *sb,
Expand Down
4 changes: 3 additions & 1 deletion unpack-trees.c
Original file line number Diff line number Diff line change
Expand Up @@ -257,8 +257,10 @@ static int apply_sparse_checkout(struct index_state *istate,
ce->ce_flags |= CE_SKIP_WORKTREE;
else
ce->ce_flags &= ~CE_SKIP_WORKTREE;
if (was_skip_worktree != ce_skip_worktree(ce))
if (was_skip_worktree != ce_skip_worktree(ce)) {
ce->ce_flags |= CE_UPDATE_IN_BASE;
istate->cache_changed |= CE_ENTRY_CHANGED;
}

/*
* if (!was_skip_worktree && !ce_skip_worktree()) {
Expand Down

0 comments on commit 078a58e

Please sign in to comment.