From: Junio C Hamano Date: Fri, 7 May 2021 03:47:39 +0000 (+0900) Subject: Merge branch 'mt/add-rm-in-sparse-checkout' X-Git-Tag: v2.32.0-rc0~42 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=fe069dce6251f40eb3d54861500c92afb0e481d9;p=thirdparty%2Fgit.git Merge branch 'mt/add-rm-in-sparse-checkout' "git add" and "git rm" learned not to touch those paths that are outside of sparse checkout. * mt/add-rm-in-sparse-checkout: rm: honor sparse checkout patterns add: warn when asked to update SKIP_WORKTREE entries refresh_index(): add flag to ignore SKIP_WORKTREE entries pathspec: allow to ignore SKIP_WORKTREE entries on index matching add: make --chmod and --renormalize honor sparse checkouts t3705: add tests for `git add` in sparse checkouts add: include magic part of pathspec on --refresh error --- fe069dce6251f40eb3d54861500c92afb0e481d9 diff --cc builtin/rm.c index 5559a0b453,d23a3b2164..d89f241e97 --- a/builtin/rm.c +++ b/builtin/rm.c @@@ -293,10 -294,10 +294,12 @@@ int cmd_rm(int argc, const char **argv 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); diff --cc pathspec.c index 14c7e9fbe3,8247a65ec8..08f8d3eedc --- a/pathspec.c +++ b/pathspec.c @@@ -20,8 -20,9 +20,9 @@@ * 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; @@@ -36,10 -37,10 +37,12 @@@ 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); } } @@@ -53,10 -54,26 +56,26 @@@ * 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; } diff --cc pathspec.h index 2ccc8080b6,5b4c6614bf..fceebb876f --- a/pathspec.h +++ b/pathspec.h @@@ -149,12 -149,26 +149,26 @@@ static inline int ps_strcmp(const struc 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);