tests/test-revset.t
changeset 34073 7bbc4e113e5f
parent 34065 c6c8a52e28c9
child 34126 af13097b44dd
equal deleted inserted replaced
34072:30535fe47e78 34073:7bbc4e113e5f
   153 
   153 
   154 trivial
   154 trivial
   155 
   155 
   156   $ try 0:1
   156   $ try 0:1
   157   (range
   157   (range
   158     ('symbol', '0')
   158     (symbol '0')
   159     ('symbol', '1'))
   159     (symbol '1'))
   160   * set:
   160   * set:
   161   <spanset+ 0:2>
   161   <spanset+ 0:2>
   162   0
   162   0
   163   1
   163   1
   164   $ try --optimize :
   164   $ try --optimize :
   179   7
   179   7
   180   8
   180   8
   181   9
   181   9
   182   $ try 3::6
   182   $ try 3::6
   183   (dagrange
   183   (dagrange
   184     ('symbol', '3')
   184     (symbol '3')
   185     ('symbol', '6'))
   185     (symbol '6'))
   186   * set:
   186   * set:
   187   <baseset+ [3, 5, 6]>
   187   <baseset+ [3, 5, 6]>
   188   3
   188   3
   189   5
   189   5
   190   6
   190   6
   191   $ try '0|1|2'
   191   $ try '0|1|2'
   192   (or
   192   (or
   193     (list
   193     (list
   194       ('symbol', '0')
   194       (symbol '0')
   195       ('symbol', '1')
   195       (symbol '1')
   196       ('symbol', '2')))
   196       (symbol '2')))
   197   * set:
   197   * set:
   198   <baseset [0, 1, 2]>
   198   <baseset [0, 1, 2]>
   199   0
   199   0
   200   1
   200   1
   201   2
   201   2
   202 
   202 
   203 names that should work without quoting
   203 names that should work without quoting
   204 
   204 
   205   $ try a
   205   $ try a
   206   ('symbol', 'a')
   206   (symbol 'a')
   207   * set:
   207   * set:
   208   <baseset [0]>
   208   <baseset [0]>
   209   0
   209   0
   210   $ try b-a
   210   $ try b-a
   211   (minus
   211   (minus
   212     ('symbol', 'b')
   212     (symbol 'b')
   213     ('symbol', 'a'))
   213     (symbol 'a'))
   214   * set:
   214   * set:
   215   <filteredset
   215   <filteredset
   216     <baseset [1]>,
   216     <baseset [1]>,
   217     <not
   217     <not
   218       <baseset [0]>>>
   218       <baseset [0]>>>
   219   1
   219   1
   220   $ try _a_b_c_
   220   $ try _a_b_c_
   221   ('symbol', '_a_b_c_')
   221   (symbol '_a_b_c_')
   222   * set:
   222   * set:
   223   <baseset [6]>
   223   <baseset [6]>
   224   6
   224   6
   225   $ try _a_b_c_-a
   225   $ try _a_b_c_-a
   226   (minus
   226   (minus
   227     ('symbol', '_a_b_c_')
   227     (symbol '_a_b_c_')
   228     ('symbol', 'a'))
   228     (symbol 'a'))
   229   * set:
   229   * set:
   230   <filteredset
   230   <filteredset
   231     <baseset [6]>,
   231     <baseset [6]>,
   232     <not
   232     <not
   233       <baseset [0]>>>
   233       <baseset [0]>>>
   234   6
   234   6
   235   $ try .a.b.c.
   235   $ try .a.b.c.
   236   ('symbol', '.a.b.c.')
   236   (symbol '.a.b.c.')
   237   * set:
   237   * set:
   238   <baseset [7]>
   238   <baseset [7]>
   239   7
   239   7
   240   $ try .a.b.c.-a
   240   $ try .a.b.c.-a
   241   (minus
   241   (minus
   242     ('symbol', '.a.b.c.')
   242     (symbol '.a.b.c.')
   243     ('symbol', 'a'))
   243     (symbol 'a'))
   244   * set:
   244   * set:
   245   <filteredset
   245   <filteredset
   246     <baseset [7]>,
   246     <baseset [7]>,
   247     <not
   247     <not
   248       <baseset [0]>>>
   248       <baseset [0]>>>
   249   7
   249   7
   250 
   250 
   251 names that should be caught by fallback mechanism
   251 names that should be caught by fallback mechanism
   252 
   252 
   253   $ try -- '-a-b-c-'
   253   $ try -- '-a-b-c-'
   254   ('symbol', '-a-b-c-')
   254   (symbol '-a-b-c-')
   255   * set:
   255   * set:
   256   <baseset [4]>
   256   <baseset [4]>
   257   4
   257   4
   258   $ log -a-b-c-
   258   $ log -a-b-c-
   259   4
   259   4
   260   $ try '+a+b+c+'
   260   $ try '+a+b+c+'
   261   ('symbol', '+a+b+c+')
   261   (symbol '+a+b+c+')
   262   * set:
   262   * set:
   263   <baseset [3]>
   263   <baseset [3]>
   264   3
   264   3
   265   $ try '+a+b+c+:'
   265   $ try '+a+b+c+:'
   266   (rangepost
   266   (rangepost
   267     ('symbol', '+a+b+c+'))
   267     (symbol '+a+b+c+'))
   268   * set:
   268   * set:
   269   <spanset+ 3:10>
   269   <spanset+ 3:10>
   270   3
   270   3
   271   4
   271   4
   272   5
   272   5
   274   7
   274   7
   275   8
   275   8
   276   9
   276   9
   277   $ try ':+a+b+c+'
   277   $ try ':+a+b+c+'
   278   (rangepre
   278   (rangepre
   279     ('symbol', '+a+b+c+'))
   279     (symbol '+a+b+c+'))
   280   * set:
   280   * set:
   281   <spanset+ 0:4>
   281   <spanset+ 0:4>
   282   0
   282   0
   283   1
   283   1
   284   2
   284   2
   285   3
   285   3
   286   $ try -- '-a-b-c-:+a+b+c+'
   286   $ try -- '-a-b-c-:+a+b+c+'
   287   (range
   287   (range
   288     ('symbol', '-a-b-c-')
   288     (symbol '-a-b-c-')
   289     ('symbol', '+a+b+c+'))
   289     (symbol '+a+b+c+'))
   290   * set:
   290   * set:
   291   <spanset- 3:5>
   291   <spanset- 3:5>
   292   4
   292   4
   293   3
   293   3
   294   $ log '-a-b-c-:+a+b+c+'
   294   $ log '-a-b-c-:+a+b+c+'
   298   $ try -- -a-b-c--a # complains
   298   $ try -- -a-b-c--a # complains
   299   (minus
   299   (minus
   300     (minus
   300     (minus
   301       (minus
   301       (minus
   302         (negate
   302         (negate
   303           ('symbol', 'a'))
   303           (symbol 'a'))
   304         ('symbol', 'b'))
   304         (symbol 'b'))
   305       ('symbol', 'c'))
   305       (symbol 'c'))
   306     (negate
   306     (negate
   307       ('symbol', 'a')))
   307       (symbol 'a')))
   308   abort: unknown revision '-a'!
   308   abort: unknown revision '-a'!
   309   [255]
   309   [255]
   310   $ try é
   310   $ try é
   311   ('symbol', '\xc3\xa9')
   311   (symbol '\xc3\xa9')
   312   * set:
   312   * set:
   313   <baseset [9]>
   313   <baseset [9]>
   314   9
   314   9
   315 
   315 
   316 no quoting needed
   316 no quoting needed
   322 
   322 
   323 quoting needed
   323 quoting needed
   324 
   324 
   325   $ try '"-a-b-c-"-a'
   325   $ try '"-a-b-c-"-a'
   326   (minus
   326   (minus
   327     ('string', '-a-b-c-')
   327     (string '-a-b-c-')
   328     ('symbol', 'a'))
   328     (symbol 'a'))
   329   * set:
   329   * set:
   330   <filteredset
   330   <filteredset
   331     <baseset [4]>,
   331     <baseset [4]>,
   332     <not
   332     <not
   333       <baseset [0]>>>
   333       <baseset [0]>>>
   343   $ log '1&2'
   343   $ log '1&2'
   344   $ try '1&2|3' # precedence - and is higher
   344   $ try '1&2|3' # precedence - and is higher
   345   (or
   345   (or
   346     (list
   346     (list
   347       (and
   347       (and
   348         ('symbol', '1')
   348         (symbol '1')
   349         ('symbol', '2'))
   349         (symbol '2'))
   350       ('symbol', '3')))
   350       (symbol '3')))
   351   * set:
   351   * set:
   352   <addset
   352   <addset
   353     <baseset []>,
   353     <baseset []>,
   354     <baseset [3]>>
   354     <baseset [3]>>
   355   3
   355   3
   356   $ try '1|2&3'
   356   $ try '1|2&3'
   357   (or
   357   (or
   358     (list
   358     (list
   359       ('symbol', '1')
   359       (symbol '1')
   360       (and
   360       (and
   361         ('symbol', '2')
   361         (symbol '2')
   362         ('symbol', '3'))))
   362         (symbol '3'))))
   363   * set:
   363   * set:
   364   <addset
   364   <addset
   365     <baseset [1]>,
   365     <baseset [1]>,
   366     <baseset []>>
   366     <baseset []>>
   367   1
   367   1
   368   $ try '1&2&3' # associativity
   368   $ try '1&2&3' # associativity
   369   (and
   369   (and
   370     (and
   370     (and
   371       ('symbol', '1')
   371       (symbol '1')
   372       ('symbol', '2'))
   372       (symbol '2'))
   373     ('symbol', '3'))
   373     (symbol '3'))
   374   * set:
   374   * set:
   375   <baseset []>
   375   <baseset []>
   376   $ try '1|(2|3)'
   376   $ try '1|(2|3)'
   377   (or
   377   (or
   378     (list
   378     (list
   379       ('symbol', '1')
   379       (symbol '1')
   380       (group
   380       (group
   381         (or
   381         (or
   382           (list
   382           (list
   383             ('symbol', '2')
   383             (symbol '2')
   384             ('symbol', '3'))))))
   384             (symbol '3'))))))
   385   * set:
   385   * set:
   386   <addset
   386   <addset
   387     <baseset [1]>,
   387     <baseset [1]>,
   388     <baseset [2, 3]>>
   388     <baseset [2, 3]>>
   389   1
   389   1
   469   hg: parse error: extra got an unexpected keyword argument 'unknown'
   469   hg: parse error: extra got an unexpected keyword argument 'unknown'
   470   [255]
   470   [255]
   471 
   471 
   472   $ try 'foo=bar|baz'
   472   $ try 'foo=bar|baz'
   473   (keyvalue
   473   (keyvalue
   474     ('symbol', 'foo')
   474     (symbol 'foo')
   475     (or
   475     (or
   476       (list
   476       (list
   477         ('symbol', 'bar')
   477         (symbol 'bar')
   478         ('symbol', 'baz'))))
   478         (symbol 'baz'))))
   479   hg: parse error: can't use a key-value pair in this context
   479   hg: parse error: can't use a key-value pair in this context
   480   [255]
   480   [255]
   481 
   481 
   482  right-hand side should be optimized recursively
   482  right-hand side should be optimized recursively
   483 
   483 
   484   $ try --optimize 'foo=(not public())'
   484   $ try --optimize 'foo=(not public())'
   485   (keyvalue
   485   (keyvalue
   486     ('symbol', 'foo')
   486     (symbol 'foo')
   487     (group
   487     (group
   488       (not
   488       (not
   489         (func
   489         (func
   490           ('symbol', 'public')
   490           (symbol 'public')
   491           None))))
   491           None))))
   492   * optimized:
   492   * optimized:
   493   (keyvalue
   493   (keyvalue
   494     ('symbol', 'foo')
   494     (symbol 'foo')
   495     (func
   495     (func
   496       ('symbol', '_notpublic')
   496       (symbol '_notpublic')
   497       None))
   497       None))
   498   hg: parse error: can't use a key-value pair in this context
   498   hg: parse error: can't use a key-value pair in this context
   499   [255]
   499   [255]
   500 
   500 
   501 relation-subscript operator has the highest binding strength (as function call):
   501 relation-subscript operator has the highest binding strength (as function call):
   502 
   502 
   503   $ hg debugrevspec -p parsed 'tip:tip^#generations[-1]'
   503   $ hg debugrevspec -p parsed 'tip:tip^#generations[-1]'
   504   * parsed:
   504   * parsed:
   505   (range
   505   (range
   506     ('symbol', 'tip')
   506     (symbol 'tip')
   507     (relsubscript
   507     (relsubscript
   508       (parentpost
   508       (parentpost
   509         ('symbol', 'tip'))
   509         (symbol 'tip'))
   510       ('symbol', 'generations')
   510       (symbol 'generations')
   511       (negate
   511       (negate
   512         ('symbol', '1'))))
   512         (symbol '1'))))
   513   9
   513   9
   514   8
   514   8
   515   7
   515   7
   516   6
   516   6
   517   5
   517   5
   520   $ hg debugrevspec -p parsed --no-show-revs 'not public()#generations[0]'
   520   $ hg debugrevspec -p parsed --no-show-revs 'not public()#generations[0]'
   521   * parsed:
   521   * parsed:
   522   (not
   522   (not
   523     (relsubscript
   523     (relsubscript
   524       (func
   524       (func
   525         ('symbol', 'public')
   525         (symbol 'public')
   526         None)
   526         None)
   527       ('symbol', 'generations')
   527       (symbol 'generations')
   528       ('symbol', '0')))
   528       (symbol '0')))
   529 
   529 
   530 left-hand side of relation-subscript operator should be optimized recursively:
   530 left-hand side of relation-subscript operator should be optimized recursively:
   531 
   531 
   532   $ hg debugrevspec -p analyzed -p optimized --no-show-revs \
   532   $ hg debugrevspec -p analyzed -p optimized --no-show-revs \
   533   > '(not public())#generations[0]'
   533   > '(not public())#generations[0]'
   534   * analyzed:
   534   * analyzed:
   535   (relsubscript
   535   (relsubscript
   536     (not
   536     (not
   537       (func
   537       (func
   538         ('symbol', 'public')
   538         (symbol 'public')
   539         None))
   539         None))
   540     ('symbol', 'generations')
   540     (symbol 'generations')
   541     ('symbol', '0'))
   541     (symbol '0'))
   542   * optimized:
   542   * optimized:
   543   (relsubscript
   543   (relsubscript
   544     (func
   544     (func
   545       ('symbol', '_notpublic')
   545       (symbol '_notpublic')
   546       None)
   546       None)
   547     ('symbol', 'generations')
   547     (symbol 'generations')
   548     ('symbol', '0'))
   548     (symbol '0'))
   549 
   549 
   550 resolution of subscript and relation-subscript ternary operators:
   550 resolution of subscript and relation-subscript ternary operators:
   551 
   551 
   552   $ hg debugrevspec -p analyzed 'tip[0]'
   552   $ hg debugrevspec -p analyzed 'tip[0]'
   553   * analyzed:
   553   * analyzed:
   554   (subscript
   554   (subscript
   555     ('symbol', 'tip')
   555     (symbol 'tip')
   556     ('symbol', '0'))
   556     (symbol '0'))
   557   hg: parse error: can't use a subscript in this context
   557   hg: parse error: can't use a subscript in this context
   558   [255]
   558   [255]
   559 
   559 
   560   $ hg debugrevspec -p analyzed 'tip#rel[0]'
   560   $ hg debugrevspec -p analyzed 'tip#rel[0]'
   561   * analyzed:
   561   * analyzed:
   562   (relsubscript
   562   (relsubscript
   563     ('symbol', 'tip')
   563     (symbol 'tip')
   564     ('symbol', 'rel')
   564     (symbol 'rel')
   565     ('symbol', '0'))
   565     (symbol '0'))
   566   hg: parse error: unknown identifier: rel
   566   hg: parse error: unknown identifier: rel
   567   [255]
   567   [255]
   568 
   568 
   569   $ hg debugrevspec -p analyzed '(tip#rel)[0]'
   569   $ hg debugrevspec -p analyzed '(tip#rel)[0]'
   570   * analyzed:
   570   * analyzed:
   571   (subscript
   571   (subscript
   572     (relation
   572     (relation
   573       ('symbol', 'tip')
   573       (symbol 'tip')
   574       ('symbol', 'rel'))
   574       (symbol 'rel'))
   575     ('symbol', '0'))
   575     (symbol '0'))
   576   hg: parse error: can't use a subscript in this context
   576   hg: parse error: can't use a subscript in this context
   577   [255]
   577   [255]
   578 
   578 
   579   $ hg debugrevspec -p analyzed 'tip#rel[0][1]'
   579   $ hg debugrevspec -p analyzed 'tip#rel[0][1]'
   580   * analyzed:
   580   * analyzed:
   581   (subscript
   581   (subscript
   582     (relsubscript
   582     (relsubscript
   583       ('symbol', 'tip')
   583       (symbol 'tip')
   584       ('symbol', 'rel')
   584       (symbol 'rel')
   585       ('symbol', '0'))
   585       (symbol '0'))
   586     ('symbol', '1'))
   586     (symbol '1'))
   587   hg: parse error: can't use a subscript in this context
   587   hg: parse error: can't use a subscript in this context
   588   [255]
   588   [255]
   589 
   589 
   590   $ hg debugrevspec -p analyzed 'tip#rel0#rel1[1]'
   590   $ hg debugrevspec -p analyzed 'tip#rel0#rel1[1]'
   591   * analyzed:
   591   * analyzed:
   592   (relsubscript
   592   (relsubscript
   593     (relation
   593     (relation
   594       ('symbol', 'tip')
   594       (symbol 'tip')
   595       ('symbol', 'rel0'))
   595       (symbol 'rel0'))
   596     ('symbol', 'rel1')
   596     (symbol 'rel1')
   597     ('symbol', '1'))
   597     (symbol '1'))
   598   hg: parse error: unknown identifier: rel1
   598   hg: parse error: unknown identifier: rel1
   599   [255]
   599   [255]
   600 
   600 
   601   $ hg debugrevspec -p analyzed 'tip#rel0[0]#rel1[1]'
   601   $ hg debugrevspec -p analyzed 'tip#rel0[0]#rel1[1]'
   602   * analyzed:
   602   * analyzed:
   603   (relsubscript
   603   (relsubscript
   604     (relsubscript
   604     (relsubscript
   605       ('symbol', 'tip')
   605       (symbol 'tip')
   606       ('symbol', 'rel0')
   606       (symbol 'rel0')
   607       ('symbol', '0'))
   607       (symbol '0'))
   608     ('symbol', 'rel1')
   608     (symbol 'rel1')
   609     ('symbol', '1'))
   609     (symbol '1'))
   610   hg: parse error: unknown identifier: rel1
   610   hg: parse error: unknown identifier: rel1
   611   [255]
   611   [255]
   612 
   612 
   613 parse errors of relation, subscript and relation-subscript operators:
   613 parse errors of relation, subscript and relation-subscript operators:
   614 
   614 
   673   * parsed:
   673   * parsed:
   674   (minus
   674   (minus
   675     (group
   675     (group
   676       (or
   676       (or
   677         (list
   677         (list
   678           ('symbol', '0')
   678           (symbol '0')
   679           ('symbol', '1'))))
   679           (symbol '1'))))
   680     ('symbol', '1'))
   680     (symbol '1'))
   681   * analyzed:
   681   * analyzed:
   682   (and
   682   (and
   683     (or
   683     (or
   684       (list
   684       (list
   685         ('symbol', '0')
   685         (symbol '0')
   686         ('symbol', '1')))
   686         (symbol '1')))
   687     (not
   687     (not
   688       ('symbol', '1')))
   688       (symbol '1')))
   689   * optimized:
   689   * optimized:
   690   (difference
   690   (difference
   691     (func
   691     (func
   692       ('symbol', '_list')
   692       (symbol '_list')
   693       ('string', '0\x001'))
   693       (string '0\x001'))
   694     ('symbol', '1'))
   694     (symbol '1'))
   695   0
   695   0
   696 
   696 
   697   $ hg debugrevspec -p unknown '0'
   697   $ hg debugrevspec -p unknown '0'
   698   abort: invalid stage name: unknown
   698   abort: invalid stage name: unknown
   699   [255]
   699   [255]
   708 
   708 
   709   $ hg debugrevspec --verify -v -p analyzed -p optimized 'r3232() & 2'
   709   $ hg debugrevspec --verify -v -p analyzed -p optimized 'r3232() & 2'
   710   * analyzed:
   710   * analyzed:
   711   (and
   711   (and
   712     (func
   712     (func
   713       ('symbol', 'r3232')
   713       (symbol 'r3232')
   714       None)
   714       None)
   715     ('symbol', '2'))
   715     (symbol '2'))
   716   * optimized:
   716   * optimized:
   717   (andsmally
   717   (andsmally
   718     (func
   718     (func
   719       ('symbol', 'r3232')
   719       (symbol 'r3232')
   720       None)
   720       None)
   721     ('symbol', '2'))
   721     (symbol '2'))
   722   * analyzed set:
   722   * analyzed set:
   723   <baseset [2]>
   723   <baseset [2]>
   724   * optimized set:
   724   * optimized set:
   725   <baseset [2, 2]>
   725   <baseset [2, 2]>
   726   --- analyzed
   726   --- analyzed
   764   8
   764   8
   765   9
   765   9
   766   $ try -p analyzed ':1'
   766   $ try -p analyzed ':1'
   767   * analyzed:
   767   * analyzed:
   768   (rangepre
   768   (rangepre
   769     ('symbol', '1'))
   769     (symbol '1'))
   770   * set:
   770   * set:
   771   <spanset+ 0:2>
   771   <spanset+ 0:2>
   772   0
   772   0
   773   1
   773   1
   774   $ try -p analyzed ':(1|2)'
   774   $ try -p analyzed ':(1|2)'
   775   * analyzed:
   775   * analyzed:
   776   (rangepre
   776   (rangepre
   777     (or
   777     (or
   778       (list
   778       (list
   779         ('symbol', '1')
   779         (symbol '1')
   780         ('symbol', '2'))))
   780         (symbol '2'))))
   781   * set:
   781   * set:
   782   <spanset+ 0:3>
   782   <spanset+ 0:3>
   783   0
   783   0
   784   1
   784   1
   785   2
   785   2
   786   $ try -p analyzed ':(1&2)'
   786   $ try -p analyzed ':(1&2)'
   787   * analyzed:
   787   * analyzed:
   788   (rangepre
   788   (rangepre
   789     (and
   789     (and
   790       ('symbol', '1')
   790       (symbol '1')
   791       ('symbol', '2')))
   791       (symbol '2')))
   792   * set:
   792   * set:
   793   <baseset []>
   793   <baseset []>
   794 
   794 
   795 infix/suffix resolution of ^ operator (issue2884):
   795 infix/suffix resolution of ^ operator (issue2884):
   796 
   796 
   797  x^:y means (x^):y
   797  x^:y means (x^):y
   798 
   798 
   799   $ try '1^:2'
   799   $ try '1^:2'
   800   (range
   800   (range
   801     (parentpost
   801     (parentpost
   802       ('symbol', '1'))
   802       (symbol '1'))
   803     ('symbol', '2'))
   803     (symbol '2'))
   804   * set:
   804   * set:
   805   <spanset+ 0:3>
   805   <spanset+ 0:3>
   806   0
   806   0
   807   1
   807   1
   808   2
   808   2
   809 
   809 
   810   $ try '1^::2'
   810   $ try '1^::2'
   811   (dagrange
   811   (dagrange
   812     (parentpost
   812     (parentpost
   813       ('symbol', '1'))
   813       (symbol '1'))
   814     ('symbol', '2'))
   814     (symbol '2'))
   815   * set:
   815   * set:
   816   <baseset+ [0, 1, 2]>
   816   <baseset+ [0, 1, 2]>
   817   0
   817   0
   818   1
   818   1
   819   2
   819   2
   820 
   820 
   821   $ try '9^:'
   821   $ try '9^:'
   822   (rangepost
   822   (rangepost
   823     (parentpost
   823     (parentpost
   824       ('symbol', '9')))
   824       (symbol '9')))
   825   * set:
   825   * set:
   826   <spanset+ 8:10>
   826   <spanset+ 8:10>
   827   8
   827   8
   828   9
   828   9
   829 
   829 
   830  x^:y should be resolved before omitting group operators
   830  x^:y should be resolved before omitting group operators
   831 
   831 
   832   $ try '1^(:2)'
   832   $ try '1^(:2)'
   833   (parent
   833   (parent
   834     ('symbol', '1')
   834     (symbol '1')
   835     (group
   835     (group
   836       (rangepre
   836       (rangepre
   837         ('symbol', '2'))))
   837         (symbol '2'))))
   838   hg: parse error: ^ expects a number 0, 1, or 2
   838   hg: parse error: ^ expects a number 0, 1, or 2
   839   [255]
   839   [255]
   840 
   840 
   841  x^:y should be resolved recursively
   841  x^:y should be resolved recursively
   842 
   842 
   843   $ try 'sort(1^:2)'
   843   $ try 'sort(1^:2)'
   844   (func
   844   (func
   845     ('symbol', 'sort')
   845     (symbol 'sort')
   846     (range
   846     (range
   847       (parentpost
   847       (parentpost
   848         ('symbol', '1'))
   848         (symbol '1'))
   849       ('symbol', '2')))
   849       (symbol '2')))
   850   * set:
   850   * set:
   851   <spanset+ 0:3>
   851   <spanset+ 0:3>
   852   0
   852   0
   853   1
   853   1
   854   2
   854   2
   857   (range
   857   (range
   858     (parentpost
   858     (parentpost
   859       (group
   859       (group
   860         (range
   860         (range
   861           (parentpost
   861           (parentpost
   862             ('symbol', '3'))
   862             (symbol '3'))
   863           ('symbol', '4'))))
   863           (symbol '4'))))
   864     ('symbol', '2'))
   864     (symbol '2'))
   865   * set:
   865   * set:
   866   <spanset+ 0:3>
   866   <spanset+ 0:3>
   867   0
   867   0
   868   1
   868   1
   869   2
   869   2
   872   (dagrange
   872   (dagrange
   873     (parentpost
   873     (parentpost
   874       (group
   874       (group
   875         (dagrange
   875         (dagrange
   876           (parentpost
   876           (parentpost
   877             ('symbol', '3'))
   877             (symbol '3'))
   878           ('symbol', '4'))))
   878           (symbol '4'))))
   879     ('symbol', '2'))
   879     (symbol '2'))
   880   * set:
   880   * set:
   881   <baseset+ [0, 1, 2]>
   881   <baseset+ [0, 1, 2]>
   882   0
   882   0
   883   1
   883   1
   884   2
   884   2
   887   (rangepost
   887   (rangepost
   888     (parentpost
   888     (parentpost
   889       (group
   889       (group
   890         (rangepost
   890         (rangepost
   891           (parentpost
   891           (parentpost
   892             ('symbol', '9'))))))
   892             (symbol '9'))))))
   893   * set:
   893   * set:
   894   <spanset+ 4:10>
   894   <spanset+ 4:10>
   895   4
   895   4
   896   5
   896   5
   897   6
   897   6
   900   9
   900   9
   901 
   901 
   902  x^ in alias should also be resolved
   902  x^ in alias should also be resolved
   903 
   903 
   904   $ try 'A' --config 'revsetalias.A=1^:2'
   904   $ try 'A' --config 'revsetalias.A=1^:2'
   905   ('symbol', 'A')
   905   (symbol 'A')
   906   * expanded:
   906   * expanded:
   907   (range
   907   (range
   908     (parentpost
   908     (parentpost
   909       ('symbol', '1'))
   909       (symbol '1'))
   910     ('symbol', '2'))
   910     (symbol '2'))
   911   * set:
   911   * set:
   912   <spanset+ 0:3>
   912   <spanset+ 0:3>
   913   0
   913   0
   914   1
   914   1
   915   2
   915   2
   916 
   916 
   917   $ try 'A:2' --config 'revsetalias.A=1^'
   917   $ try 'A:2' --config 'revsetalias.A=1^'
   918   (range
   918   (range
   919     ('symbol', 'A')
   919     (symbol 'A')
   920     ('symbol', '2'))
   920     (symbol '2'))
   921   * expanded:
   921   * expanded:
   922   (range
   922   (range
   923     (parentpost
   923     (parentpost
   924       ('symbol', '1'))
   924       (symbol '1'))
   925     ('symbol', '2'))
   925     (symbol '2'))
   926   * set:
   926   * set:
   927   <spanset+ 0:3>
   927   <spanset+ 0:3>
   928   0
   928   0
   929   1
   929   1
   930   2
   930   2
   932  but not beyond the boundary of alias expansion, because the resolution should
   932  but not beyond the boundary of alias expansion, because the resolution should
   933  be made at the parsing stage
   933  be made at the parsing stage
   934 
   934 
   935   $ try '1^A' --config 'revsetalias.A=:2'
   935   $ try '1^A' --config 'revsetalias.A=:2'
   936   (parent
   936   (parent
   937     ('symbol', '1')
   937     (symbol '1')
   938     ('symbol', 'A'))
   938     (symbol 'A'))
   939   * expanded:
   939   * expanded:
   940   (parent
   940   (parent
   941     ('symbol', '1')
   941     (symbol '1')
   942     (rangepre
   942     (rangepre
   943       ('symbol', '2')))
   943       (symbol '2')))
   944   hg: parse error: ^ expects a number 0, 1, or 2
   944   hg: parse error: ^ expects a number 0, 1, or 2
   945   [255]
   945   [255]
   946 
   946 
   947 ancestor can accept 0 or more arguments
   947 ancestor can accept 0 or more arguments
   948 
   948 
  1166 
  1166 
  1167   $ hg debugrevspec -p parsed 'roots(:)#g[2]'
  1167   $ hg debugrevspec -p parsed 'roots(:)#g[2]'
  1168   * parsed:
  1168   * parsed:
  1169   (relsubscript
  1169   (relsubscript
  1170     (func
  1170     (func
  1171       ('symbol', 'roots')
  1171       (symbol 'roots')
  1172       (rangeall
  1172       (rangeall
  1173         None))
  1173         None))
  1174     ('symbol', 'g')
  1174     (symbol 'g')
  1175     ('symbol', '2'))
  1175     (symbol '2'))
  1176   2
  1176   2
  1177   3
  1177   3
  1178 
  1178 
  1179 test author
  1179 test author
  1180 
  1180 
  1268   9
  1268   9
  1269   $ log 'grep("issue\d+")'
  1269   $ log 'grep("issue\d+")'
  1270   6
  1270   6
  1271   $ try 'grep("(")' # invalid regular expression
  1271   $ try 'grep("(")' # invalid regular expression
  1272   (func
  1272   (func
  1273     ('symbol', 'grep')
  1273     (symbol 'grep')
  1274     ('string', '('))
  1274     (string '('))
  1275   hg: parse error: invalid match pattern: unbalanced parenthesis
  1275   hg: parse error: invalid match pattern: unbalanced parenthesis
  1276   [255]
  1276   [255]
  1277   $ try 'grep("\bissue\d+")'
  1277   $ try 'grep("\bissue\d+")'
  1278   (func
  1278   (func
  1279     ('symbol', 'grep')
  1279     (symbol 'grep')
  1280     ('string', '\x08issue\\d+'))
  1280     (string '\x08issue\\d+'))
  1281   * set:
  1281   * set:
  1282   <filteredset
  1282   <filteredset
  1283     <fullreposet+ 0:10>,
  1283     <fullreposet+ 0:10>,
  1284     <grep '\x08issue\\d+'>>
  1284     <grep '\x08issue\\d+'>>
  1285   $ try 'grep(r"\bissue\d+")'
  1285   $ try 'grep(r"\bissue\d+")'
  1286   (func
  1286   (func
  1287     ('symbol', 'grep')
  1287     (symbol 'grep')
  1288     ('string', '\\bissue\\d+'))
  1288     (string '\\bissue\\d+'))
  1289   * set:
  1289   * set:
  1290   <filteredset
  1290   <filteredset
  1291     <fullreposet+ 0:10>,
  1291     <fullreposet+ 0:10>,
  1292     <grep '\\bissue\\d+'>>
  1292     <grep '\\bissue\\d+'>>
  1293   6
  1293   6
  1600 
  1600 
  1601   $ try --optimize '8:9-8%'
  1601   $ try --optimize '8:9-8%'
  1602   (onlypost
  1602   (onlypost
  1603     (minus
  1603     (minus
  1604       (range
  1604       (range
  1605         ('symbol', '8')
  1605         (symbol '8')
  1606         ('symbol', '9'))
  1606         (symbol '9'))
  1607       ('symbol', '8')))
  1607       (symbol '8')))
  1608   * optimized:
  1608   * optimized:
  1609   (func
  1609   (func
  1610     ('symbol', 'only')
  1610     (symbol 'only')
  1611     (difference
  1611     (difference
  1612       (range
  1612       (range
  1613         ('symbol', '8')
  1613         (symbol '8')
  1614         ('symbol', '9'))
  1614         (symbol '9'))
  1615       ('symbol', '8')))
  1615       (symbol '8')))
  1616   * set:
  1616   * set:
  1617   <baseset+ [8, 9]>
  1617   <baseset+ [8, 9]>
  1618   8
  1618   8
  1619   9
  1619   9
  1620   $ try --optimize '(9)%(5)'
  1620   $ try --optimize '(9)%(5)'
  1621   (only
  1621   (only
  1622     (group
  1622     (group
  1623       ('symbol', '9'))
  1623       (symbol '9'))
  1624     (group
  1624     (group
  1625       ('symbol', '5')))
  1625       (symbol '5')))
  1626   * optimized:
  1626   * optimized:
  1627   (func
  1627   (func
  1628     ('symbol', 'only')
  1628     (symbol 'only')
  1629     (list
  1629     (list
  1630       ('symbol', '9')
  1630       (symbol '9')
  1631       ('symbol', '5')))
  1631       (symbol '5')))
  1632   * set:
  1632   * set:
  1633   <baseset+ [2, 4, 8, 9]>
  1633   <baseset+ [2, 4, 8, 9]>
  1634   2
  1634   2
  1635   4
  1635   4
  1636   8
  1636   8
  1960   $ try -p optimized '3:0 & 0:3 & not 2:1'
  1960   $ try -p optimized '3:0 & 0:3 & not 2:1'
  1961   * optimized:
  1961   * optimized:
  1962   (difference
  1962   (difference
  1963     (and
  1963     (and
  1964       (range
  1964       (range
  1965         ('symbol', '3')
  1965         (symbol '3')
  1966         ('symbol', '0'))
  1966         (symbol '0'))
  1967       (range
  1967       (range
  1968         ('symbol', '0')
  1968         (symbol '0')
  1969         ('symbol', '3')))
  1969         (symbol '3')))
  1970     (range
  1970     (range
  1971       ('symbol', '2')
  1971       (symbol '2')
  1972       ('symbol', '1')))
  1972       (symbol '1')))
  1973   * set:
  1973   * set:
  1974   <filteredset
  1974   <filteredset
  1975     <filteredset
  1975     <filteredset
  1976       <spanset- 0:4>,
  1976       <spanset- 0:4>,
  1977       <spanset+ 0:4>>,
  1977       <spanset+ 0:4>>,
  1984  the left expression:
  1984  the left expression:
  1985 
  1985 
  1986   $ try --optimize '2:0 & (0 + 1 + 2)'
  1986   $ try --optimize '2:0 & (0 + 1 + 2)'
  1987   (and
  1987   (and
  1988     (range
  1988     (range
  1989       ('symbol', '2')
  1989       (symbol '2')
  1990       ('symbol', '0'))
  1990       (symbol '0'))
  1991     (group
  1991     (group
  1992       (or
  1992       (or
  1993         (list
  1993         (list
  1994           ('symbol', '0')
  1994           (symbol '0')
  1995           ('symbol', '1')
  1995           (symbol '1')
  1996           ('symbol', '2')))))
  1996           (symbol '2')))))
  1997   * optimized:
  1997   * optimized:
  1998   (and
  1998   (and
  1999     (range
  1999     (range
  2000       ('symbol', '2')
  2000       (symbol '2')
  2001       ('symbol', '0'))
  2001       (symbol '0'))
  2002     (func
  2002     (func
  2003       ('symbol', '_list')
  2003       (symbol '_list')
  2004       ('string', '0\x001\x002')))
  2004       (string '0\x001\x002')))
  2005   * set:
  2005   * set:
  2006   <filteredset
  2006   <filteredset
  2007     <spanset- 0:3>,
  2007     <spanset- 0:3>,
  2008     <baseset [0, 1, 2]>>
  2008     <baseset [0, 1, 2]>>
  2009   2
  2009   2
  2013  'A + B' should take the ordering of the left expression:
  2013  'A + B' should take the ordering of the left expression:
  2014 
  2014 
  2015   $ try --optimize '2:0 & (0:1 + 2)'
  2015   $ try --optimize '2:0 & (0:1 + 2)'
  2016   (and
  2016   (and
  2017     (range
  2017     (range
  2018       ('symbol', '2')
  2018       (symbol '2')
  2019       ('symbol', '0'))
  2019       (symbol '0'))
  2020     (group
  2020     (group
  2021       (or
  2021       (or
  2022         (list
  2022         (list
  2023           (range
  2023           (range
  2024             ('symbol', '0')
  2024             (symbol '0')
  2025             ('symbol', '1'))
  2025             (symbol '1'))
  2026           ('symbol', '2')))))
  2026           (symbol '2')))))
  2027   * optimized:
  2027   * optimized:
  2028   (and
  2028   (and
  2029     (range
  2029     (range
  2030       ('symbol', '2')
  2030       (symbol '2')
  2031       ('symbol', '0'))
  2031       (symbol '0'))
  2032     (or
  2032     (or
  2033       (list
  2033       (list
  2034         (range
  2034         (range
  2035           ('symbol', '0')
  2035           (symbol '0')
  2036           ('symbol', '1'))
  2036           (symbol '1'))
  2037         ('symbol', '2'))))
  2037         (symbol '2'))))
  2038   * set:
  2038   * set:
  2039   <filteredset
  2039   <filteredset
  2040     <spanset- 0:3>,
  2040     <spanset- 0:3>,
  2041     <addset
  2041     <addset
  2042       <spanset+ 0:2>,
  2042       <spanset+ 0:2>,
  2048  '_intlist(a b)' should behave like 'a + b':
  2048  '_intlist(a b)' should behave like 'a + b':
  2049 
  2049 
  2050   $ trylist --optimize '2:0 & %ld' 0 1 2
  2050   $ trylist --optimize '2:0 & %ld' 0 1 2
  2051   (and
  2051   (and
  2052     (range
  2052     (range
  2053       ('symbol', '2')
  2053       (symbol '2')
  2054       ('symbol', '0'))
  2054       (symbol '0'))
  2055     (func
  2055     (func
  2056       ('symbol', '_intlist')
  2056       (symbol '_intlist')
  2057       ('string', '0\x001\x002')))
  2057       (string '0\x001\x002')))
  2058   * optimized:
  2058   * optimized:
  2059   (andsmally
  2059   (andsmally
  2060     (range
  2060     (range
  2061       ('symbol', '2')
  2061       (symbol '2')
  2062       ('symbol', '0'))
  2062       (symbol '0'))
  2063     (func
  2063     (func
  2064       ('symbol', '_intlist')
  2064       (symbol '_intlist')
  2065       ('string', '0\x001\x002')))
  2065       (string '0\x001\x002')))
  2066   * set:
  2066   * set:
  2067   <filteredset
  2067   <filteredset
  2068     <spanset- 0:3>,
  2068     <spanset- 0:3>,
  2069     <baseset+ [0, 1, 2]>>
  2069     <baseset+ [0, 1, 2]>>
  2070   2
  2070   2
  2072   0
  2072   0
  2073 
  2073 
  2074   $ trylist --optimize '%ld & 2:0' 0 2 1
  2074   $ trylist --optimize '%ld & 2:0' 0 2 1
  2075   (and
  2075   (and
  2076     (func
  2076     (func
  2077       ('symbol', '_intlist')
  2077       (symbol '_intlist')
  2078       ('string', '0\x002\x001'))
  2078       (string '0\x002\x001'))
  2079     (range
  2079     (range
  2080       ('symbol', '2')
  2080       (symbol '2')
  2081       ('symbol', '0')))
  2081       (symbol '0')))
  2082   * optimized:
  2082   * optimized:
  2083   (and
  2083   (and
  2084     (func
  2084     (func
  2085       ('symbol', '_intlist')
  2085       (symbol '_intlist')
  2086       ('string', '0\x002\x001'))
  2086       (string '0\x002\x001'))
  2087     (range
  2087     (range
  2088       ('symbol', '2')
  2088       (symbol '2')
  2089       ('symbol', '0')))
  2089       (symbol '0')))
  2090   * set:
  2090   * set:
  2091   <filteredset
  2091   <filteredset
  2092     <baseset [0, 2, 1]>,
  2092     <baseset [0, 2, 1]>,
  2093     <spanset- 0:3>>
  2093     <spanset- 0:3>>
  2094   0
  2094   0
  2098  '_hexlist(a b)' should behave like 'a + b':
  2098  '_hexlist(a b)' should behave like 'a + b':
  2099 
  2099 
  2100   $ trylist --optimize --bin '2:0 & %ln' `hg log -T '{node} ' -r0:2`
  2100   $ trylist --optimize --bin '2:0 & %ln' `hg log -T '{node} ' -r0:2`
  2101   (and
  2101   (and
  2102     (range
  2102     (range
  2103       ('symbol', '2')
  2103       (symbol '2')
  2104       ('symbol', '0'))
  2104       (symbol '0'))
  2105     (func
  2105     (func
  2106       ('symbol', '_hexlist')
  2106       (symbol '_hexlist')
  2107       ('string', '*'))) (glob)
  2107       (string '*'))) (glob)
  2108   * optimized:
  2108   * optimized:
  2109   (and
  2109   (and
  2110     (range
  2110     (range
  2111       ('symbol', '2')
  2111       (symbol '2')
  2112       ('symbol', '0'))
  2112       (symbol '0'))
  2113     (func
  2113     (func
  2114       ('symbol', '_hexlist')
  2114       (symbol '_hexlist')
  2115       ('string', '*'))) (glob)
  2115       (string '*'))) (glob)
  2116   * set:
  2116   * set:
  2117   <filteredset
  2117   <filteredset
  2118     <spanset- 0:3>,
  2118     <spanset- 0:3>,
  2119     <baseset [0, 1, 2]>>
  2119     <baseset [0, 1, 2]>>
  2120   2
  2120   2
  2122   0
  2122   0
  2123 
  2123 
  2124   $ trylist --optimize --bin '%ln & 2:0' `hg log -T '{node} ' -r0+2+1`
  2124   $ trylist --optimize --bin '%ln & 2:0' `hg log -T '{node} ' -r0+2+1`
  2125   (and
  2125   (and
  2126     (func
  2126     (func
  2127       ('symbol', '_hexlist')
  2127       (symbol '_hexlist')
  2128       ('string', '*')) (glob)
  2128       (string '*')) (glob)
  2129     (range
  2129     (range
  2130       ('symbol', '2')
  2130       (symbol '2')
  2131       ('symbol', '0')))
  2131       (symbol '0')))
  2132   * optimized:
  2132   * optimized:
  2133   (andsmally
  2133   (andsmally
  2134     (func
  2134     (func
  2135       ('symbol', '_hexlist')
  2135       (symbol '_hexlist')
  2136       ('string', '*')) (glob)
  2136       (string '*')) (glob)
  2137     (range
  2137     (range
  2138       ('symbol', '2')
  2138       (symbol '2')
  2139       ('symbol', '0')))
  2139       (symbol '0')))
  2140   * set:
  2140   * set:
  2141   <baseset [0, 2, 1]>
  2141   <baseset [0, 2, 1]>
  2142   0
  2142   0
  2143   2
  2143   2
  2144   1
  2144   1
  2148 
  2148 
  2149   $ try -p optimized '2:0 & not (0 + 1)'
  2149   $ try -p optimized '2:0 & not (0 + 1)'
  2150   * optimized:
  2150   * optimized:
  2151   (difference
  2151   (difference
  2152     (range
  2152     (range
  2153       ('symbol', '2')
  2153       (symbol '2')
  2154       ('symbol', '0'))
  2154       (symbol '0'))
  2155     (func
  2155     (func
  2156       ('symbol', '_list')
  2156       (symbol '_list')
  2157       ('string', '0\x001')))
  2157       (string '0\x001')))
  2158   * set:
  2158   * set:
  2159   <filteredset
  2159   <filteredset
  2160     <spanset- 0:3>,
  2160     <spanset- 0:3>,
  2161     <not
  2161     <not
  2162       <baseset [0, 1]>>>
  2162       <baseset [0, 1]>>>
  2164 
  2164 
  2165   $ try -p optimized '2:0 & not (0:2 & (0 + 1))'
  2165   $ try -p optimized '2:0 & not (0:2 & (0 + 1))'
  2166   * optimized:
  2166   * optimized:
  2167   (difference
  2167   (difference
  2168     (range
  2168     (range
  2169       ('symbol', '2')
  2169       (symbol '2')
  2170       ('symbol', '0'))
  2170       (symbol '0'))
  2171     (and
  2171     (and
  2172       (range
  2172       (range
  2173         ('symbol', '0')
  2173         (symbol '0')
  2174         ('symbol', '2'))
  2174         (symbol '2'))
  2175       (func
  2175       (func
  2176         ('symbol', '_list')
  2176         (symbol '_list')
  2177         ('string', '0\x001'))))
  2177         (string '0\x001'))))
  2178   * set:
  2178   * set:
  2179   <filteredset
  2179   <filteredset
  2180     <spanset- 0:3>,
  2180     <spanset- 0:3>,
  2181     <not
  2181     <not
  2182       <baseset [0, 1]>>>
  2182       <baseset [0, 1]>>>
  2186  ordering requirement should be forwarded to the nested expression
  2186  ordering requirement should be forwarded to the nested expression
  2187 
  2187 
  2188   $ try -p optimized 'present(2 + 0 + 1)'
  2188   $ try -p optimized 'present(2 + 0 + 1)'
  2189   * optimized:
  2189   * optimized:
  2190   (func
  2190   (func
  2191     ('symbol', 'present')
  2191     (symbol 'present')
  2192     (func
  2192     (func
  2193       ('symbol', '_list')
  2193       (symbol '_list')
  2194       ('string', '2\x000\x001')))
  2194       (string '2\x000\x001')))
  2195   * set:
  2195   * set:
  2196   <baseset [2, 0, 1]>
  2196   <baseset [2, 0, 1]>
  2197   2
  2197   2
  2198   0
  2198   0
  2199   1
  2199   1
  2200 
  2200 
  2201   $ try --optimize '2:0 & present(0 + 1 + 2)'
  2201   $ try --optimize '2:0 & present(0 + 1 + 2)'
  2202   (and
  2202   (and
  2203     (range
  2203     (range
  2204       ('symbol', '2')
  2204       (symbol '2')
  2205       ('symbol', '0'))
  2205       (symbol '0'))
  2206     (func
  2206     (func
  2207       ('symbol', 'present')
  2207       (symbol 'present')
  2208       (or
  2208       (or
  2209         (list
  2209         (list
  2210           ('symbol', '0')
  2210           (symbol '0')
  2211           ('symbol', '1')
  2211           (symbol '1')
  2212           ('symbol', '2')))))
  2212           (symbol '2')))))
  2213   * optimized:
  2213   * optimized:
  2214   (and
  2214   (and
  2215     (range
  2215     (range
  2216       ('symbol', '2')
  2216       (symbol '2')
  2217       ('symbol', '0'))
  2217       (symbol '0'))
  2218     (func
  2218     (func
  2219       ('symbol', 'present')
  2219       (symbol 'present')
  2220       (func
  2220       (func
  2221         ('symbol', '_list')
  2221         (symbol '_list')
  2222         ('string', '0\x001\x002'))))
  2222         (string '0\x001\x002'))))
  2223   * set:
  2223   * set:
  2224   <filteredset
  2224   <filteredset
  2225     <spanset- 0:3>,
  2225     <spanset- 0:3>,
  2226     <baseset [0, 1, 2]>>
  2226     <baseset [0, 1, 2]>>
  2227   2
  2227   2
  2231  'reverse()' should take effect only if it is the outermost expression:
  2231  'reverse()' should take effect only if it is the outermost expression:
  2232 
  2232 
  2233   $ try --optimize '0:2 & reverse(all())'
  2233   $ try --optimize '0:2 & reverse(all())'
  2234   (and
  2234   (and
  2235     (range
  2235     (range
  2236       ('symbol', '0')
  2236       (symbol '0')
  2237       ('symbol', '2'))
  2237       (symbol '2'))
  2238     (func
  2238     (func
  2239       ('symbol', 'reverse')
  2239       (symbol 'reverse')
  2240       (func
  2240       (func
  2241         ('symbol', 'all')
  2241         (symbol 'all')
  2242         None)))
  2242         None)))
  2243   * optimized:
  2243   * optimized:
  2244   (and
  2244   (and
  2245     (range
  2245     (range
  2246       ('symbol', '0')
  2246       (symbol '0')
  2247       ('symbol', '2'))
  2247       (symbol '2'))
  2248     (func
  2248     (func
  2249       ('symbol', 'reverse')
  2249       (symbol 'reverse')
  2250       (func
  2250       (func
  2251         ('symbol', 'all')
  2251         (symbol 'all')
  2252         None)))
  2252         None)))
  2253   * set:
  2253   * set:
  2254   <filteredset
  2254   <filteredset
  2255     <spanset+ 0:3>,
  2255     <spanset+ 0:3>,
  2256     <spanset+ 0:10>>
  2256     <spanset+ 0:10>>
  2261  'sort()' should take effect only if it is the outermost expression:
  2261  'sort()' should take effect only if it is the outermost expression:
  2262 
  2262 
  2263   $ try --optimize '0:2 & sort(all(), -rev)'
  2263   $ try --optimize '0:2 & sort(all(), -rev)'
  2264   (and
  2264   (and
  2265     (range
  2265     (range
  2266       ('symbol', '0')
  2266       (symbol '0')
  2267       ('symbol', '2'))
  2267       (symbol '2'))
  2268     (func
  2268     (func
  2269       ('symbol', 'sort')
  2269       (symbol 'sort')
  2270       (list
  2270       (list
  2271         (func
  2271         (func
  2272           ('symbol', 'all')
  2272           (symbol 'all')
  2273           None)
  2273           None)
  2274         (negate
  2274         (negate
  2275           ('symbol', 'rev')))))
  2275           (symbol 'rev')))))
  2276   * optimized:
  2276   * optimized:
  2277   (and
  2277   (and
  2278     (range
  2278     (range
  2279       ('symbol', '0')
  2279       (symbol '0')
  2280       ('symbol', '2'))
  2280       (symbol '2'))
  2281     (func
  2281     (func
  2282       ('symbol', 'sort')
  2282       (symbol 'sort')
  2283       (list
  2283       (list
  2284         (func
  2284         (func
  2285           ('symbol', 'all')
  2285           (symbol 'all')
  2286           None)
  2286           None)
  2287         ('string', '-rev'))))
  2287         (string '-rev'))))
  2288   * set:
  2288   * set:
  2289   <filteredset
  2289   <filteredset
  2290     <spanset+ 0:3>,
  2290     <spanset+ 0:3>,
  2291     <spanset+ 0:10>>
  2291     <spanset+ 0:10>>
  2292   0
  2292   0
  2305  for 'A & f(B)', 'B' should not be affected by the order of 'A':
  2305  for 'A & f(B)', 'B' should not be affected by the order of 'A':
  2306 
  2306 
  2307   $ try --optimize '2:0 & first(1 + 0 + 2)'
  2307   $ try --optimize '2:0 & first(1 + 0 + 2)'
  2308   (and
  2308   (and
  2309     (range
  2309     (range
  2310       ('symbol', '2')
  2310       (symbol '2')
  2311       ('symbol', '0'))
  2311       (symbol '0'))
  2312     (func
  2312     (func
  2313       ('symbol', 'first')
  2313       (symbol 'first')
  2314       (or
  2314       (or
  2315         (list
  2315         (list
  2316           ('symbol', '1')
  2316           (symbol '1')
  2317           ('symbol', '0')
  2317           (symbol '0')
  2318           ('symbol', '2')))))
  2318           (symbol '2')))))
  2319   * optimized:
  2319   * optimized:
  2320   (and
  2320   (and
  2321     (range
  2321     (range
  2322       ('symbol', '2')
  2322       (symbol '2')
  2323       ('symbol', '0'))
  2323       (symbol '0'))
  2324     (func
  2324     (func
  2325       ('symbol', 'first')
  2325       (symbol 'first')
  2326       (func
  2326       (func
  2327         ('symbol', '_list')
  2327         (symbol '_list')
  2328         ('string', '1\x000\x002'))))
  2328         (string '1\x000\x002'))))
  2329   * set:
  2329   * set:
  2330   <filteredset
  2330   <filteredset
  2331     <baseset [1]>,
  2331     <baseset [1]>,
  2332     <spanset- 0:3>>
  2332     <spanset- 0:3>>
  2333   1
  2333   1
  2334 
  2334 
  2335   $ try --optimize '2:0 & not last(0 + 2 + 1)'
  2335   $ try --optimize '2:0 & not last(0 + 2 + 1)'
  2336   (and
  2336   (and
  2337     (range
  2337     (range
  2338       ('symbol', '2')
  2338       (symbol '2')
  2339       ('symbol', '0'))
  2339       (symbol '0'))
  2340     (not
  2340     (not
  2341       (func
  2341       (func
  2342         ('symbol', 'last')
  2342         (symbol 'last')
  2343         (or
  2343         (or
  2344           (list
  2344           (list
  2345             ('symbol', '0')
  2345             (symbol '0')
  2346             ('symbol', '2')
  2346             (symbol '2')
  2347             ('symbol', '1'))))))
  2347             (symbol '1'))))))
  2348   * optimized:
  2348   * optimized:
  2349   (difference
  2349   (difference
  2350     (range
  2350     (range
  2351       ('symbol', '2')
  2351       (symbol '2')
  2352       ('symbol', '0'))
  2352       (symbol '0'))
  2353     (func
  2353     (func
  2354       ('symbol', 'last')
  2354       (symbol 'last')
  2355       (func
  2355       (func
  2356         ('symbol', '_list')
  2356         (symbol '_list')
  2357         ('string', '0\x002\x001'))))
  2357         (string '0\x002\x001'))))
  2358   * set:
  2358   * set:
  2359   <filteredset
  2359   <filteredset
  2360     <spanset- 0:3>,
  2360     <spanset- 0:3>,
  2361     <not
  2361     <not
  2362       <baseset [1]>>>
  2362       <baseset [1]>>>
  2366  for 'A & (op)(B)', 'B' should not be affected by the order of 'A':
  2366  for 'A & (op)(B)', 'B' should not be affected by the order of 'A':
  2367 
  2367 
  2368   $ try --optimize '2:0 & (1 + 0 + 2):(0 + 2 + 1)'
  2368   $ try --optimize '2:0 & (1 + 0 + 2):(0 + 2 + 1)'
  2369   (and
  2369   (and
  2370     (range
  2370     (range
  2371       ('symbol', '2')
  2371       (symbol '2')
  2372       ('symbol', '0'))
  2372       (symbol '0'))
  2373     (range
  2373     (range
  2374       (group
  2374       (group
  2375         (or
  2375         (or
  2376           (list
  2376           (list
  2377             ('symbol', '1')
  2377             (symbol '1')
  2378             ('symbol', '0')
  2378             (symbol '0')
  2379             ('symbol', '2'))))
  2379             (symbol '2'))))
  2380       (group
  2380       (group
  2381         (or
  2381         (or
  2382           (list
  2382           (list
  2383             ('symbol', '0')
  2383             (symbol '0')
  2384             ('symbol', '2')
  2384             (symbol '2')
  2385             ('symbol', '1'))))))
  2385             (symbol '1'))))))
  2386   * optimized:
  2386   * optimized:
  2387   (and
  2387   (and
  2388     (range
  2388     (range
  2389       ('symbol', '2')
  2389       (symbol '2')
  2390       ('symbol', '0'))
  2390       (symbol '0'))
  2391     (range
  2391     (range
  2392       (func
  2392       (func
  2393         ('symbol', '_list')
  2393         (symbol '_list')
  2394         ('string', '1\x000\x002'))
  2394         (string '1\x000\x002'))
  2395       (func
  2395       (func
  2396         ('symbol', '_list')
  2396         (symbol '_list')
  2397         ('string', '0\x002\x001'))))
  2397         (string '0\x002\x001'))))
  2398   * set:
  2398   * set:
  2399   <filteredset
  2399   <filteredset
  2400     <spanset- 0:3>,
  2400     <spanset- 0:3>,
  2401     <baseset [1]>>
  2401     <baseset [1]>>
  2402   1
  2402   1
  2404  'A & B' can be rewritten as 'flipand(B, A)' by weight.
  2404  'A & B' can be rewritten as 'flipand(B, A)' by weight.
  2405 
  2405 
  2406   $ try --optimize 'contains("glob:*") & (2 + 0 + 1)'
  2406   $ try --optimize 'contains("glob:*") & (2 + 0 + 1)'
  2407   (and
  2407   (and
  2408     (func
  2408     (func
  2409       ('symbol', 'contains')
  2409       (symbol 'contains')
  2410       ('string', 'glob:*'))
  2410       (string 'glob:*'))
  2411     (group
  2411     (group
  2412       (or
  2412       (or
  2413         (list
  2413         (list
  2414           ('symbol', '2')
  2414           (symbol '2')
  2415           ('symbol', '0')
  2415           (symbol '0')
  2416           ('symbol', '1')))))
  2416           (symbol '1')))))
  2417   * optimized:
  2417   * optimized:
  2418   (andsmally
  2418   (andsmally
  2419     (func
  2419     (func
  2420       ('symbol', 'contains')
  2420       (symbol 'contains')
  2421       ('string', 'glob:*'))
  2421       (string 'glob:*'))
  2422     (func
  2422     (func
  2423       ('symbol', '_list')
  2423       (symbol '_list')
  2424       ('string', '2\x000\x001')))
  2424       (string '2\x000\x001')))
  2425   * set:
  2425   * set:
  2426   <filteredset
  2426   <filteredset
  2427     <baseset+ [0, 1, 2]>,
  2427     <baseset+ [0, 1, 2]>,
  2428     <contains 'glob:*'>>
  2428     <contains 'glob:*'>>
  2429   0
  2429   0
  2434  the order appropriately:
  2434  the order appropriately:
  2435 
  2435 
  2436   $ try --optimize 'reverse(contains("glob:*")) & (0 + 2 + 1)'
  2436   $ try --optimize 'reverse(contains("glob:*")) & (0 + 2 + 1)'
  2437   (and
  2437   (and
  2438     (func
  2438     (func
  2439       ('symbol', 'reverse')
  2439       (symbol 'reverse')
  2440       (func
  2440       (func
  2441         ('symbol', 'contains')
  2441         (symbol 'contains')
  2442         ('string', 'glob:*')))
  2442         (string 'glob:*')))
  2443     (group
  2443     (group
  2444       (or
  2444       (or
  2445         (list
  2445         (list
  2446           ('symbol', '0')
  2446           (symbol '0')
  2447           ('symbol', '2')
  2447           (symbol '2')
  2448           ('symbol', '1')))))
  2448           (symbol '1')))))
  2449   * optimized:
  2449   * optimized:
  2450   (andsmally
  2450   (andsmally
  2451     (func
  2451     (func
  2452       ('symbol', 'reverse')
  2452       (symbol 'reverse')
  2453       (func
  2453       (func
  2454         ('symbol', 'contains')
  2454         (symbol 'contains')
  2455         ('string', 'glob:*')))
  2455         (string 'glob:*')))
  2456     (func
  2456     (func
  2457       ('symbol', '_list')
  2457       (symbol '_list')
  2458       ('string', '0\x002\x001')))
  2458       (string '0\x002\x001')))
  2459   * set:
  2459   * set:
  2460   <filteredset
  2460   <filteredset
  2461     <baseset- [0, 1, 2]>,
  2461     <baseset- [0, 1, 2]>,
  2462     <contains 'glob:*'>>
  2462     <contains 'glob:*'>>
  2463   2
  2463   2
  2789 
  2789 
  2790   $ try 'reverse(1::5) or ancestors(4)'
  2790   $ try 'reverse(1::5) or ancestors(4)'
  2791   (or
  2791   (or
  2792     (list
  2792     (list
  2793       (func
  2793       (func
  2794         ('symbol', 'reverse')
  2794         (symbol 'reverse')
  2795         (dagrange
  2795         (dagrange
  2796           ('symbol', '1')
  2796           (symbol '1')
  2797           ('symbol', '5')))
  2797           (symbol '5')))
  2798       (func
  2798       (func
  2799         ('symbol', 'ancestors')
  2799         (symbol 'ancestors')
  2800         ('symbol', '4'))))
  2800         (symbol '4'))))
  2801   * set:
  2801   * set:
  2802   <addset
  2802   <addset
  2803     <baseset- [1, 3, 5]>,
  2803     <baseset- [1, 3, 5]>,
  2804     <generatorset+>>
  2804     <generatorset+>>
  2805   5
  2805   5
  2808   0
  2808   0
  2809   2
  2809   2
  2810   4
  2810   4
  2811   $ try 'sort(ancestors(4) or reverse(1::5))'
  2811   $ try 'sort(ancestors(4) or reverse(1::5))'
  2812   (func
  2812   (func
  2813     ('symbol', 'sort')
  2813     (symbol 'sort')
  2814     (or
  2814     (or
  2815       (list
  2815       (list
  2816         (func
  2816         (func
  2817           ('symbol', 'ancestors')
  2817           (symbol 'ancestors')
  2818           ('symbol', '4'))
  2818           (symbol '4'))
  2819         (func
  2819         (func
  2820           ('symbol', 'reverse')
  2820           (symbol 'reverse')
  2821           (dagrange
  2821           (dagrange
  2822             ('symbol', '1')
  2822             (symbol '1')
  2823             ('symbol', '5'))))))
  2823             (symbol '5'))))))
  2824   * set:
  2824   * set:
  2825   <addset+
  2825   <addset+
  2826     <generatorset+>,
  2826     <generatorset+>,
  2827     <baseset- [1, 3, 5]>>
  2827     <baseset- [1, 3, 5]>>
  2828   0
  2828   0
  2835 test optimization of trivial `or` operation
  2835 test optimization of trivial `or` operation
  2836 
  2836 
  2837   $ try --optimize '0|(1)|"2"|-2|tip|null'
  2837   $ try --optimize '0|(1)|"2"|-2|tip|null'
  2838   (or
  2838   (or
  2839     (list
  2839     (list
  2840       ('symbol', '0')
  2840       (symbol '0')
  2841       (group
  2841       (group
  2842         ('symbol', '1'))
  2842         (symbol '1'))
  2843       ('string', '2')
  2843       (string '2')
  2844       (negate
  2844       (negate
  2845         ('symbol', '2'))
  2845         (symbol '2'))
  2846       ('symbol', 'tip')
  2846       (symbol 'tip')
  2847       ('symbol', 'null')))
  2847       (symbol 'null')))
  2848   * optimized:
  2848   * optimized:
  2849   (func
  2849   (func
  2850     ('symbol', '_list')
  2850     (symbol '_list')
  2851     ('string', '0\x001\x002\x00-2\x00tip\x00null'))
  2851     (string '0\x001\x002\x00-2\x00tip\x00null'))
  2852   * set:
  2852   * set:
  2853   <baseset [0, 1, 2, 8, 9, -1]>
  2853   <baseset [0, 1, 2, 8, 9, -1]>
  2854   0
  2854   0
  2855   1
  2855   1
  2856   2
  2856   2
  2859   -1
  2859   -1
  2860 
  2860 
  2861   $ try --optimize '0|1|2:3'
  2861   $ try --optimize '0|1|2:3'
  2862   (or
  2862   (or
  2863     (list
  2863     (list
  2864       ('symbol', '0')
  2864       (symbol '0')
  2865       ('symbol', '1')
  2865       (symbol '1')
  2866       (range
  2866       (range
  2867         ('symbol', '2')
  2867         (symbol '2')
  2868         ('symbol', '3'))))
  2868         (symbol '3'))))
  2869   * optimized:
  2869   * optimized:
  2870   (or
  2870   (or
  2871     (list
  2871     (list
  2872       (func
  2872       (func
  2873         ('symbol', '_list')
  2873         (symbol '_list')
  2874         ('string', '0\x001'))
  2874         (string '0\x001'))
  2875       (range
  2875       (range
  2876         ('symbol', '2')
  2876         (symbol '2')
  2877         ('symbol', '3'))))
  2877         (symbol '3'))))
  2878   * set:
  2878   * set:
  2879   <addset
  2879   <addset
  2880     <baseset [0, 1]>,
  2880     <baseset [0, 1]>,
  2881     <spanset+ 2:4>>
  2881     <spanset+ 2:4>>
  2882   0
  2882   0
  2886 
  2886 
  2887   $ try --optimize '0:1|2|3:4|5|6'
  2887   $ try --optimize '0:1|2|3:4|5|6'
  2888   (or
  2888   (or
  2889     (list
  2889     (list
  2890       (range
  2890       (range
  2891         ('symbol', '0')
  2891         (symbol '0')
  2892         ('symbol', '1'))
  2892         (symbol '1'))
  2893       ('symbol', '2')
  2893       (symbol '2')
  2894       (range
  2894       (range
  2895         ('symbol', '3')
  2895         (symbol '3')
  2896         ('symbol', '4'))
  2896         (symbol '4'))
  2897       ('symbol', '5')
  2897       (symbol '5')
  2898       ('symbol', '6')))
  2898       (symbol '6')))
  2899   * optimized:
  2899   * optimized:
  2900   (or
  2900   (or
  2901     (list
  2901     (list
  2902       (range
  2902       (range
  2903         ('symbol', '0')
  2903         (symbol '0')
  2904         ('symbol', '1'))
  2904         (symbol '1'))
  2905       ('symbol', '2')
  2905       (symbol '2')
  2906       (range
  2906       (range
  2907         ('symbol', '3')
  2907         (symbol '3')
  2908         ('symbol', '4'))
  2908         (symbol '4'))
  2909       (func
  2909       (func
  2910         ('symbol', '_list')
  2910         (symbol '_list')
  2911         ('string', '5\x006'))))
  2911         (string '5\x006'))))
  2912   * set:
  2912   * set:
  2913   <addset
  2913   <addset
  2914     <addset
  2914     <addset
  2915       <spanset+ 0:2>,
  2915       <spanset+ 0:2>,
  2916       <baseset [2]>>,
  2916       <baseset [2]>>,
  2929 
  2929 
  2930   $ try --no-optimized -p analyzed '0|1|2|3|4'
  2930   $ try --no-optimized -p analyzed '0|1|2|3|4'
  2931   * analyzed:
  2931   * analyzed:
  2932   (or
  2932   (or
  2933     (list
  2933     (list
  2934       ('symbol', '0')
  2934       (symbol '0')
  2935       ('symbol', '1')
  2935       (symbol '1')
  2936       ('symbol', '2')
  2936       (symbol '2')
  2937       ('symbol', '3')
  2937       (symbol '3')
  2938       ('symbol', '4')))
  2938       (symbol '4')))
  2939   * set:
  2939   * set:
  2940   <addset
  2940   <addset
  2941     <addset
  2941     <addset
  2942       <baseset [0]>,
  2942       <baseset [0]>,
  2943       <baseset [1]>>,
  2943       <baseset [1]>>,
  2997   hg: parse error: can't use a list in this context
  2997   hg: parse error: can't use a list in this context
  2998   (see hg help "revsets.x or y")
  2998   (see hg help "revsets.x or y")
  2999   [255]
  2999   [255]
  3000   $ try '0,1,2'
  3000   $ try '0,1,2'
  3001   (list
  3001   (list
  3002     ('symbol', '0')
  3002     (symbol '0')
  3003     ('symbol', '1')
  3003     (symbol '1')
  3004     ('symbol', '2'))
  3004     (symbol '2'))
  3005   hg: parse error: can't use a list in this context
  3005   hg: parse error: can't use a list in this context
  3006   (see hg help "revsets.x or y")
  3006   (see hg help "revsets.x or y")
  3007   [255]
  3007   [255]
  3008 
  3008 
  3009 test that chained `or` operations make balanced addsets
  3009 test that chained `or` operations make balanced addsets
  3010 
  3010 
  3011   $ try '0:1|1:2|2:3|3:4|4:5'
  3011   $ try '0:1|1:2|2:3|3:4|4:5'
  3012   (or
  3012   (or
  3013     (list
  3013     (list
  3014       (range
  3014       (range
  3015         ('symbol', '0')
  3015         (symbol '0')
  3016         ('symbol', '1'))
  3016         (symbol '1'))
  3017       (range
  3017       (range
  3018         ('symbol', '1')
  3018         (symbol '1')
  3019         ('symbol', '2'))
  3019         (symbol '2'))
  3020       (range
  3020       (range
  3021         ('symbol', '2')
  3021         (symbol '2')
  3022         ('symbol', '3'))
  3022         (symbol '3'))
  3023       (range
  3023       (range
  3024         ('symbol', '3')
  3024         (symbol '3')
  3025         ('symbol', '4'))
  3025         (symbol '4'))
  3026       (range
  3026       (range
  3027         ('symbol', '4')
  3027         (symbol '4')
  3028         ('symbol', '5'))))
  3028         (symbol '5'))))
  3029   * set:
  3029   * set:
  3030   <addset
  3030   <addset
  3031     <addset
  3031     <addset
  3032       <spanset+ 0:2>,
  3032       <spanset+ 0:2>,
  3033       <spanset+ 1:3>>,
  3033       <spanset+ 1:3>>,
  3046 no crash by empty group "()" while optimizing `or` operations
  3046 no crash by empty group "()" while optimizing `or` operations
  3047 
  3047 
  3048   $ try --optimize '0|()'
  3048   $ try --optimize '0|()'
  3049   (or
  3049   (or
  3050     (list
  3050     (list
  3051       ('symbol', '0')
  3051       (symbol '0')
  3052       (group
  3052       (group
  3053         None)))
  3053         None)))
  3054   * optimized:
  3054   * optimized:
  3055   (or
  3055   (or
  3056     (list
  3056     (list
  3057       ('symbol', '0')
  3057       (symbol '0')
  3058       None))
  3058       None))
  3059   hg: parse error: missing argument
  3059   hg: parse error: missing argument
  3060   [255]
  3060   [255]
  3061 
  3061 
  3062 test that chained `or` operations never eat up stack (issue4624)
  3062 test that chained `or` operations never eat up stack (issue4624)
  3075 
  3075 
  3076 check that conversion to only works
  3076 check that conversion to only works
  3077   $ try --optimize '::3 - ::1'
  3077   $ try --optimize '::3 - ::1'
  3078   (minus
  3078   (minus
  3079     (dagrangepre
  3079     (dagrangepre
  3080       ('symbol', '3'))
  3080       (symbol '3'))
  3081     (dagrangepre
  3081     (dagrangepre
  3082       ('symbol', '1')))
  3082       (symbol '1')))
  3083   * optimized:
  3083   * optimized:
  3084   (func
  3084   (func
  3085     ('symbol', 'only')
  3085     (symbol 'only')
  3086     (list
  3086     (list
  3087       ('symbol', '3')
  3087       (symbol '3')
  3088       ('symbol', '1')))
  3088       (symbol '1')))
  3089   * set:
  3089   * set:
  3090   <baseset+ [3]>
  3090   <baseset+ [3]>
  3091   3
  3091   3
  3092   $ try --optimize 'ancestors(1) - ancestors(3)'
  3092   $ try --optimize 'ancestors(1) - ancestors(3)'
  3093   (minus
  3093   (minus
  3094     (func
  3094     (func
  3095       ('symbol', 'ancestors')
  3095       (symbol 'ancestors')
  3096       ('symbol', '1'))
  3096       (symbol '1'))
  3097     (func
  3097     (func
  3098       ('symbol', 'ancestors')
  3098       (symbol 'ancestors')
  3099       ('symbol', '3')))
  3099       (symbol '3')))
  3100   * optimized:
  3100   * optimized:
  3101   (func
  3101   (func
  3102     ('symbol', 'only')
  3102     (symbol 'only')
  3103     (list
  3103     (list
  3104       ('symbol', '1')
  3104       (symbol '1')
  3105       ('symbol', '3')))
  3105       (symbol '3')))
  3106   * set:
  3106   * set:
  3107   <baseset+ []>
  3107   <baseset+ []>
  3108   $ try --optimize 'not ::2 and ::6'
  3108   $ try --optimize 'not ::2 and ::6'
  3109   (and
  3109   (and
  3110     (not
  3110     (not
  3111       (dagrangepre
  3111       (dagrangepre
  3112         ('symbol', '2')))
  3112         (symbol '2')))
  3113     (dagrangepre
  3113     (dagrangepre
  3114       ('symbol', '6')))
  3114       (symbol '6')))
  3115   * optimized:
  3115   * optimized:
  3116   (func
  3116   (func
  3117     ('symbol', 'only')
  3117     (symbol 'only')
  3118     (list
  3118     (list
  3119       ('symbol', '6')
  3119       (symbol '6')
  3120       ('symbol', '2')))
  3120       (symbol '2')))
  3121   * set:
  3121   * set:
  3122   <baseset+ [3, 4, 5, 6]>
  3122   <baseset+ [3, 4, 5, 6]>
  3123   3
  3123   3
  3124   4
  3124   4
  3125   5
  3125   5
  3126   6
  3126   6
  3127   $ try --optimize 'ancestors(6) and not ancestors(4)'
  3127   $ try --optimize 'ancestors(6) and not ancestors(4)'
  3128   (and
  3128   (and
  3129     (func
  3129     (func
  3130       ('symbol', 'ancestors')
  3130       (symbol 'ancestors')
  3131       ('symbol', '6'))
  3131       (symbol '6'))
  3132     (not
  3132     (not
  3133       (func
  3133       (func
  3134         ('symbol', 'ancestors')
  3134         (symbol 'ancestors')
  3135         ('symbol', '4'))))
  3135         (symbol '4'))))
  3136   * optimized:
  3136   * optimized:
  3137   (func
  3137   (func
  3138     ('symbol', 'only')
  3138     (symbol 'only')
  3139     (list
  3139     (list
  3140       ('symbol', '6')
  3140       (symbol '6')
  3141       ('symbol', '4')))
  3141       (symbol '4')))
  3142   * set:
  3142   * set:
  3143   <baseset+ [3, 5, 6]>
  3143   <baseset+ [3, 5, 6]>
  3144   3
  3144   3
  3145   5
  3145   5
  3146   6
  3146   6
  3148 no crash by empty group "()" while optimizing to "only()"
  3148 no crash by empty group "()" while optimizing to "only()"
  3149 
  3149 
  3150   $ try --optimize '::1 and ()'
  3150   $ try --optimize '::1 and ()'
  3151   (and
  3151   (and
  3152     (dagrangepre
  3152     (dagrangepre
  3153       ('symbol', '1'))
  3153       (symbol '1'))
  3154     (group
  3154     (group
  3155       None))
  3155       None))
  3156   * optimized:
  3156   * optimized:
  3157   (andsmally
  3157   (andsmally
  3158     (func
  3158     (func
  3159       ('symbol', 'ancestors')
  3159       (symbol 'ancestors')
  3160       ('symbol', '1'))
  3160       (symbol '1'))
  3161     None)
  3161     None)
  3162   hg: parse error: missing argument
  3162   hg: parse error: missing argument
  3163   [255]
  3163   [255]
  3164 
  3164 
  3165 optimization to only() works only if ancestors() takes only one argument
  3165 optimization to only() works only if ancestors() takes only one argument
  3166 
  3166 
  3167   $ hg debugrevspec -p optimized 'ancestors(6) - ancestors(4, 1)'
  3167   $ hg debugrevspec -p optimized 'ancestors(6) - ancestors(4, 1)'
  3168   * optimized:
  3168   * optimized:
  3169   (difference
  3169   (difference
  3170     (func
  3170     (func
  3171       ('symbol', 'ancestors')
  3171       (symbol 'ancestors')
  3172       ('symbol', '6'))
  3172       (symbol '6'))
  3173     (func
  3173     (func
  3174       ('symbol', 'ancestors')
  3174       (symbol 'ancestors')
  3175       (list
  3175       (list
  3176         ('symbol', '4')
  3176         (symbol '4')
  3177         ('symbol', '1'))))
  3177         (symbol '1'))))
  3178   0
  3178   0
  3179   1
  3179   1
  3180   3
  3180   3
  3181   5
  3181   5
  3182   6
  3182   6
  3183   $ hg debugrevspec -p optimized 'ancestors(6, 1) - ancestors(4)'
  3183   $ hg debugrevspec -p optimized 'ancestors(6, 1) - ancestors(4)'
  3184   * optimized:
  3184   * optimized:
  3185   (difference
  3185   (difference
  3186     (func
  3186     (func
  3187       ('symbol', 'ancestors')
  3187       (symbol 'ancestors')
  3188       (list
  3188       (list
  3189         ('symbol', '6')
  3189         (symbol '6')
  3190         ('symbol', '1')))
  3190         (symbol '1')))
  3191     (func
  3191     (func
  3192       ('symbol', 'ancestors')
  3192       (symbol 'ancestors')
  3193       ('symbol', '4')))
  3193       (symbol '4')))
  3194   5
  3194   5
  3195   6
  3195   6
  3196 
  3196 
  3197 optimization disabled if keyword arguments passed (because we're too lazy
  3197 optimization disabled if keyword arguments passed (because we're too lazy
  3198 to support it)
  3198 to support it)
  3199 
  3199 
  3200   $ hg debugrevspec -p optimized 'ancestors(set=6) - ancestors(set=4)'
  3200   $ hg debugrevspec -p optimized 'ancestors(set=6) - ancestors(set=4)'
  3201   * optimized:
  3201   * optimized:
  3202   (difference
  3202   (difference
  3203     (func
  3203     (func
  3204       ('symbol', 'ancestors')
  3204       (symbol 'ancestors')
  3205       (keyvalue
  3205       (keyvalue
  3206         ('symbol', 'set')
  3206         (symbol 'set')
  3207         ('symbol', '6')))
  3207         (symbol '6')))
  3208     (func
  3208     (func
  3209       ('symbol', 'ancestors')
  3209       (symbol 'ancestors')
  3210       (keyvalue
  3210       (keyvalue
  3211         ('symbol', 'set')
  3211         (symbol 'set')
  3212         ('symbol', '4'))))
  3212         (symbol '4'))))
  3213   3
  3213   3
  3214   5
  3214   5
  3215   6
  3215   6
  3216 
  3216 
  3217 invalid function call should not be optimized to only()
  3217 invalid function call should not be optimized to only()
  3490   $ echo 'd($1) = reverse(sort($1, date))' >> .hg/hgrc
  3490   $ echo 'd($1) = reverse(sort($1, date))' >> .hg/hgrc
  3491   $ echo 'rs(ARG1, ARG2) = reverse(sort(ARG1, ARG2))' >> .hg/hgrc
  3491   $ echo 'rs(ARG1, ARG2) = reverse(sort(ARG1, ARG2))' >> .hg/hgrc
  3492   $ echo 'rs4(ARG1, ARGA, ARGB, ARG2) = reverse(sort(ARG1, ARG2))' >> .hg/hgrc
  3492   $ echo 'rs4(ARG1, ARGA, ARGB, ARG2) = reverse(sort(ARG1, ARG2))' >> .hg/hgrc
  3493 
  3493 
  3494   $ try m
  3494   $ try m
  3495   ('symbol', 'm')
  3495   (symbol 'm')
  3496   * expanded:
  3496   * expanded:
  3497   (func
  3497   (func
  3498     ('symbol', 'merge')
  3498     (symbol 'merge')
  3499     None)
  3499     None)
  3500   * set:
  3500   * set:
  3501   <filteredset
  3501   <filteredset
  3502     <fullreposet+ 0:10>,
  3502     <fullreposet+ 0:10>,
  3503     <merge>>
  3503     <merge>>
  3504   6
  3504   6
  3505 
  3505 
  3506   $ HGPLAIN=1
  3506   $ HGPLAIN=1
  3507   $ export HGPLAIN
  3507   $ export HGPLAIN
  3508   $ try m
  3508   $ try m
  3509   ('symbol', 'm')
  3509   (symbol 'm')
  3510   abort: unknown revision 'm'!
  3510   abort: unknown revision 'm'!
  3511   [255]
  3511   [255]
  3512 
  3512 
  3513   $ HGPLAINEXCEPT=revsetalias
  3513   $ HGPLAINEXCEPT=revsetalias
  3514   $ export HGPLAINEXCEPT
  3514   $ export HGPLAINEXCEPT
  3515   $ try m
  3515   $ try m
  3516   ('symbol', 'm')
  3516   (symbol 'm')
  3517   * expanded:
  3517   * expanded:
  3518   (func
  3518   (func
  3519     ('symbol', 'merge')
  3519     (symbol 'merge')
  3520     None)
  3520     None)
  3521   * set:
  3521   * set:
  3522   <filteredset
  3522   <filteredset
  3523     <fullreposet+ 0:10>,
  3523     <fullreposet+ 0:10>,
  3524     <merge>>
  3524     <merge>>
  3527   $ unset HGPLAIN
  3527   $ unset HGPLAIN
  3528   $ unset HGPLAINEXCEPT
  3528   $ unset HGPLAINEXCEPT
  3529 
  3529 
  3530   $ try 'p2(.)'
  3530   $ try 'p2(.)'
  3531   (func
  3531   (func
  3532     ('symbol', 'p2')
  3532     (symbol 'p2')
  3533     ('symbol', '.'))
  3533     (symbol '.'))
  3534   * expanded:
  3534   * expanded:
  3535   (func
  3535   (func
  3536     ('symbol', 'p1')
  3536     (symbol 'p1')
  3537     ('symbol', '.'))
  3537     (symbol '.'))
  3538   * set:
  3538   * set:
  3539   <baseset+ [8]>
  3539   <baseset+ [8]>
  3540   8
  3540   8
  3541 
  3541 
  3542   $ HGPLAIN=1
  3542   $ HGPLAIN=1
  3543   $ export HGPLAIN
  3543   $ export HGPLAIN
  3544   $ try 'p2(.)'
  3544   $ try 'p2(.)'
  3545   (func
  3545   (func
  3546     ('symbol', 'p2')
  3546     (symbol 'p2')
  3547     ('symbol', '.'))
  3547     (symbol '.'))
  3548   * set:
  3548   * set:
  3549   <baseset+ []>
  3549   <baseset+ []>
  3550 
  3550 
  3551   $ HGPLAINEXCEPT=revsetalias
  3551   $ HGPLAINEXCEPT=revsetalias
  3552   $ export HGPLAINEXCEPT
  3552   $ export HGPLAINEXCEPT
  3553   $ try 'p2(.)'
  3553   $ try 'p2(.)'
  3554   (func
  3554   (func
  3555     ('symbol', 'p2')
  3555     (symbol 'p2')
  3556     ('symbol', '.'))
  3556     (symbol '.'))
  3557   * expanded:
  3557   * expanded:
  3558   (func
  3558   (func
  3559     ('symbol', 'p1')
  3559     (symbol 'p1')
  3560     ('symbol', '.'))
  3560     (symbol '.'))
  3561   * set:
  3561   * set:
  3562   <baseset+ [8]>
  3562   <baseset+ [8]>
  3563   8
  3563   8
  3564 
  3564 
  3565   $ unset HGPLAIN
  3565   $ unset HGPLAIN
  3566   $ unset HGPLAINEXCEPT
  3566   $ unset HGPLAINEXCEPT
  3567 
  3567 
  3568 test alias recursion
  3568 test alias recursion
  3569 
  3569 
  3570   $ try sincem
  3570   $ try sincem
  3571   ('symbol', 'sincem')
  3571   (symbol 'sincem')
  3572   * expanded:
  3572   * expanded:
  3573   (func
  3573   (func
  3574     ('symbol', 'descendants')
  3574     (symbol 'descendants')
  3575     (func
  3575     (func
  3576       ('symbol', 'merge')
  3576       (symbol 'merge')
  3577       None))
  3577       None))
  3578   * set:
  3578   * set:
  3579   <generatorset+>
  3579   <generatorset+>
  3580   6
  3580   6
  3581   7
  3581   7
  3583 test infinite recursion
  3583 test infinite recursion
  3584 
  3584 
  3585   $ echo 'recurse1 = recurse2' >> .hg/hgrc
  3585   $ echo 'recurse1 = recurse2' >> .hg/hgrc
  3586   $ echo 'recurse2 = recurse1' >> .hg/hgrc
  3586   $ echo 'recurse2 = recurse1' >> .hg/hgrc
  3587   $ try recurse1
  3587   $ try recurse1
  3588   ('symbol', 'recurse1')
  3588   (symbol 'recurse1')
  3589   hg: parse error: infinite expansion of revset alias "recurse1" detected
  3589   hg: parse error: infinite expansion of revset alias "recurse1" detected
  3590   [255]
  3590   [255]
  3591 
  3591 
  3592   $ echo 'level1($1, $2) = $1 or $2' >> .hg/hgrc
  3592   $ echo 'level1($1, $2) = $1 or $2' >> .hg/hgrc
  3593   $ echo 'level2($1, $2) = level1($2, $1)' >> .hg/hgrc
  3593   $ echo 'level2($1, $2) = level1($2, $1)' >> .hg/hgrc
  3594   $ try "level2(level1(1, 2), 3)"
  3594   $ try "level2(level1(1, 2), 3)"
  3595   (func
  3595   (func
  3596     ('symbol', 'level2')
  3596     (symbol 'level2')
  3597     (list
  3597     (list
  3598       (func
  3598       (func
  3599         ('symbol', 'level1')
  3599         (symbol 'level1')
  3600         (list
  3600         (list
  3601           ('symbol', '1')
  3601           (symbol '1')
  3602           ('symbol', '2')))
  3602           (symbol '2')))
  3603       ('symbol', '3')))
  3603       (symbol '3')))
  3604   * expanded:
  3604   * expanded:
  3605   (or
  3605   (or
  3606     (list
  3606     (list
  3607       ('symbol', '3')
  3607       (symbol '3')
  3608       (or
  3608       (or
  3609         (list
  3609         (list
  3610           ('symbol', '1')
  3610           (symbol '1')
  3611           ('symbol', '2')))))
  3611           (symbol '2')))))
  3612   * set:
  3612   * set:
  3613   <addset
  3613   <addset
  3614     <baseset [3]>,
  3614     <baseset [3]>,
  3615     <baseset [1, 2]>>
  3615     <baseset [1, 2]>>
  3616   3
  3616   3
  3622   $ echo 'nested($1) = nested2($1)' >> .hg/hgrc
  3622   $ echo 'nested($1) = nested2($1)' >> .hg/hgrc
  3623   $ echo 'nested2($1) = nested3($1)' >> .hg/hgrc
  3623   $ echo 'nested2($1) = nested3($1)' >> .hg/hgrc
  3624   $ echo 'nested3($1) = max($1)' >> .hg/hgrc
  3624   $ echo 'nested3($1) = max($1)' >> .hg/hgrc
  3625   $ try 'nested(2:5)'
  3625   $ try 'nested(2:5)'
  3626   (func
  3626   (func
  3627     ('symbol', 'nested')
  3627     (symbol 'nested')
  3628     (range
  3628     (range
  3629       ('symbol', '2')
  3629       (symbol '2')
  3630       ('symbol', '5')))
  3630       (symbol '5')))
  3631   * expanded:
  3631   * expanded:
  3632   (func
  3632   (func
  3633     ('symbol', 'max')
  3633     (symbol 'max')
  3634     (range
  3634     (range
  3635       ('symbol', '2')
  3635       (symbol '2')
  3636       ('symbol', '5')))
  3636       (symbol '5')))
  3637   * set:
  3637   * set:
  3638   <baseset
  3638   <baseset
  3639     <max
  3639     <max
  3640       <fullreposet+ 0:10>,
  3640       <fullreposet+ 0:10>,
  3641       <spanset+ 2:6>>>
  3641       <spanset+ 2:6>>>
  3644 test chained `or` operations are flattened at parsing phase
  3644 test chained `or` operations are flattened at parsing phase
  3645 
  3645 
  3646   $ echo 'chainedorops($1, $2, $3) = $1|$2|$3' >> .hg/hgrc
  3646   $ echo 'chainedorops($1, $2, $3) = $1|$2|$3' >> .hg/hgrc
  3647   $ try 'chainedorops(0:1, 1:2, 2:3)'
  3647   $ try 'chainedorops(0:1, 1:2, 2:3)'
  3648   (func
  3648   (func
  3649     ('symbol', 'chainedorops')
  3649     (symbol 'chainedorops')
  3650     (list
  3650     (list
  3651       (range
  3651       (range
  3652         ('symbol', '0')
  3652         (symbol '0')
  3653         ('symbol', '1'))
  3653         (symbol '1'))
  3654       (range
  3654       (range
  3655         ('symbol', '1')
  3655         (symbol '1')
  3656         ('symbol', '2'))
  3656         (symbol '2'))
  3657       (range
  3657       (range
  3658         ('symbol', '2')
  3658         (symbol '2')
  3659         ('symbol', '3'))))
  3659         (symbol '3'))))
  3660   * expanded:
  3660   * expanded:
  3661   (or
  3661   (or
  3662     (list
  3662     (list
  3663       (range
  3663       (range
  3664         ('symbol', '0')
  3664         (symbol '0')
  3665         ('symbol', '1'))
  3665         (symbol '1'))
  3666       (range
  3666       (range
  3667         ('symbol', '1')
  3667         (symbol '1')
  3668         ('symbol', '2'))
  3668         (symbol '2'))
  3669       (range
  3669       (range
  3670         ('symbol', '2')
  3670         (symbol '2')
  3671         ('symbol', '3'))))
  3671         (symbol '3'))))
  3672   * set:
  3672   * set:
  3673   <addset
  3673   <addset
  3674     <spanset+ 0:2>,
  3674     <spanset+ 0:2>,
  3675     <addset
  3675     <addset
  3676       <spanset+ 1:3>,
  3676       <spanset+ 1:3>,
  3686 
  3686 
  3687   $ echo 'injectparamasstring = max("$1")' >> .hg/hgrc
  3687   $ echo 'injectparamasstring = max("$1")' >> .hg/hgrc
  3688   $ echo 'callinjection($1) = descendants(injectparamasstring)' >> .hg/hgrc
  3688   $ echo 'callinjection($1) = descendants(injectparamasstring)' >> .hg/hgrc
  3689   $ try 'callinjection(2:5)'
  3689   $ try 'callinjection(2:5)'
  3690   (func
  3690   (func
  3691     ('symbol', 'callinjection')
  3691     (symbol 'callinjection')
  3692     (range
  3692     (range
  3693       ('symbol', '2')
  3693       (symbol '2')
  3694       ('symbol', '5')))
  3694       (symbol '5')))
  3695   * expanded:
  3695   * expanded:
  3696   (func
  3696   (func
  3697     ('symbol', 'descendants')
  3697     (symbol 'descendants')
  3698     (func
  3698     (func
  3699       ('symbol', 'max')
  3699       (symbol 'max')
  3700       ('string', '$1')))
  3700       (string '$1')))
  3701   abort: unknown revision '$1'!
  3701   abort: unknown revision '$1'!
  3702   [255]
  3702   [255]
  3703 
  3703 
  3704 test scope of alias expansion: 'universe' is expanded prior to 'shadowall(0)',
  3704 test scope of alias expansion: 'universe' is expanded prior to 'shadowall(0)',
  3705 but 'all()' should never be substituted to '0()'.
  3705 but 'all()' should never be substituted to '0()'.
  3706 
  3706 
  3707   $ echo 'universe = all()' >> .hg/hgrc
  3707   $ echo 'universe = all()' >> .hg/hgrc
  3708   $ echo 'shadowall(all) = all and universe' >> .hg/hgrc
  3708   $ echo 'shadowall(all) = all and universe' >> .hg/hgrc
  3709   $ try 'shadowall(0)'
  3709   $ try 'shadowall(0)'
  3710   (func
  3710   (func
  3711     ('symbol', 'shadowall')
  3711     (symbol 'shadowall')
  3712     ('symbol', '0'))
  3712     (symbol '0'))
  3713   * expanded:
  3713   * expanded:
  3714   (and
  3714   (and
  3715     ('symbol', '0')
  3715     (symbol '0')
  3716     (func
  3716     (func
  3717       ('symbol', 'all')
  3717       (symbol 'all')
  3718       None))
  3718       None))
  3719   * set:
  3719   * set:
  3720   <filteredset
  3720   <filteredset
  3721     <baseset [0]>,
  3721     <baseset [0]>,
  3722     <spanset+ 0:10>>
  3722     <spanset+ 0:10>>
  3724 
  3724 
  3725 test unknown reference:
  3725 test unknown reference:
  3726 
  3726 
  3727   $ try "unknownref(0)" --config 'revsetalias.unknownref($1)=$1:$2'
  3727   $ try "unknownref(0)" --config 'revsetalias.unknownref($1)=$1:$2'
  3728   (func
  3728   (func
  3729     ('symbol', 'unknownref')
  3729     (symbol 'unknownref')
  3730     ('symbol', '0'))
  3730     (symbol '0'))
  3731   abort: bad definition of revset alias "unknownref": invalid symbol '$2'
  3731   abort: bad definition of revset alias "unknownref": invalid symbol '$2'
  3732   [255]
  3732   [255]
  3733 
  3733 
  3734   $ hg debugrevspec --debug --config revsetalias.anotherbadone='branch(' "tip"
  3734   $ hg debugrevspec --debug --config revsetalias.anotherbadone='branch(' "tip"
  3735   ('symbol', 'tip')
  3735   (symbol 'tip')
  3736   warning: bad definition of revset alias "anotherbadone": at 7: not a prefix: end
  3736   warning: bad definition of revset alias "anotherbadone": at 7: not a prefix: end
  3737   * set:
  3737   * set:
  3738   <baseset [9]>
  3738   <baseset [9]>
  3739   9
  3739   9
  3740 
  3740 
  3741   $ try 'tip'
  3741   $ try 'tip'
  3742   ('symbol', 'tip')
  3742   (symbol 'tip')
  3743   * set:
  3743   * set:
  3744   <baseset [9]>
  3744   <baseset [9]>
  3745   9
  3745   9
  3746 
  3746 
  3747   $ hg debugrevspec --debug --config revsetalias.'bad name'='tip' "tip"
  3747   $ hg debugrevspec --debug --config revsetalias.'bad name'='tip' "tip"
  3748   ('symbol', 'tip')
  3748   (symbol 'tip')
  3749   warning: bad declaration of revset alias "bad name": at 4: invalid token
  3749   warning: bad declaration of revset alias "bad name": at 4: invalid token
  3750   * set:
  3750   * set:
  3751   <baseset [9]>
  3751   <baseset [9]>
  3752   9
  3752   9
  3753   $ echo 'strictreplacing($1, $10) = $10 or desc("$1")' >> .hg/hgrc
  3753   $ echo 'strictreplacing($1, $10) = $10 or desc("$1")' >> .hg/hgrc
  3754   $ try 'strictreplacing("foo", tip)'
  3754   $ try 'strictreplacing("foo", tip)'
  3755   (func
  3755   (func
  3756     ('symbol', 'strictreplacing')
  3756     (symbol 'strictreplacing')
  3757     (list
  3757     (list
  3758       ('string', 'foo')
  3758       (string 'foo')
  3759       ('symbol', 'tip')))
  3759       (symbol 'tip')))
  3760   * expanded:
  3760   * expanded:
  3761   (or
  3761   (or
  3762     (list
  3762     (list
  3763       ('symbol', 'tip')
  3763       (symbol 'tip')
  3764       (func
  3764       (func
  3765         ('symbol', 'desc')
  3765         (symbol 'desc')
  3766         ('string', '$1'))))
  3766         (string '$1'))))
  3767   * set:
  3767   * set:
  3768   <addset
  3768   <addset
  3769     <baseset [9]>,
  3769     <baseset [9]>,
  3770     <filteredset
  3770     <filteredset
  3771       <fullreposet+ 0:10>,
  3771       <fullreposet+ 0:10>,
  3772       <desc '$1'>>>
  3772       <desc '$1'>>>
  3773   9
  3773   9
  3774 
  3774 
  3775   $ try 'd(2:5)'
  3775   $ try 'd(2:5)'
  3776   (func
  3776   (func
  3777     ('symbol', 'd')
  3777     (symbol 'd')
  3778     (range
  3778     (range
  3779       ('symbol', '2')
  3779       (symbol '2')
  3780       ('symbol', '5')))
  3780       (symbol '5')))
  3781   * expanded:
  3781   * expanded:
  3782   (func
  3782   (func
  3783     ('symbol', 'reverse')
  3783     (symbol 'reverse')
  3784     (func
  3784     (func
  3785       ('symbol', 'sort')
  3785       (symbol 'sort')
  3786       (list
  3786       (list
  3787         (range
  3787         (range
  3788           ('symbol', '2')
  3788           (symbol '2')
  3789           ('symbol', '5'))
  3789           (symbol '5'))
  3790         ('symbol', 'date'))))
  3790         (symbol 'date'))))
  3791   * set:
  3791   * set:
  3792   <baseset [4, 5, 3, 2]>
  3792   <baseset [4, 5, 3, 2]>
  3793   4
  3793   4
  3794   5
  3794   5
  3795   3
  3795   3
  3796   2
  3796   2
  3797   $ try 'rs(2 or 3, date)'
  3797   $ try 'rs(2 or 3, date)'
  3798   (func
  3798   (func
  3799     ('symbol', 'rs')
  3799     (symbol 'rs')
  3800     (list
  3800     (list
  3801       (or
  3801       (or
  3802         (list
  3802         (list
  3803           ('symbol', '2')
  3803           (symbol '2')
  3804           ('symbol', '3')))
  3804           (symbol '3')))
  3805       ('symbol', 'date')))
  3805       (symbol 'date')))
  3806   * expanded:
  3806   * expanded:
  3807   (func
  3807   (func
  3808     ('symbol', 'reverse')
  3808     (symbol 'reverse')
  3809     (func
  3809     (func
  3810       ('symbol', 'sort')
  3810       (symbol 'sort')
  3811       (list
  3811       (list
  3812         (or
  3812         (or
  3813           (list
  3813           (list
  3814             ('symbol', '2')
  3814             (symbol '2')
  3815             ('symbol', '3')))
  3815             (symbol '3')))
  3816         ('symbol', 'date'))))
  3816         (symbol 'date'))))
  3817   * set:
  3817   * set:
  3818   <baseset [3, 2]>
  3818   <baseset [3, 2]>
  3819   3
  3819   3
  3820   2
  3820   2
  3821   $ try 'rs()'
  3821   $ try 'rs()'
  3822   (func
  3822   (func
  3823     ('symbol', 'rs')
  3823     (symbol 'rs')
  3824     None)
  3824     None)
  3825   hg: parse error: invalid number of arguments: 0
  3825   hg: parse error: invalid number of arguments: 0
  3826   [255]
  3826   [255]
  3827   $ try 'rs(2)'
  3827   $ try 'rs(2)'
  3828   (func
  3828   (func
  3829     ('symbol', 'rs')
  3829     (symbol 'rs')
  3830     ('symbol', '2'))
  3830     (symbol '2'))
  3831   hg: parse error: invalid number of arguments: 1
  3831   hg: parse error: invalid number of arguments: 1
  3832   [255]
  3832   [255]
  3833   $ try 'rs(2, data, 7)'
  3833   $ try 'rs(2, data, 7)'
  3834   (func
  3834   (func
  3835     ('symbol', 'rs')
  3835     (symbol 'rs')
  3836     (list
  3836     (list
  3837       ('symbol', '2')
  3837       (symbol '2')
  3838       ('symbol', 'data')
  3838       (symbol 'data')
  3839       ('symbol', '7')))
  3839       (symbol '7')))
  3840   hg: parse error: invalid number of arguments: 3
  3840   hg: parse error: invalid number of arguments: 3
  3841   [255]
  3841   [255]
  3842   $ try 'rs4(2 or 3, x, x, date)'
  3842   $ try 'rs4(2 or 3, x, x, date)'
  3843   (func
  3843   (func
  3844     ('symbol', 'rs4')
  3844     (symbol 'rs4')
  3845     (list
  3845     (list
  3846       (or
  3846       (or
  3847         (list
  3847         (list
  3848           ('symbol', '2')
  3848           (symbol '2')
  3849           ('symbol', '3')))
  3849           (symbol '3')))
  3850       ('symbol', 'x')
  3850       (symbol 'x')
  3851       ('symbol', 'x')
  3851       (symbol 'x')
  3852       ('symbol', 'date')))
  3852       (symbol 'date')))
  3853   * expanded:
  3853   * expanded:
  3854   (func
  3854   (func
  3855     ('symbol', 'reverse')
  3855     (symbol 'reverse')
  3856     (func
  3856     (func
  3857       ('symbol', 'sort')
  3857       (symbol 'sort')
  3858       (list
  3858       (list
  3859         (or
  3859         (or
  3860           (list
  3860           (list
  3861             ('symbol', '2')
  3861             (symbol '2')
  3862             ('symbol', '3')))
  3862             (symbol '3')))
  3863         ('symbol', 'date'))))
  3863         (symbol 'date'))))
  3864   * set:
  3864   * set:
  3865   <baseset [3, 2]>
  3865   <baseset [3, 2]>
  3866   3
  3866   3
  3867   2
  3867   2
  3868 
  3868 
  3925 issue2549 - correct optimizations
  3925 issue2549 - correct optimizations
  3926 
  3926 
  3927   $ try 'limit(1 or 2 or 3, 2) and not 2'
  3927   $ try 'limit(1 or 2 or 3, 2) and not 2'
  3928   (and
  3928   (and
  3929     (func
  3929     (func
  3930       ('symbol', 'limit')
  3930       (symbol 'limit')
  3931       (list
  3931       (list
  3932         (or
  3932         (or
  3933           (list
  3933           (list
  3934             ('symbol', '1')
  3934             (symbol '1')
  3935             ('symbol', '2')
  3935             (symbol '2')
  3936             ('symbol', '3')))
  3936             (symbol '3')))
  3937         ('symbol', '2')))
  3937         (symbol '2')))
  3938     (not
  3938     (not
  3939       ('symbol', '2')))
  3939       (symbol '2')))
  3940   * set:
  3940   * set:
  3941   <filteredset
  3941   <filteredset
  3942     <baseset [1, 2]>,
  3942     <baseset [1, 2]>,
  3943     <not
  3943     <not
  3944       <baseset [2]>>>
  3944       <baseset [2]>>>
  3945   1
  3945   1
  3946   $ try 'max(1 or 2) and not 2'
  3946   $ try 'max(1 or 2) and not 2'
  3947   (and
  3947   (and
  3948     (func
  3948     (func
  3949       ('symbol', 'max')
  3949       (symbol 'max')
  3950       (or
  3950       (or
  3951         (list
  3951         (list
  3952           ('symbol', '1')
  3952           (symbol '1')
  3953           ('symbol', '2'))))
  3953           (symbol '2'))))
  3954     (not
  3954     (not
  3955       ('symbol', '2')))
  3955       (symbol '2')))
  3956   * set:
  3956   * set:
  3957   <filteredset
  3957   <filteredset
  3958     <baseset
  3958     <baseset
  3959       <max
  3959       <max
  3960         <fullreposet+ 0:10>,
  3960         <fullreposet+ 0:10>,
  3962     <not
  3962     <not
  3963       <baseset [2]>>>
  3963       <baseset [2]>>>
  3964   $ try 'min(1 or 2) and not 1'
  3964   $ try 'min(1 or 2) and not 1'
  3965   (and
  3965   (and
  3966     (func
  3966     (func
  3967       ('symbol', 'min')
  3967       (symbol 'min')
  3968       (or
  3968       (or
  3969         (list
  3969         (list
  3970           ('symbol', '1')
  3970           (symbol '1')
  3971           ('symbol', '2'))))
  3971           (symbol '2'))))
  3972     (not
  3972     (not
  3973       ('symbol', '1')))
  3973       (symbol '1')))
  3974   * set:
  3974   * set:
  3975   <filteredset
  3975   <filteredset
  3976     <baseset
  3976     <baseset
  3977       <min
  3977       <min
  3978         <fullreposet+ 0:10>,
  3978         <fullreposet+ 0:10>,
  3980     <not
  3980     <not
  3981       <baseset [1]>>>
  3981       <baseset [1]>>>
  3982   $ try 'last(1 or 2, 1) and not 2'
  3982   $ try 'last(1 or 2, 1) and not 2'
  3983   (and
  3983   (and
  3984     (func
  3984     (func
  3985       ('symbol', 'last')
  3985       (symbol 'last')
  3986       (list
  3986       (list
  3987         (or
  3987         (or
  3988           (list
  3988           (list
  3989             ('symbol', '1')
  3989             (symbol '1')
  3990             ('symbol', '2')))
  3990             (symbol '2')))
  3991         ('symbol', '1')))
  3991         (symbol '1')))
  3992     (not
  3992     (not
  3993       ('symbol', '2')))
  3993       (symbol '2')))
  3994   * set:
  3994   * set:
  3995   <filteredset
  3995   <filteredset
  3996     <baseset [2]>,
  3996     <baseset [2]>,
  3997     <not
  3997     <not
  3998       <baseset [2]>>>
  3998       <baseset [2]>>>
  4063 
  4063 
  4064   $ try "278 ## '5f5' ## 1ee ## 'ce5'"
  4064   $ try "278 ## '5f5' ## 1ee ## 'ce5'"
  4065   (_concat
  4065   (_concat
  4066     (_concat
  4066     (_concat
  4067       (_concat
  4067       (_concat
  4068         ('symbol', '278')
  4068         (symbol '278')
  4069         ('string', '5f5'))
  4069         (string '5f5'))
  4070       ('symbol', '1ee'))
  4070       (symbol '1ee'))
  4071     ('string', 'ce5'))
  4071     (string 'ce5'))
  4072   * concatenated:
  4072   * concatenated:
  4073   ('string', '2785f51eece5')
  4073   (string '2785f51eece5')
  4074   * set:
  4074   * set:
  4075   <baseset [0]>
  4075   <baseset [0]>
  4076   0
  4076   0
  4077 
  4077 
  4078   $ echo 'cat4($1, $2, $3, $4) = $1 ## $2 ## $3 ## $4' >> .hg/hgrc
  4078   $ echo 'cat4($1, $2, $3, $4) = $1 ## $2 ## $3 ## $4' >> .hg/hgrc
  4079   $ try "cat4(278, '5f5', 1ee, 'ce5')"
  4079   $ try "cat4(278, '5f5', 1ee, 'ce5')"
  4080   (func
  4080   (func
  4081     ('symbol', 'cat4')
  4081     (symbol 'cat4')
  4082     (list
  4082     (list
  4083       ('symbol', '278')
  4083       (symbol '278')
  4084       ('string', '5f5')
  4084       (string '5f5')
  4085       ('symbol', '1ee')
  4085       (symbol '1ee')
  4086       ('string', 'ce5')))
  4086       (string 'ce5')))
  4087   * expanded:
  4087   * expanded:
  4088   (_concat
  4088   (_concat
  4089     (_concat
  4089     (_concat
  4090       (_concat
  4090       (_concat
  4091         ('symbol', '278')
  4091         (symbol '278')
  4092         ('string', '5f5'))
  4092         (string '5f5'))
  4093       ('symbol', '1ee'))
  4093       (symbol '1ee'))
  4094     ('string', 'ce5'))
  4094     (string 'ce5'))
  4095   * concatenated:
  4095   * concatenated:
  4096   ('string', '2785f51eece5')
  4096   (string '2785f51eece5')
  4097   * set:
  4097   * set:
  4098   <baseset [0]>
  4098   <baseset [0]>
  4099   0
  4099   0
  4100 
  4100 
  4101 (check concatenation in alias nesting)
  4101 (check concatenation in alias nesting)
  4368   
  4368   
  4369   $ hg debugrevspec --verify -p analyzed -p optimized 'draft() & ::(((S1+D1+P5)-D3)+S2)'
  4369   $ hg debugrevspec --verify -p analyzed -p optimized 'draft() & ::(((S1+D1+P5)-D3)+S2)'
  4370   * analyzed:
  4370   * analyzed:
  4371   (and
  4371   (and
  4372     (func
  4372     (func
  4373       ('symbol', 'draft')
  4373       (symbol 'draft')
  4374       None)
  4374       None)
  4375     (func
  4375     (func
  4376       ('symbol', 'ancestors')
  4376       (symbol 'ancestors')
  4377       (or
  4377       (or
  4378         (list
  4378         (list
  4379           (and
  4379           (and
  4380             (or
  4380             (or
  4381               (list
  4381               (list
  4382                 ('symbol', 'S1')
  4382                 (symbol 'S1')
  4383                 ('symbol', 'D1')
  4383                 (symbol 'D1')
  4384                 ('symbol', 'P5')))
  4384                 (symbol 'P5')))
  4385             (not
  4385             (not
  4386               ('symbol', 'D3')))
  4386               (symbol 'D3')))
  4387           ('symbol', 'S2')))))
  4387           (symbol 'S2')))))
  4388   * optimized:
  4388   * optimized:
  4389   (func
  4389   (func
  4390     ('symbol', '_phaseandancestors')
  4390     (symbol '_phaseandancestors')
  4391     (list
  4391     (list
  4392       ('symbol', 'draft')
  4392       (symbol 'draft')
  4393       (or
  4393       (or
  4394         (list
  4394         (list
  4395           (difference
  4395           (difference
  4396             (func
  4396             (func
  4397               ('symbol', '_list')
  4397               (symbol '_list')
  4398               ('string', 'S1\x00D1\x00P5'))
  4398               (string 'S1\x00D1\x00P5'))
  4399             ('symbol', 'D3'))
  4399             (symbol 'D3'))
  4400           ('symbol', 'S2')))))
  4400           (symbol 'S2')))))
  4401   $ hg debugrevspec --verify -p analyzed -p optimized 'secret() & ::9'
  4401   $ hg debugrevspec --verify -p analyzed -p optimized 'secret() & ::9'
  4402   * analyzed:
  4402   * analyzed:
  4403   (and
  4403   (and
  4404     (func
  4404     (func
  4405       ('symbol', 'secret')
  4405       (symbol 'secret')
  4406       None)
  4406       None)
  4407     (func
  4407     (func
  4408       ('symbol', 'ancestors')
  4408       (symbol 'ancestors')
  4409       ('symbol', '9')))
  4409       (symbol '9')))
  4410   * optimized:
  4410   * optimized:
  4411   (func
  4411   (func
  4412     ('symbol', '_phaseandancestors')
  4412     (symbol '_phaseandancestors')
  4413     (list
  4413     (list
  4414       ('symbol', 'secret')
  4414       (symbol 'secret')
  4415       ('symbol', '9')))
  4415       (symbol '9')))
  4416   $ hg debugrevspec --verify -p analyzed -p optimized '7 & ( (not public()) & ::(tag()) )'
  4416   $ hg debugrevspec --verify -p analyzed -p optimized '7 & ( (not public()) & ::(tag()) )'
  4417   * analyzed:
  4417   * analyzed:
  4418   (and
  4418   (and
  4419     ('symbol', '7')
  4419     (symbol '7')
  4420     (and
  4420     (and
  4421       (not
  4421       (not
  4422         (func
  4422         (func
  4423           ('symbol', 'public')
  4423           (symbol 'public')
  4424           None))
  4424           None))
  4425       (func
  4425       (func
  4426         ('symbol', 'ancestors')
  4426         (symbol 'ancestors')
  4427         (func
  4427         (func
  4428           ('symbol', 'tag')
  4428           (symbol 'tag')
  4429           None))))
  4429           None))))
  4430   * optimized:
  4430   * optimized:
  4431   (and
  4431   (and
  4432     ('symbol', '7')
  4432     (symbol '7')
  4433     (func
  4433     (func
  4434       ('symbol', '_phaseandancestors')
  4434       (symbol '_phaseandancestors')
  4435       (list
  4435       (list
  4436         ('symbol', '_notpublic')
  4436         (symbol '_notpublic')
  4437         (func
  4437         (func
  4438           ('symbol', 'tag')
  4438           (symbol 'tag')
  4439           None))))
  4439           None))))
  4440   $ hg debugrevspec --verify -p optimized '(not public()) & ancestors(S1+D2+P5, 1)'
  4440   $ hg debugrevspec --verify -p optimized '(not public()) & ancestors(S1+D2+P5, 1)'
  4441   * optimized:
  4441   * optimized:
  4442   (and
  4442   (and
  4443     (func
  4443     (func
  4444       ('symbol', '_notpublic')
  4444       (symbol '_notpublic')
  4445       None)
  4445       None)
  4446     (func
  4446     (func
  4447       ('symbol', 'ancestors')
  4447       (symbol 'ancestors')
  4448       (list
  4448       (list
  4449         (func
  4449         (func
  4450           ('symbol', '_list')
  4450           (symbol '_list')
  4451           ('string', 'S1\x00D2\x00P5'))
  4451           (string 'S1\x00D2\x00P5'))
  4452         ('symbol', '1'))))
  4452         (symbol '1'))))
  4453   $ hg debugrevspec --verify -p optimized '(not public()) & ancestors(S1+D2+P5, depth=1)'
  4453   $ hg debugrevspec --verify -p optimized '(not public()) & ancestors(S1+D2+P5, depth=1)'
  4454   * optimized:
  4454   * optimized:
  4455   (and
  4455   (and
  4456     (func
  4456     (func
  4457       ('symbol', '_notpublic')
  4457       (symbol '_notpublic')
  4458       None)
  4458       None)
  4459     (func
  4459     (func
  4460       ('symbol', 'ancestors')
  4460       (symbol 'ancestors')
  4461       (list
  4461       (list
  4462         (func
  4462         (func
  4463           ('symbol', '_list')
  4463           (symbol '_list')
  4464           ('string', 'S1\x00D2\x00P5'))
  4464           (string 'S1\x00D2\x00P5'))
  4465         (keyvalue
  4465         (keyvalue
  4466           ('symbol', 'depth')
  4466           (symbol 'depth')
  4467           ('symbol', '1')))))
  4467           (symbol '1')))))