ie_match_stat(): do not ignore skip-worktree bit with CE_MATCH_IGNORE_VALID
Previously CE_MATCH_IGNORE_VALID flag is used by both valid and skip-worktree bits. While the two bits have similar behaviour, sharing this flag means "git update-index --really-refresh" will ignore skip-worktree while it should not. Instead another flag is introduced to ignore skip-worktree bit, CE_MATCH_IGNORE_VALID only applies to valid bit. 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:

committed by
Junio C Hamano

parent
bbbe508d77
commit
56cac48c35
21
read-cache.c
21
read-cache.c
@ -259,13 +259,18 @@ int ie_match_stat(const struct index_state *istate,
|
||||
{
|
||||
unsigned int changed;
|
||||
int ignore_valid = options & CE_MATCH_IGNORE_VALID;
|
||||
int ignore_skip_worktree = options & CE_MATCH_IGNORE_SKIP_WORKTREE;
|
||||
int assume_racy_is_modified = options & CE_MATCH_RACY_IS_DIRTY;
|
||||
|
||||
/*
|
||||
* If it's marked as always valid in the index, it's
|
||||
* valid whatever the checked-out copy says.
|
||||
*
|
||||
* skip-worktree has the same effect with higher precedence
|
||||
*/
|
||||
if (!ignore_valid && ((ce->ce_flags & CE_VALID) || ce_skip_worktree(ce)))
|
||||
if (!ignore_skip_worktree && ce_skip_worktree(ce))
|
||||
return 0;
|
||||
if (!ignore_valid && (ce->ce_flags & CE_VALID))
|
||||
return 0;
|
||||
|
||||
/*
|
||||
@ -564,7 +569,7 @@ int add_to_index(struct index_state *istate, const char *path, struct stat *st,
|
||||
int size, namelen, was_same;
|
||||
mode_t st_mode = st->st_mode;
|
||||
struct cache_entry *ce, *alias;
|
||||
unsigned ce_option = CE_MATCH_IGNORE_VALID|CE_MATCH_RACY_IS_DIRTY;
|
||||
unsigned ce_option = CE_MATCH_IGNORE_VALID|CE_MATCH_IGNORE_SKIP_WORKTREE|CE_MATCH_RACY_IS_DIRTY;
|
||||
int verbose = flags & (ADD_CACHE_VERBOSE | ADD_CACHE_PRETEND);
|
||||
int pretend = flags & ADD_CACHE_PRETEND;
|
||||
int intent_only = flags & ADD_CACHE_INTENT;
|
||||
@ -1000,11 +1005,21 @@ static struct cache_entry *refresh_cache_ent(struct index_state *istate,
|
||||
struct cache_entry *updated;
|
||||
int changed, size;
|
||||
int ignore_valid = options & CE_MATCH_IGNORE_VALID;
|
||||
int ignore_skip_worktree = options & CE_MATCH_IGNORE_SKIP_WORKTREE;
|
||||
|
||||
if (ce_uptodate(ce))
|
||||
return ce;
|
||||
|
||||
if (!ignore_valid && ((ce->ce_flags & CE_VALID) || ce_skip_worktree(ce))) {
|
||||
/*
|
||||
* CE_VALID or CE_SKIP_WORKTREE means the user promised us
|
||||
* that the change to the work tree does not matter and told
|
||||
* us not to worry.
|
||||
*/
|
||||
if (!ignore_skip_worktree && ce_skip_worktree(ce)) {
|
||||
ce_mark_uptodate(ce);
|
||||
return ce;
|
||||
}
|
||||
if (!ignore_valid && (ce->ce_flags & CE_VALID)) {
|
||||
ce_mark_uptodate(ce);
|
||||
return ce;
|
||||
}
|
||||
|
Reference in New Issue
Block a user