match: strengthen visit_children_set invariant, Recursive means "all files"
My previous interpretation of "Recursive" was too relaxed: I thought it
instructed the caller to do something like this:
> you can stop calling `visit_children_set` because you'll need to descend into
> every directory recursively, but you should still check every file if it
> matches or not
Whereas the real instruction seems to be:
> I guarantee that everything in this subtree matches, you can stop
> querying the matcher for all files and dirs altogether.
The evidence to support this:
- the test actually passes with the stronger invariant, revealing no
exceptions from this rule
- the implementation of `visit_children_set` for `DifferenceMatcher`
clearly relies on this requirement, so it must hold for that not to
lead to bugs.
#testcases dirstate-v1 dirstate-v2
#if dirstate-v2
$ cat >> $HGRCPATH << EOF
> [format]
> use-dirstate-v2=1
> [storage]
> dirstate-v2.slow-path=allow
> EOF
#endif
The proliferation of status implementations can be confusing:
- The pure python implementation:
(no-rhg pure !)
- The C implementation:
(no-rhg no-rust no-pure !)
- The two rust implementations:
(rhg !)
(no-rhg rust !)
$ hg init repo1
$ cd repo1
$ mkdir d1
$ touch d1/x
$ hg commit -Am.
adding d1/x
$ touch d1/y
$ chmod -r d1
$ hg status
d1: $EACCES$
! d1/x (rhg !)
! d1/x (no-rhg rust !)
$ hg status
d1: $EACCES$
! d1/x (rust !)
! d1/x (no-rust rhg !)
$ chmod +r d1
$ hg status
? d1/y
$ touch d1/z
$ hg status
? d1/y
? d1/z