зеркало из https://github.com/microsoft/git.git
unpack-trees: convert clear_ce_flags* to avoid the_index
Prior tofba92be8f7
, this code implicitly (and incorrectly) assumes the_index when running the exclude machinery.fba92be8f7
helps show this problem clearer because unpack-trees operation is supposed to work on whatever index the caller specifies... not specifically the_index. Update the code to use "istate" argument that's originally from mark_new_skip_worktree(). From the call sites, both in unpack_trees(), you can see that this function works on two separate indexes: o->src_index and o->result. The second mark_new_skip_worktree() so far has incorecctly applied exclude rules on o->src_index instead of o->result. It's unclear what is the consequences of this, but it's definitely wrong. [1]fba92be8f7
(dir: convert is_excluded_from_list to take an index - 2017-05-05) 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:
Родитель
86016ec304
Коммит
27c82fb3b4
|
@ -1092,13 +1092,15 @@ static int unpack_callback(int n, unsigned long mask, unsigned long dirmask, str
|
|||
return mask;
|
||||
}
|
||||
|
||||
static int clear_ce_flags_1(struct cache_entry **cache, int nr,
|
||||
static int clear_ce_flags_1(struct index_state *istate,
|
||||
struct cache_entry **cache, int nr,
|
||||
struct strbuf *prefix,
|
||||
int select_mask, int clear_mask,
|
||||
struct exclude_list *el, int defval);
|
||||
|
||||
/* Whole directory matching */
|
||||
static int clear_ce_flags_dir(struct cache_entry **cache, int nr,
|
||||
static int clear_ce_flags_dir(struct index_state *istate,
|
||||
struct cache_entry **cache, int nr,
|
||||
struct strbuf *prefix,
|
||||
char *basename,
|
||||
int select_mask, int clear_mask,
|
||||
|
@ -1107,7 +1109,7 @@ static int clear_ce_flags_dir(struct cache_entry **cache, int nr,
|
|||
struct cache_entry **cache_end;
|
||||
int dtype = DT_DIR;
|
||||
int ret = is_excluded_from_list(prefix->buf, prefix->len,
|
||||
basename, &dtype, el, &the_index);
|
||||
basename, &dtype, el, istate);
|
||||
int rc;
|
||||
|
||||
strbuf_addch(prefix, '/');
|
||||
|
@ -1129,7 +1131,7 @@ static int clear_ce_flags_dir(struct cache_entry **cache, int nr,
|
|||
* calling clear_ce_flags_1(). That function will call
|
||||
* the expensive is_excluded_from_list() on every entry.
|
||||
*/
|
||||
rc = clear_ce_flags_1(cache, cache_end - cache,
|
||||
rc = clear_ce_flags_1(istate, cache, cache_end - cache,
|
||||
prefix,
|
||||
select_mask, clear_mask,
|
||||
el, ret);
|
||||
|
@ -1152,7 +1154,8 @@ static int clear_ce_flags_dir(struct cache_entry **cache, int nr,
|
|||
* cache[0]->name[0..(prefix_len-1)]
|
||||
* Top level path has prefix_len zero.
|
||||
*/
|
||||
static int clear_ce_flags_1(struct cache_entry **cache, int nr,
|
||||
static int clear_ce_flags_1(struct index_state *istate,
|
||||
struct cache_entry **cache, int nr,
|
||||
struct strbuf *prefix,
|
||||
int select_mask, int clear_mask,
|
||||
struct exclude_list *el, int defval)
|
||||
|
@ -1186,7 +1189,7 @@ static int clear_ce_flags_1(struct cache_entry **cache, int nr,
|
|||
len = slash - name;
|
||||
strbuf_add(prefix, name, len);
|
||||
|
||||
processed = clear_ce_flags_dir(cache, cache_end - cache,
|
||||
processed = clear_ce_flags_dir(istate, cache, cache_end - cache,
|
||||
prefix,
|
||||
prefix->buf + prefix->len - len,
|
||||
select_mask, clear_mask,
|
||||
|
@ -1200,7 +1203,7 @@ static int clear_ce_flags_1(struct cache_entry **cache, int nr,
|
|||
}
|
||||
|
||||
strbuf_addch(prefix, '/');
|
||||
cache += clear_ce_flags_1(cache, cache_end - cache,
|
||||
cache += clear_ce_flags_1(istate, cache, cache_end - cache,
|
||||
prefix,
|
||||
select_mask, clear_mask, el, defval);
|
||||
strbuf_setlen(prefix, prefix->len - len - 1);
|
||||
|
@ -1210,7 +1213,7 @@ static int clear_ce_flags_1(struct cache_entry **cache, int nr,
|
|||
/* Non-directory */
|
||||
dtype = ce_to_dtype(ce);
|
||||
ret = is_excluded_from_list(ce->name, ce_namelen(ce),
|
||||
name, &dtype, el, &the_index);
|
||||
name, &dtype, el, istate);
|
||||
if (ret < 0)
|
||||
ret = defval;
|
||||
if (ret > 0)
|
||||
|
@ -1220,15 +1223,17 @@ static int clear_ce_flags_1(struct cache_entry **cache, int nr,
|
|||
return nr - (cache_end - cache);
|
||||
}
|
||||
|
||||
static int clear_ce_flags(struct cache_entry **cache, int nr,
|
||||
int select_mask, int clear_mask,
|
||||
struct exclude_list *el)
|
||||
static int clear_ce_flags(struct index_state *istate,
|
||||
int select_mask, int clear_mask,
|
||||
struct exclude_list *el)
|
||||
{
|
||||
static struct strbuf prefix = STRBUF_INIT;
|
||||
|
||||
strbuf_reset(&prefix);
|
||||
|
||||
return clear_ce_flags_1(cache, nr,
|
||||
return clear_ce_flags_1(istate,
|
||||
istate->cache,
|
||||
istate->cache_nr,
|
||||
&prefix,
|
||||
select_mask, clear_mask,
|
||||
el, 0);
|
||||
|
@ -1263,7 +1268,7 @@ static void mark_new_skip_worktree(struct exclude_list *el,
|
|||
* 2. Widen worktree according to sparse-checkout file.
|
||||
* Matched entries will have skip_wt_flag cleared (i.e. "in")
|
||||
*/
|
||||
clear_ce_flags(istate->cache, istate->cache_nr, select_flag, skip_wt_flag, el);
|
||||
clear_ce_flags(istate, select_flag, skip_wt_flag, el);
|
||||
}
|
||||
|
||||
static int verify_absent(const struct cache_entry *,
|
||||
|
|
Загрузка…
Ссылка в новой задаче