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.
$ hg init repo
$ cd repo
$ echo 0 > a
$ hg ci -qAm 0
$ for i in 5 8 14 43 167; do
> hg up -q 0
> echo $i > a
> hg ci -qm $i
> done
$ cat <<EOF >> .hg/hgrc
> [alias]
> l = log -T '{rev}:{shortest(node,1)}\n'
> EOF
$ hg l
5:00f
4:7ba5d
3:7ba57
2:72
1:9
0:b
$ cat <<EOF >> .hg/hgrc
> [experimental]
> revisions.disambiguatewithin=not 4
> EOF
$ hg l
5:00
4:7ba5d
3:7b
2:72
1:9
0:b
9 was unambiguous and still is
$ hg l -r 9
1:9
7 was ambiguous and still is
$ hg l -r 7
abort: ambiguous revision identifier: 7
[10]
7b is no longer ambiguous
$ hg l -r 7b
3:7b
$ cd ..