revset: make parents() O(number of parents)
Strip executes a revset like this:
max(parents(_intlist('1234\x001235')) - _intlist('1234\x001235'))
Previously the parents() revset would do 'subset & parents' which iterates over
each item in the subset and checks if it's in parents. subset is usually the
entire repo (a spanset) so this takes a while.
Reversing the parameters to be 'parents & subset' means the operation becomes
O(number of parents) instead of O(size of repo). It also means the result gets
evaluated immediately (since parents isn't a lazy set), but I think this is a
win in most scenarios.
This shaves 0.3 seconds off strip (amend/histedit/rebase/etc) for large repositories.
revset #0: parents(20000)
0) obsolete feature not enabled but 54243 markers found!
! wall 0.006256 comb 0.010000 user 0.010000 sys 0.000000 (best of 289)
1) obsolete feature not enabled but 54243 markers found!
! wall 0.000391 comb 0.000000 user 0.000000 sys 0.000000 (best of 4323)
#!/bin/sh
# @ 3: 'move2'
# |
# o 2: 'move1'
# |
# | o 1: 'change'
# |/
# o 0: 'add'
hg init copies
cd copies
echo a > a
echo b > b
echo c > c
hg ci -Am add
echo a >> a
echo b >> b
echo c >> c
hg ci -m change
hg up -qC 0
hg cp a d
hg mv b e
hg mv c f
hg ci -m move1
hg mv e g
hg mv f c
hg ci -m move2
hg bundle -a ../renames.hg
cd ..