On Tue, Jul 11, 2017 at 10:23 AM, Durham Goode <dur...@fb.com> wrote:
>
>
> On 7/11/17 10:16 AM, Martin von Zweigbergk wrote:
>>
>> On Mon, Jul 10, 2017 at 2:48 PM, Durham Goode <dur...@fb.com> wrote:
>>>
>>>
>>>
>>> On 7/10/17 1:04 PM, Martin von Zweigbergk wrote:
>>>>
>>>>
>>>> On Mon, Jul 10, 2017 at 11:58 AM, Durham Goode <dur...@fb.com> wrote:
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> On 7/10/17 11:55 AM, Martin von Zweigbergk wrote:
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Mon, Jul 10, 2017 at 11:45 AM, Durham Goode <dur...@fb.com> wrote:
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> On 7/10/17 10:01 AM, Martin von Zweigbergk wrote:
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> (For Durham)
>>>>>>>>
>>>>>>>> On Sat, Jul 8, 2017 at 4:29 PM, Gregory Szorc
>>>>>>>> <gregory.sz...@gmail.com>
>>>>>>>> wrote:
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> # HG changeset patch
>>>>>>>>> # User Gregory Szorc <gregory.sz...@gmail.com>
>>>>>>>>> # Date 1499555309 25200
>>>>>>>>> #      Sat Jul 08 16:08:29 2017 -0700
>>>>>>>>> # Node ID 94f98bc84936defadb959e31012555dba170d8cd
>>>>>>>>> # Parent  a2867557f9c2314aeea19a946dfb8e167def4fb8
>>>>>>>>> dirstate: integrate sparse matcher with _ignore (API)
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> Why does sparse do it this way instead of intersecting the sparse
>>>>>>>> matcher with the user's matcher?
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> I'm not sure I understand the question.  What is the "user's matcher"
>>>>>>> here?
>>>>>>> The ignore matcher?
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> I mean the matcher the user may have provided on the command line (or
>>>>>> match.always() by default), as in "hg status dir/" (where the matcher
>>>>>> would be "relpath:dir").
>>>>>>
>>>>>>>
>>>>>>> This code produces a matcher that returns true for any file that
>>>>>>> should
>>>>>>> be
>>>>>>> ignored.  Since both hgignore files and sparse-ignored files should
>>>>>>> be
>>>>>>> ignored, I'm not sure how that could be expressed with intersection
>>>>>>> of
>>>>>>> those
>>>>>>> two matchers?
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> For narrowhg, we did it the other way around: filtering in instead of
>>>>>> filtering out. So if the narrowspec (like sparse config, IIUC) says to
>>>>>> include foo/ and bar/ and the user provides 'glob:*c', we'd intersect
>>>>>> that and list *.c files in those two directories (recursively).
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> I'd have to look at the code to be specific, but I think the dirstate
>>>>> ignore
>>>>> logic covers more cases than the user provided matcher logic. I'd be
>>>>> surprised if all commands that hit dirstate.ignore also happened to
>>>>> take
>>>>> patterns at the command level.
>>>>
>>>>
>>>>
>>>> If they don't, then the sparse matcher can be passed as is.
>>>>
>>>>>  It just seemed cleaner to have a unified
>>>>> matcher for ignored files at the repo level.  The user specific matcher
>>>>> can
>>>>> always be added on top of it later for commands that take patterns.
>>>>
>>>>
>>>>
>>>> For narrow, we have to apply the matcher when walking the manifest
>>>> too. The user can pass a matcher to e.g. "hg status -c ." or "hg files
>>>> -r ." and in those cases we need to intersect the narrow matcher with
>>>> the user-supplied one. It seemed more natural to do the same for
>>>> dirstate walks.
>>>>
>>>> It also seems simpler to control which directories are visited if
>>>> using a positive matcher than a negative one. For example, let's say
>>>> the narrow matcher is path:dir/. The narrowhg code will then restrict
>>>> the walk to visit only the root directory, dir/, and subdirectories of
>>>> dir/ (both for manifest walks and dirstate walks). I think we can
>>>> simply make negatematcher's visitdir return False iff the
>>>> narrow/sparse matcher returns 'all', so it's probably easy to get it
>>>> to work. It still seems more natural to me to match what should be
>>>> included.
>>>>
>>>
>>> I don't have a strong opinion either way. When I made sparse, it was
>>> specific to the working copy, so it mapped to the ignore matcher very
>>> tightly. If that needs to change, that's fine.
>>
>>
>> I just tried this. I think the result is cleaner, but there's a
>> functional change that perhaps suggests the reason you modified the
>> ignores instead of modifying the walk: untracked files outside the
>> sparse config are reported as ignored with your version and are not
>> reported at all with my version. That's an interesting aspect that I
>> had not thought about.
>>
>> I had previously considered adding an option to status for narrowhg to
>> make it also list files outside the narrow config. One option would be
>> to not include them by default and list their status as something
>> special (maybe O for outside?) since neither untracked nor ignored is
>> really accurate. They may (kind of) be tracked, just not in the
>> working copy, and with narrowhg with treemanifests we can't even tell
>> if they're in the manifest or not.
>>
>> So, would you be okay with changing the behavior to not report these
>> files as ignored by default and instead adding an option to status
>> (maybe --no-sparse)?
>
>
> If that's the only effect, I'm fine with that change.  The only time we care
> about the files outside the sparse checkout is when widening the sparse
> checkout (it checks if files already exist on disk and prevents the
> sparse-widening from overwriting them if the content differs), but that
> might be done via other means.

Great. I'll send patches (first a few patches to fix the matchers that
are currently broken).
_______________________________________________
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel

Reply via email to