On Wed, Apr 21, 2021 at 4:11 PM Elijah Newren <newren@xxxxxxxxx> wrote: > > On Wed, Apr 21, 2021 at 11:55 AM Matheus Tavares Bernardino > <matheus.bernardino@xxxxxx> wrote: > > > > On Wed, Apr 21, 2021 at 2:27 PM Derrick Stolee <stolee@xxxxxxxxx> wrote: > > > > > > On 4/20/2021 7:00 PM, Elijah Newren wrote: > > > > On Tue, Apr 13, 2021 at 7:01 AM Derrick Stolee via GitGitGadget > > > > <gitgitgadget@xxxxxxxxx> wrote: > > > > > > >> diff --git a/read-cache.c b/read-cache.c > > > >> index 29ffa9ac5db9..6308234b4838 100644 > > > >> --- a/read-cache.c > > > >> +++ b/read-cache.c > > > >> @@ -1594,6 +1594,9 @@ int refresh_index(struct index_state *istate, unsigned int flags, > > > >> if (ignore_skip_worktree && ce_skip_worktree(ce)) > > > >> continue; > > > >> > > > >> + if (istate->sparse_index && S_ISSPARSEDIR(ce->ce_mode)) > > > >> + continue; > > > >> + > > > > > > > > I'm a bit confused about what could trigger ce_skip_worktree(ce) && > > > > !ignore_skip_worktree and why it'd be desirable to refresh > > > > skip-worktree entries. However, this is tangential to your patch and > > > > has apparently been around since 2009 (in particular, from 56cac48c35 > > > > ("ie_match_stat(): do not ignore skip-worktree bit with > > > > CE_MATCH_IGNORE_VALID", 2009-12-14)). > > > > > > I did some more digging on this part here. There has been movement in > > > this space! > > > > > > The thing that triggers this ignore_skip_worktree variable inside > > > refresh_index() is now the REFRESH_IGNORE_SKIP_WORKTREE flag which was > > > introduced recently and is set only by builtin/add.c:refresh(), by > > > Matheus: a20f704 (add: warn when asked to update SKIP_WORKTREE entries, > > > 2021-04-08). > > > > > > This means that we can (for now) keep the behavior the same by adding > > > > > > if (ignore_skip_worktree) > > > ensure_full_index(istate); > > > > > > before the loop. > > > > Hmm, I don't think we need to expand the index here. > > ignore_skip_worktree makes the loop below ignore entries with the > > skip_worktree bit set. Since sparse dirs also have this bit set, we > > will already get the behavior we want :) > > > > However, I think we will need to expand the index at > > `find_pathspecs_matching_against_index()` in order to find and warn > > about the pathspecs that have matches among skip_worktree entries... > > > > > This prevents the expansion during 'git status', but > > > requires modification before we are ready for 'git add' to work > > > correctly. Specifically, 'git add' currently warns only when adding > > > something that exactly matches a tracked file with SKIP_WORKTREE. It > > > does _not_ warn when adding something that is untracked but would have > > > the SKIP_WORKTREE bit if it was tracked. We will need to add that > > > extra warning if we want to avoid expanding during 'git add'. > > > > Hmm, I see :( I was trying to think if it would be possible to do the > > pathspec matching (for the warning) without having to expand the > > index, but then there are the untracked files... If the user gives > > "a/*/c" and we have "a/b/" as a sparse dir, we don't know if "a/b/c" > > is a skip_worktree entry or an untracked file without expanding the > > index... > > I thought Stolee's series added something that could allow us to check > that e.g. "a/b/c" corresponded to an entry under the sparse directory > "a/b/" and thus is a would-be-sparse entry. Can we use that? Yes, you mean for the warning on untracked paths that would become sparse entries, right? The problem I was considering there was the warning on tracked entries only, in which case I'm not sure if it would help. > > > Alternatively, we can decide to change the behavior here and send an > > > error() and return failure if they try to add something that would > > > live within a sparse-directory entry. > > > > I think this behavior would be tricky to replicate on non-sparse-index > > sparse-checkouts, if we were to do that. We would have to pathspec > > match each untracked file against the sparsity patterns, perhaps? > > By way of analogy, don't we have to pay the cost of pathspec matching > each tree entry against the sparsity patterns when doing a checkout > before putting those entries into the index? Since "git add" is > trying to put new entries into the index, doesn't it make sense for it > to pay the same cost for the untracked paths it is about to place > there? > > Sure, that can be expensive for non-cone mode, but that's the price > users pay for using sparse-checkouts and not using cone mode, and they > pay it every time they try to update the index with some new checkout. > I think "git add" should be treated similarly as another way to update > the index -- especially since users will get confused (and have gotten > confused) by subsequent commands if we don't do those checks. Good point. Yeah, that all makes sense :)