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;
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;
/* used to temporarily mark paths matched by pathspecs */
#define CE_MATCHED (1 << 26)
+#define CE_UPDATE_IN_BASE (1 << 27)
+
/*
* Extended on-disk flags
*/
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;
/* 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;
{
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;
}
* 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)
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;
+ }
+}
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,
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()) {