push: move `incoming` into the push object
The fact that there is some unknown changes on remote one of the result of
discovery. It is then used by some push validation logic.
We move it in the object to be able to extract the said logic.
push: move changeset push logic in its own function
Now that every necessary information is held in the `pushoperation` object, we
can extract the logic pushing changeset to it's own function.
This changeset is pure code movement only.
push: move `remoteheads` into the push object
The heads of the remote repository are used to detect race when pushing
changeset. We now store this information in `pushoperation` object to allow
extraction of the changeset pushing part.
revset: added lazyset implementation to matching revset
Performance Benchmarking:
$ time hg log -qr "first(matching(0))"
0:
9117c6561b0b
real 0m2.213s
user 0m2.149s
sys 0m0.055s
$ time ./hg log -qr "first(matching(0))"
0:
9117c6561b0b
real 0m0.177s
user 0m0.137s
sys 0m0.038s
revset: added lazyset implementation to _matchfiles
Performance Benchmarking:
$ time hg log -qr "first(file(README))"
0:
9117c6561b0b
real 0m2.234s
user 0m2.180s
sys 0m0.044s
$ time ./hg log -qr "first(file(README))"
0:
9117c6561b0b
real 0m0.172s
user 0m0.129s
sys 0m0.042s