entry.c: update cache_changed if refresh_cache is set in checkout_entry()

Other fill_stat_cache_info() is on new entries, which should set
CE_ENTRY_ADDED in cache_changed, so we're safe.

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
2014-06-13 19:19:34 +07:00
committed by Junio C Hamano
parent e6c286e8b2
commit d4a2024aef
6 changed files with 11 additions and 3 deletions

View File

@ -3084,13 +3084,15 @@ static void prepare_fn_table(struct patch *patch)
} }
} }
static int checkout_target(struct cache_entry *ce, struct stat *st) static int checkout_target(struct index_state *istate,
struct cache_entry *ce, struct stat *st)
{ {
struct checkout costate; struct checkout costate;
memset(&costate, 0, sizeof(costate)); memset(&costate, 0, sizeof(costate));
costate.base_dir = ""; costate.base_dir = "";
costate.refresh_cache = 1; costate.refresh_cache = 1;
costate.istate = istate;
if (checkout_entry(ce, &costate, NULL) || lstat(ce->name, st)) if (checkout_entry(ce, &costate, NULL) || lstat(ce->name, st))
return error(_("cannot checkout %s"), ce->name); return error(_("cannot checkout %s"), ce->name);
return 0; return 0;
@ -3257,7 +3259,7 @@ static int load_current(struct image *image, struct patch *patch)
if (lstat(name, &st)) { if (lstat(name, &st)) {
if (errno != ENOENT) if (errno != ENOENT)
return error(_("%s: %s"), name, strerror(errno)); return error(_("%s: %s"), name, strerror(errno));
if (checkout_target(ce, &st)) if (checkout_target(&the_index, ce, &st))
return -1; return -1;
} }
if (verify_index_match(ce, &st)) if (verify_index_match(ce, &st))
@ -3411,7 +3413,7 @@ static int check_preimage(struct patch *patch, struct cache_entry **ce, struct s
} }
*ce = active_cache[pos]; *ce = active_cache[pos];
if (stat_ret < 0) { if (stat_ret < 0) {
if (checkout_target(*ce, st)) if (checkout_target(&the_index, *ce, st))
return -1; return -1;
} }
if (!cached && verify_index_match(*ce, st)) if (!cached && verify_index_match(*ce, st))

View File

@ -135,6 +135,7 @@ static int option_parse_u(const struct option *opt,
int *newfd = opt->value; int *newfd = opt->value;
state.refresh_cache = 1; state.refresh_cache = 1;
state.istate = &the_index;
if (*newfd < 0) if (*newfd < 0)
*newfd = hold_locked_index(&lock_file, 1); *newfd = hold_locked_index(&lock_file, 1);
return 0; return 0;

View File

@ -336,6 +336,7 @@ static int checkout_paths(const struct checkout_opts *opts,
memset(&state, 0, sizeof(state)); memset(&state, 0, sizeof(state));
state.force = 1; state.force = 1;
state.refresh_cache = 1; state.refresh_cache = 1;
state.istate = &the_index;
for (pos = 0; pos < active_nr; pos++) { for (pos = 0; pos < active_nr; pos++) {
struct cache_entry *ce = active_cache[pos]; struct cache_entry *ce = active_cache[pos];
if (ce->ce_flags & CE_MATCHED) { if (ce->ce_flags & CE_MATCHED) {

View File

@ -1063,6 +1063,7 @@ extern int split_ident_line(struct ident_split *, const char *, int);
extern int ident_cmp(const struct ident_split *, const struct ident_split *); extern int ident_cmp(const struct ident_split *, const struct ident_split *);
struct checkout { struct checkout {
struct index_state *istate;
const char *base_dir; const char *base_dir;
int base_dir_len; int base_dir_len;
unsigned force:1, unsigned force:1,

View File

@ -210,9 +210,11 @@ static int write_entry(struct cache_entry *ce,
finish: finish:
if (state->refresh_cache) { if (state->refresh_cache) {
assert(state->istate);
if (!fstat_done) if (!fstat_done)
lstat(ce->name, &st); lstat(ce->name, &st);
fill_stat_cache_info(ce, &st); fill_stat_cache_info(ce, &st);
state->istate->cache_changed |= CE_ENTRY_CHANGED;
} }
return 0; return 0;
} }

View File

@ -1029,6 +1029,7 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
state.force = 1; state.force = 1;
state.quiet = 1; state.quiet = 1;
state.refresh_cache = 1; state.refresh_cache = 1;
state.istate = &o->result;
memset(&el, 0, sizeof(el)); memset(&el, 0, sizeof(el));
if (!core_apply_sparse_checkout || !o->update) if (!core_apply_sparse_checkout || !o->update)