seen = xcalloc(pathspec.nr, 1);
+ /* TODO: audit for interaction with sparse-index. */
+ ensure_full_index(&the_index);
for (i = 0; i < active_nr; i++) {
const struct cache_entry *ce = active_cache[i];
+ if (ce_skip_worktree(ce))
+ continue;
if (!ce_path_match(&the_index, ce, &pathspec, seen))
continue;
ALLOC_GROW(list.entry, list.nr + 1, list.alloc);
* to use find_pathspecs_matching_against_index() instead.
*/
void add_pathspec_matches_against_index(const struct pathspec *pathspec,
- const struct index_state *istate,
+ struct index_state *istate,
- char *seen)
+ char *seen,
+ enum ps_skip_worktree_action sw_action)
{
int num_unmatched = 0, i;
num_unmatched++;
if (!num_unmatched)
return;
+ /* TODO: audit for interaction with sparse-index. */
+ ensure_full_index(istate);
for (i = 0; i < istate->cache_nr; i++) {
const struct cache_entry *ce = istate->cache[i];
+ if (sw_action == PS_IGNORE_SKIP_WORKTREE && ce_skip_worktree(ce))
+ continue;
ce_path_match(istate, ce, pathspec, seen);
}
}
* given pathspecs achieves against all items in the index.
*/
char *find_pathspecs_matching_against_index(const struct pathspec *pathspec,
- struct index_state *istate)
- const struct index_state *istate,
++ struct index_state *istate,
+ enum ps_skip_worktree_action sw_action)
{
char *seen = xcalloc(pathspec->nr, 1);
- add_pathspec_matches_against_index(pathspec, istate, seen);
+ add_pathspec_matches_against_index(pathspec, istate, seen, sw_action);
+ return seen;
+ }
+
+ char *find_pathspecs_matching_skip_worktree(const struct pathspec *pathspec)
+ {
+ struct index_state *istate = the_repository->index;
+ char *seen = xcalloc(pathspec->nr, 1);
+ int i;
+
+ for (i = 0; i < istate->cache_nr; i++) {
+ struct cache_entry *ce = istate->cache[i];
+ if (ce_skip_worktree(ce))
+ ce_path_match(istate, ce, pathspec, seen);
+ }
+
return seen;
}
return strcmp(s1, s2);
}
+ enum ps_skip_worktree_action {
+ PS_HEED_SKIP_WORKTREE = 0,
+ PS_IGNORE_SKIP_WORKTREE = 1
+ };
void add_pathspec_matches_against_index(const struct pathspec *pathspec,
- const struct index_state *istate,
+ struct index_state *istate,
- char *seen);
+ char *seen,
+ enum ps_skip_worktree_action sw_action);
char *find_pathspecs_matching_against_index(const struct pathspec *pathspec,
- struct index_state *istate);
- const struct index_state *istate,
++ struct index_state *istate,
+ enum ps_skip_worktree_action sw_action);
+ char *find_pathspecs_matching_skip_worktree(const struct pathspec *pathspec);
+ static inline int matches_skip_worktree(const struct pathspec *pathspec,
+ int item, char **seen_ptr)
+ {
+ if (!*seen_ptr)
+ *seen_ptr = find_pathspecs_matching_skip_worktree(pathspec);
+ return (*seen_ptr)[item];
+ }
-int match_pathspec_attrs(const struct index_state *istate,
+int match_pathspec_attrs(struct index_state *istate,
const char *name, int namelen,
const struct pathspec_item *item);