diff -r 036c26b08b71 -r b333ca94403d tests/test-revset.t --- a/tests/test-revset.t Sun May 24 14:10:52 2015 +0900 +++ b/tests/test-revset.t Sun Apr 26 18:13:48 2015 +0900 @@ -128,16 +128,15 @@ 6 $ try '0|1|2' (or - (or - ('symbol', '0') - ('symbol', '1')) + ('symbol', '0') + ('symbol', '1') ('symbol', '2')) * set: , , - >, - > + , + >> 0 1 2 @@ -910,6 +909,49 @@ 4 5 +test that chained `or` operations make balanced addsets + + $ try '0:1|1:2|2:3|3:4|4:5' + (or + (range + ('symbol', '0') + ('symbol', '1')) + (range + ('symbol', '1') + ('symbol', '2')) + (range + ('symbol', '2') + ('symbol', '3')) + (range + ('symbol', '3') + ('symbol', '4')) + (range + ('symbol', '4') + ('symbol', '5'))) + * set: + , + >, + , + , + >>> + 0 + 1 + 2 + 3 + 4 + 5 + +test that chained `or` operations never eat up stack (issue4624) +(uses `0:1` instead of `0` to avoid future optimization of trivial revisions) + + $ hg log -T '{rev}\n' -r "`python -c "print '|'.join(['0:1'] * 500)"`" + 0 + 1 + check that conversion to only works $ try --optimize '::3 - ::1' (minus @@ -1352,6 +1394,44 @@ 5 +test chained `or` operations are flattened at parsing phase + + $ echo 'chainedorops($1, $2, $3) = $1|$2|$3' >> .hg/hgrc + $ try 'chainedorops(0:1, 1:2, 2:3)' + (func + ('symbol', 'chainedorops') + (list + (list + (range + ('symbol', '0') + ('symbol', '1')) + (range + ('symbol', '1') + ('symbol', '2'))) + (range + ('symbol', '2') + ('symbol', '3')))) + (or + (range + ('symbol', '0') + ('symbol', '1')) + (range + ('symbol', '1') + ('symbol', '2')) + (range + ('symbol', '2') + ('symbol', '3'))) + * set: + , + , + >> + 0 + 1 + 2 + 3 + test variable isolation, variable placeholders are rewritten as string then parsed and matched again as string. Check they do not leak too far away.