Re: [PATCH 02/10] unpack-trees: make sparse aware
- From
Matheus Tavares Bernardino <matheus.bernardino@usp.br>
- Date
- Apr 21, 2021, 19:51 UTC
- Message-ID
- <CAHd-oW4xm_Uis6yCNtCJZ9qm7a6Oy4ty-05E1VPYGZvvXqaRwg@mail.gmail.com>
- In-Reply-To
- <CABPp-BG5uSUHy6bQ7xEWSQ8VAy0GCqX0P670HfcopZPUwAfQcw@mail.gmail.com>
On Wed, Apr 21, 2021 at 4:11 PM Elijah Newren <newren@gmail.com> wrote:
Show 72 quoted lines
>
> On Wed, Apr 21, 2021 at 11:55 AM Matheus Tavares Bernardino
> <matheus.bernardino@usp.br> wrote:
> >
> > On Wed, Apr 21, 2021 at 2:27 PM Derrick Stolee <stolee@gmail.com> 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@gmail.com> 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.
Show 21 quoted lines
> > > 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 :)