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:
parent
e6c286e8b2
commit
d4a2024aef
@ -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;
|
||||
|
||||
memset(&costate, 0, sizeof(costate));
|
||||
costate.base_dir = "";
|
||||
costate.refresh_cache = 1;
|
||||
costate.istate = istate;
|
||||
if (checkout_entry(ce, &costate, NULL) || lstat(ce->name, st))
|
||||
return error(_("cannot checkout %s"), ce->name);
|
||||
return 0;
|
||||
@ -3257,7 +3259,7 @@ static int load_current(struct image *image, struct patch *patch)
|
||||
if (lstat(name, &st)) {
|
||||
if (errno != ENOENT)
|
||||
return error(_("%s: %s"), name, strerror(errno));
|
||||
if (checkout_target(ce, &st))
|
||||
if (checkout_target(&the_index, ce, &st))
|
||||
return -1;
|
||||
}
|
||||
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];
|
||||
if (stat_ret < 0) {
|
||||
if (checkout_target(*ce, st))
|
||||
if (checkout_target(&the_index, *ce, st))
|
||||
return -1;
|
||||
}
|
||||
if (!cached && verify_index_match(*ce, st))
|
||||
|
@ -135,6 +135,7 @@ static int option_parse_u(const struct option *opt,
|
||||
int *newfd = opt->value;
|
||||
|
||||
state.refresh_cache = 1;
|
||||
state.istate = &the_index;
|
||||
if (*newfd < 0)
|
||||
*newfd = hold_locked_index(&lock_file, 1);
|
||||
return 0;
|
||||
|
@ -336,6 +336,7 @@ static int checkout_paths(const struct checkout_opts *opts,
|
||||
memset(&state, 0, sizeof(state));
|
||||
state.force = 1;
|
||||
state.refresh_cache = 1;
|
||||
state.istate = &the_index;
|
||||
for (pos = 0; pos < active_nr; pos++) {
|
||||
struct cache_entry *ce = active_cache[pos];
|
||||
if (ce->ce_flags & CE_MATCHED) {
|
||||
|
1
cache.h
1
cache.h
@ -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 *);
|
||||
|
||||
struct checkout {
|
||||
struct index_state *istate;
|
||||
const char *base_dir;
|
||||
int base_dir_len;
|
||||
unsigned force:1,
|
||||
|
2
entry.c
2
entry.c
@ -210,9 +210,11 @@ static int write_entry(struct cache_entry *ce,
|
||||
|
||||
finish:
|
||||
if (state->refresh_cache) {
|
||||
assert(state->istate);
|
||||
if (!fstat_done)
|
||||
lstat(ce->name, &st);
|
||||
fill_stat_cache_info(ce, &st);
|
||||
state->istate->cache_changed |= CE_ENTRY_CHANGED;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -1029,6 +1029,7 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
|
||||
state.force = 1;
|
||||
state.quiet = 1;
|
||||
state.refresh_cache = 1;
|
||||
state.istate = &o->result;
|
||||
|
||||
memset(&el, 0, sizeof(el));
|
||||
if (!core_apply_sparse_checkout || !o->update)
|
||||
|
Loading…
Reference in New Issue
Block a user