tests/test-revset.t
changeset 34011 1b28525e6698
parent 34010 72b5f4d53c58
child 34020 37b82485097f
equal deleted inserted replaced
34010:72b5f4d53c58 34011:1b28525e6698
   164   $ try --optimize :
   164   $ try --optimize :
   165   (rangeall
   165   (rangeall
   166     None)
   166     None)
   167   * optimized:
   167   * optimized:
   168   (rangeall
   168   (rangeall
   169     None
   169     None)
   170     define)
       
   171   * set:
   170   * set:
   172   <spanset+ 0:10>
   171   <spanset+ 0:10>
   173   0
   172   0
   174   1
   173   1
   175   2
   174   2
   493   * optimized:
   492   * optimized:
   494   (keyvalue
   493   (keyvalue
   495     ('symbol', 'foo')
   494     ('symbol', 'foo')
   496     (func
   495     (func
   497       ('symbol', '_notpublic')
   496       ('symbol', '_notpublic')
   498       None
   497       None))
   499       any))
       
   500   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
   501   [255]
   499   [255]
   502 
   500 
   503 relation-subscript operator has the highest binding strength (as function call):
   501 relation-subscript operator has the highest binding strength (as function call):
   504 
   502 
   536   * analyzed:
   534   * analyzed:
   537   (relsubscript
   535   (relsubscript
   538     (not
   536     (not
   539       (func
   537       (func
   540         ('symbol', 'public')
   538         ('symbol', 'public')
   541         None
   539         None))
   542         any)
       
   543       define)
       
   544     ('symbol', 'generations')
   540     ('symbol', 'generations')
   545     ('symbol', '0')
   541     ('symbol', '0'))
   546     define)
       
   547   * optimized:
   542   * optimized:
   548   (relsubscript
   543   (relsubscript
   549     (func
   544     (func
   550       ('symbol', '_notpublic')
   545       ('symbol', '_notpublic')
   551       None
   546       None)
   552       any)
       
   553     ('symbol', 'generations')
   547     ('symbol', 'generations')
   554     ('symbol', '0')
   548     ('symbol', '0'))
   555     define)
       
   556 
   549 
   557 resolution of subscript and relation-subscript ternary operators:
   550 resolution of subscript and relation-subscript ternary operators:
   558 
   551 
   559   $ hg debugrevspec -p analyzed 'tip[0]'
   552   $ hg debugrevspec -p analyzed 'tip[0]'
   560   * analyzed:
   553   * analyzed:
   561   (subscript
   554   (subscript
   562     ('symbol', 'tip')
   555     ('symbol', 'tip')
   563     ('symbol', '0')
   556     ('symbol', '0'))
   564     define)
       
   565   hg: parse error: can't use a subscript in this context
   557   hg: parse error: can't use a subscript in this context
   566   [255]
   558   [255]
   567 
   559 
   568   $ hg debugrevspec -p analyzed 'tip#rel[0]'
   560   $ hg debugrevspec -p analyzed 'tip#rel[0]'
   569   * analyzed:
   561   * analyzed:
   570   (relsubscript
   562   (relsubscript
   571     ('symbol', 'tip')
   563     ('symbol', 'tip')
   572     ('symbol', 'rel')
   564     ('symbol', 'rel')
   573     ('symbol', '0')
   565     ('symbol', '0'))
   574     define)
       
   575   hg: parse error: unknown identifier: rel
   566   hg: parse error: unknown identifier: rel
   576   [255]
   567   [255]
   577 
   568 
   578   $ hg debugrevspec -p analyzed '(tip#rel)[0]'
   569   $ hg debugrevspec -p analyzed '(tip#rel)[0]'
   579   * analyzed:
   570   * analyzed:
   580   (subscript
   571   (subscript
   581     (relation
   572     (relation
   582       ('symbol', 'tip')
   573       ('symbol', 'tip')
   583       ('symbol', 'rel')
   574       ('symbol', 'rel'))
   584       define)
   575     ('symbol', '0'))
   585     ('symbol', '0')
       
   586     define)
       
   587   hg: parse error: can't use a subscript in this context
   576   hg: parse error: can't use a subscript in this context
   588   [255]
   577   [255]
   589 
   578 
   590   $ hg debugrevspec -p analyzed 'tip#rel[0][1]'
   579   $ hg debugrevspec -p analyzed 'tip#rel[0][1]'
   591   * analyzed:
   580   * analyzed:
   592   (subscript
   581   (subscript
   593     (relsubscript
   582     (relsubscript
   594       ('symbol', 'tip')
   583       ('symbol', 'tip')
   595       ('symbol', 'rel')
   584       ('symbol', 'rel')
   596       ('symbol', '0')
   585       ('symbol', '0'))
   597       define)
   586     ('symbol', '1'))
   598     ('symbol', '1')
       
   599     define)
       
   600   hg: parse error: can't use a subscript in this context
   587   hg: parse error: can't use a subscript in this context
   601   [255]
   588   [255]
   602 
   589 
   603   $ hg debugrevspec -p analyzed 'tip#rel0#rel1[1]'
   590   $ hg debugrevspec -p analyzed 'tip#rel0#rel1[1]'
   604   * analyzed:
   591   * analyzed:
   605   (relsubscript
   592   (relsubscript
   606     (relation
   593     (relation
   607       ('symbol', 'tip')
   594       ('symbol', 'tip')
   608       ('symbol', 'rel0')
   595       ('symbol', 'rel0'))
   609       define)
       
   610     ('symbol', 'rel1')
   596     ('symbol', 'rel1')
   611     ('symbol', '1')
   597     ('symbol', '1'))
   612     define)
       
   613   hg: parse error: unknown identifier: rel1
   598   hg: parse error: unknown identifier: rel1
   614   [255]
   599   [255]
   615 
   600 
   616   $ hg debugrevspec -p analyzed 'tip#rel0[0]#rel1[1]'
   601   $ hg debugrevspec -p analyzed 'tip#rel0[0]#rel1[1]'
   617   * analyzed:
   602   * analyzed:
   618   (relsubscript
   603   (relsubscript
   619     (relsubscript
   604     (relsubscript
   620       ('symbol', 'tip')
   605       ('symbol', 'tip')
   621       ('symbol', 'rel0')
   606       ('symbol', 'rel0')
   622       ('symbol', '0')
   607       ('symbol', '0'))
   623       define)
       
   624     ('symbol', 'rel1')
   608     ('symbol', 'rel1')
   625     ('symbol', '1')
   609     ('symbol', '1'))
   626     define)
       
   627   hg: parse error: unknown identifier: rel1
   610   hg: parse error: unknown identifier: rel1
   628   [255]
   611   [255]
   629 
   612 
   630 parse errors of relation, subscript and relation-subscript operators:
   613 parse errors of relation, subscript and relation-subscript operators:
   631 
   614 
   698   * analyzed:
   681   * analyzed:
   699   (and
   682   (and
   700     (or
   683     (or
   701       (list
   684       (list
   702         ('symbol', '0')
   685         ('symbol', '0')
   703         ('symbol', '1'))
   686         ('symbol', '1')))
   704       define)
       
   705     (not
   687     (not
   706       ('symbol', '1')
   688       ('symbol', '1')))
   707       follow)
       
   708     define)
       
   709   * optimized:
   689   * optimized:
   710   (difference
   690   (difference
   711     (func
   691     (func
   712       ('symbol', '_list')
   692       ('symbol', '_list')
   713       ('string', '0\x001')
   693       ('string', '0\x001'))
   714       define)
   694     ('symbol', '1'))
   715     ('symbol', '1')
       
   716     define)
       
   717   0
   695   0
   718 
   696 
   719   $ hg debugrevspec -p unknown '0'
   697   $ hg debugrevspec -p unknown '0'
   720   abort: invalid stage name: unknown
   698   abort: invalid stage name: unknown
   721   [255]
   699   [255]
   731   $ hg debugrevspec --verify -v -p analyzed -p optimized 'r3232() & 2'
   709   $ hg debugrevspec --verify -v -p analyzed -p optimized 'r3232() & 2'
   732   * analyzed:
   710   * analyzed:
   733   (and
   711   (and
   734     (func
   712     (func
   735       ('symbol', 'r3232')
   713       ('symbol', 'r3232')
   736       None
   714       None)
   737       define)
   715     ('symbol', '2'))
       
   716   * optimized:
       
   717   (flipand
   738     ('symbol', '2')
   718     ('symbol', '2')
   739     define)
       
   740   * optimized:
       
   741   (and
       
   742     ('symbol', '2')
       
   743     (func
   719     (func
   744       ('symbol', 'r3232')
   720       ('symbol', 'r3232')
   745       None
   721       None))
   746       define)
       
   747     define)
       
   748   * analyzed set:
   722   * analyzed set:
   749   <baseset [2]>
   723   <baseset [2]>
   750   * optimized set:
   724   * optimized set:
   751   <baseset [2, 2]>
   725   <baseset [2, 2]>
   752   --- analyzed
   726   --- analyzed
   774   * parsed:
   748   * parsed:
   775   (rangeall
   749   (rangeall
   776     None)
   750     None)
   777   * analyzed:
   751   * analyzed:
   778   (rangeall
   752   (rangeall
   779     None
   753     None)
   780     define)
       
   781   * set:
   754   * set:
   782   <spanset+ 0:10>
   755   <spanset+ 0:10>
   783   0
   756   0
   784   1
   757   1
   785   2
   758   2
   791   8
   764   8
   792   9
   765   9
   793   $ try -p analyzed ':1'
   766   $ try -p analyzed ':1'
   794   * analyzed:
   767   * analyzed:
   795   (rangepre
   768   (rangepre
   796     ('symbol', '1')
   769     ('symbol', '1'))
   797     define)
       
   798   * set:
   770   * set:
   799   <spanset+ 0:2>
   771   <spanset+ 0:2>
   800   0
   772   0
   801   1
   773   1
   802   $ try -p analyzed ':(1|2)'
   774   $ try -p analyzed ':(1|2)'
   803   * analyzed:
   775   * analyzed:
   804   (rangepre
   776   (rangepre
   805     (or
   777     (or
   806       (list
   778       (list
   807         ('symbol', '1')
   779         ('symbol', '1')
   808         ('symbol', '2'))
   780         ('symbol', '2'))))
   809       define)
       
   810     define)
       
   811   * set:
   781   * set:
   812   <spanset+ 0:3>
   782   <spanset+ 0:3>
   813   0
   783   0
   814   1
   784   1
   815   2
   785   2
   816   $ try -p analyzed ':(1&2)'
   786   $ try -p analyzed ':(1&2)'
   817   * analyzed:
   787   * analyzed:
   818   (rangepre
   788   (rangepre
   819     (and
   789     (and
   820       ('symbol', '1')
   790       ('symbol', '1')
   821       ('symbol', '2')
   791       ('symbol', '2')))
   822       define)
       
   823     define)
       
   824   * set:
   792   * set:
   825   <baseset []>
   793   <baseset []>
   826 
   794 
   827 infix/suffix resolution of ^ operator (issue2884):
   795 infix/suffix resolution of ^ operator (issue2884):
   828 
   796 
  1641   (func
  1609   (func
  1642     ('symbol', 'only')
  1610     ('symbol', 'only')
  1643     (difference
  1611     (difference
  1644       (range
  1612       (range
  1645         ('symbol', '8')
  1613         ('symbol', '8')
  1646         ('symbol', '9')
  1614         ('symbol', '9'))
  1647         define)
  1615       ('symbol', '8')))
  1648       ('symbol', '8')
       
  1649       define)
       
  1650     define)
       
  1651   * set:
  1616   * set:
  1652   <baseset+ [8, 9]>
  1617   <baseset+ [8, 9]>
  1653   8
  1618   8
  1654   9
  1619   9
  1655   $ try --optimize '(9)%(5)'
  1620   $ try --optimize '(9)%(5)'
  1661   * optimized:
  1626   * optimized:
  1662   (func
  1627   (func
  1663     ('symbol', 'only')
  1628     ('symbol', 'only')
  1664     (list
  1629     (list
  1665       ('symbol', '9')
  1630       ('symbol', '9')
  1666       ('symbol', '5'))
  1631       ('symbol', '5')))
  1667     define)
       
  1668   * set:
  1632   * set:
  1669   <baseset+ [2, 4, 8, 9]>
  1633   <baseset+ [2, 4, 8, 9]>
  1670   2
  1634   2
  1671   4
  1635   4
  1672   8
  1636   8
  1997   * optimized:
  1961   * optimized:
  1998   (difference
  1962   (difference
  1999     (and
  1963     (and
  2000       (range
  1964       (range
  2001         ('symbol', '3')
  1965         ('symbol', '3')
  2002         ('symbol', '0')
  1966         ('symbol', '0'))
  2003         define)
       
  2004       (range
  1967       (range
  2005         ('symbol', '0')
  1968         ('symbol', '0')
  2006         ('symbol', '3')
  1969         ('symbol', '3')))
  2007         follow)
       
  2008       define)
       
  2009     (range
  1970     (range
  2010       ('symbol', '2')
  1971       ('symbol', '2')
  2011       ('symbol', '1')
  1972       ('symbol', '1')))
  2012       any)
       
  2013     define)
       
  2014   * set:
  1973   * set:
  2015   <filteredset
  1974   <filteredset
  2016     <filteredset
  1975     <filteredset
  2017       <spanset- 0:4>,
  1976       <spanset- 0:4>,
  2018       <spanset+ 0:4>>,
  1977       <spanset+ 0:4>>,
  2037           ('symbol', '2')))))
  1996           ('symbol', '2')))))
  2038   * optimized:
  1997   * optimized:
  2039   (and
  1998   (and
  2040     (range
  1999     (range
  2041       ('symbol', '2')
  2000       ('symbol', '2')
  2042       ('symbol', '0')
  2001       ('symbol', '0'))
  2043       define)
       
  2044     (func
  2002     (func
  2045       ('symbol', '_list')
  2003       ('symbol', '_list')
  2046       ('string', '0\x001\x002')
  2004       ('string', '0\x001\x002')))
  2047       follow)
       
  2048     define)
       
  2049   * set:
  2005   * set:
  2050   <filteredset
  2006   <filteredset
  2051     <spanset- 0:3>,
  2007     <spanset- 0:3>,
  2052     <baseset [0, 1, 2]>>
  2008     <baseset [0, 1, 2]>>
  2053   2
  2009   2
  2070           ('symbol', '2')))))
  2026           ('symbol', '2')))))
  2071   * optimized:
  2027   * optimized:
  2072   (and
  2028   (and
  2073     (range
  2029     (range
  2074       ('symbol', '2')
  2030       ('symbol', '2')
  2075       ('symbol', '0')
  2031       ('symbol', '0'))
  2076       define)
       
  2077     (or
  2032     (or
  2078       (list
  2033       (list
  2079         (range
  2034         (range
  2080           ('symbol', '0')
  2035           ('symbol', '0')
  2081           ('symbol', '1')
  2036           ('symbol', '1'))
  2082           follow)
  2037         ('symbol', '2'))))
  2083         ('symbol', '2'))
       
  2084       follow)
       
  2085     define)
       
  2086   * set:
  2038   * set:
  2087   <filteredset
  2039   <filteredset
  2088     <spanset- 0:3>,
  2040     <spanset- 0:3>,
  2089     <addset
  2041     <addset
  2090       <spanset+ 0:2>,
  2042       <spanset+ 0:2>,
  2102       ('symbol', '0'))
  2054       ('symbol', '0'))
  2103     (func
  2055     (func
  2104       ('symbol', '_intlist')
  2056       ('symbol', '_intlist')
  2105       ('string', '0\x001\x002')))
  2057       ('string', '0\x001\x002')))
  2106   * optimized:
  2058   * optimized:
  2107   (and
  2059   (flipand
  2108     (func
  2060     (func
  2109       ('symbol', '_intlist')
  2061       ('symbol', '_intlist')
  2110       ('string', '0\x001\x002')
  2062       ('string', '0\x001\x002'))
  2111       follow)
       
  2112     (range
  2063     (range
  2113       ('symbol', '2')
  2064       ('symbol', '2')
  2114       ('symbol', '0')
  2065       ('symbol', '0')))
  2115       define)
       
  2116     define)
       
  2117   * set:
  2066   * set:
  2118   <filteredset
  2067   <filteredset
  2119     <spanset- 0:3>,
  2068     <spanset- 0:3>,
  2120     <baseset+ [0, 1, 2]>>
  2069     <baseset+ [0, 1, 2]>>
  2121   2
  2070   2
  2132       ('symbol', '0')))
  2081       ('symbol', '0')))
  2133   * optimized:
  2082   * optimized:
  2134   (and
  2083   (and
  2135     (func
  2084     (func
  2136       ('symbol', '_intlist')
  2085       ('symbol', '_intlist')
  2137       ('string', '0\x002\x001')
  2086       ('string', '0\x002\x001'))
  2138       define)
       
  2139     (range
  2087     (range
  2140       ('symbol', '2')
  2088       ('symbol', '2')
  2141       ('symbol', '0')
  2089       ('symbol', '0')))
  2142       follow)
       
  2143     define)
       
  2144   * set:
  2090   * set:
  2145   <filteredset
  2091   <filteredset
  2146     <baseset [0, 2, 1]>,
  2092     <baseset [0, 2, 1]>,
  2147     <spanset- 0:3>>
  2093     <spanset- 0:3>>
  2148   0
  2094   0
  2161       ('string', '*'))) (glob)
  2107       ('string', '*'))) (glob)
  2162   * optimized:
  2108   * optimized:
  2163   (and
  2109   (and
  2164     (range
  2110     (range
  2165       ('symbol', '2')
  2111       ('symbol', '2')
  2166       ('symbol', '0')
  2112       ('symbol', '0'))
  2167       define)
       
  2168     (func
  2113     (func
  2169       ('symbol', '_hexlist')
  2114       ('symbol', '_hexlist')
  2170       ('string', '*') (glob)
  2115       ('string', '*'))) (glob)
  2171       follow)
       
  2172     define)
       
  2173   * set:
  2116   * set:
  2174   <filteredset
  2117   <filteredset
  2175     <spanset- 0:3>,
  2118     <spanset- 0:3>,
  2176     <baseset [0, 1, 2]>>
  2119     <baseset [0, 1, 2]>>
  2177   2
  2120   2
  2185       ('string', '*')) (glob)
  2128       ('string', '*')) (glob)
  2186     (range
  2129     (range
  2187       ('symbol', '2')
  2130       ('symbol', '2')
  2188       ('symbol', '0')))
  2131       ('symbol', '0')))
  2189   * optimized:
  2132   * optimized:
  2190   (and
  2133   (flipand
  2191     (range
  2134     (range
  2192       ('symbol', '2')
  2135       ('symbol', '2')
  2193       ('symbol', '0')
  2136       ('symbol', '0'))
  2194       follow)
       
  2195     (func
  2137     (func
  2196       ('symbol', '_hexlist')
  2138       ('symbol', '_hexlist')
  2197       ('string', '*') (glob)
  2139       ('string', '*'))) (glob)
  2198       define)
       
  2199     define)
       
  2200   * set:
  2140   * set:
  2201   <baseset [0, 2, 1]>
  2141   <baseset [0, 2, 1]>
  2202   0
  2142   0
  2203   2
  2143   2
  2204   1
  2144   1
  2209   $ try -p optimized '2:0 & not (0 + 1)'
  2149   $ try -p optimized '2:0 & not (0 + 1)'
  2210   * optimized:
  2150   * optimized:
  2211   (difference
  2151   (difference
  2212     (range
  2152     (range
  2213       ('symbol', '2')
  2153       ('symbol', '2')
  2214       ('symbol', '0')
  2154       ('symbol', '0'))
  2215       define)
       
  2216     (func
  2155     (func
  2217       ('symbol', '_list')
  2156       ('symbol', '_list')
  2218       ('string', '0\x001')
  2157       ('string', '0\x001')))
  2219       any)
       
  2220     define)
       
  2221   * set:
  2158   * set:
  2222   <filteredset
  2159   <filteredset
  2223     <spanset- 0:3>,
  2160     <spanset- 0:3>,
  2224     <not
  2161     <not
  2225       <baseset [0, 1]>>>
  2162       <baseset [0, 1]>>>
  2228   $ try -p optimized '2:0 & not (0:2 & (0 + 1))'
  2165   $ try -p optimized '2:0 & not (0:2 & (0 + 1))'
  2229   * optimized:
  2166   * optimized:
  2230   (difference
  2167   (difference
  2231     (range
  2168     (range
  2232       ('symbol', '2')
  2169       ('symbol', '2')
  2233       ('symbol', '0')
  2170       ('symbol', '0'))
  2234       define)
       
  2235     (and
  2171     (and
  2236       (range
  2172       (range
  2237         ('symbol', '0')
  2173         ('symbol', '0')
  2238         ('symbol', '2')
  2174         ('symbol', '2'))
  2239         any)
       
  2240       (func
  2175       (func
  2241         ('symbol', '_list')
  2176         ('symbol', '_list')
  2242         ('string', '0\x001')
  2177         ('string', '0\x001'))))
  2243         any)
       
  2244       any)
       
  2245     define)
       
  2246   * set:
  2178   * set:
  2247   <filteredset
  2179   <filteredset
  2248     <spanset- 0:3>,
  2180     <spanset- 0:3>,
  2249     <not
  2181     <not
  2250       <baseset [0, 1]>>>
  2182       <baseset [0, 1]>>>
  2257   * optimized:
  2189   * optimized:
  2258   (func
  2190   (func
  2259     ('symbol', 'present')
  2191     ('symbol', 'present')
  2260     (func
  2192     (func
  2261       ('symbol', '_list')
  2193       ('symbol', '_list')
  2262       ('string', '2\x000\x001')
  2194       ('string', '2\x000\x001')))
  2263       define)
       
  2264     define)
       
  2265   * set:
  2195   * set:
  2266   <baseset [2, 0, 1]>
  2196   <baseset [2, 0, 1]>
  2267   2
  2197   2
  2268   0
  2198   0
  2269   1
  2199   1
  2282           ('symbol', '2')))))
  2212           ('symbol', '2')))))
  2283   * optimized:
  2213   * optimized:
  2284   (and
  2214   (and
  2285     (range
  2215     (range
  2286       ('symbol', '2')
  2216       ('symbol', '2')
  2287       ('symbol', '0')
  2217       ('symbol', '0'))
  2288       define)
       
  2289     (func
  2218     (func
  2290       ('symbol', 'present')
  2219       ('symbol', 'present')
  2291       (func
  2220       (func
  2292         ('symbol', '_list')
  2221         ('symbol', '_list')
  2293         ('string', '0\x001\x002')
  2222         ('string', '0\x001\x002'))))
  2294         follow)
       
  2295       follow)
       
  2296     define)
       
  2297   * set:
  2223   * set:
  2298   <filteredset
  2224   <filteredset
  2299     <spanset- 0:3>,
  2225     <spanset- 0:3>,
  2300     <baseset [0, 1, 2]>>
  2226     <baseset [0, 1, 2]>>
  2301   2
  2227   2
  2316         None)))
  2242         None)))
  2317   * optimized:
  2243   * optimized:
  2318   (and
  2244   (and
  2319     (range
  2245     (range
  2320       ('symbol', '0')
  2246       ('symbol', '0')
  2321       ('symbol', '2')
  2247       ('symbol', '2'))
  2322       define)
       
  2323     (func
  2248     (func
  2324       ('symbol', 'reverse')
  2249       ('symbol', 'reverse')
  2325       (func
  2250       (func
  2326         ('symbol', 'all')
  2251         ('symbol', 'all')
  2327         None
  2252         None)))
  2328         define)
       
  2329       follow)
       
  2330     define)
       
  2331   * set:
  2253   * set:
  2332   <filteredset
  2254   <filteredset
  2333     <spanset+ 0:3>,
  2255     <spanset+ 0:3>,
  2334     <spanset+ 0:10>>
  2256     <spanset+ 0:10>>
  2335   0
  2257   0
  2353           ('symbol', 'rev')))))
  2275           ('symbol', 'rev')))))
  2354   * optimized:
  2276   * optimized:
  2355   (and
  2277   (and
  2356     (range
  2278     (range
  2357       ('symbol', '0')
  2279       ('symbol', '0')
  2358       ('symbol', '2')
  2280       ('symbol', '2'))
  2359       define)
       
  2360     (func
  2281     (func
  2361       ('symbol', 'sort')
  2282       ('symbol', 'sort')
  2362       (list
  2283       (list
  2363         (func
  2284         (func
  2364           ('symbol', 'all')
  2285           ('symbol', 'all')
  2365           None
  2286           None)
  2366           define)
  2287         ('string', '-rev'))))
  2367         ('string', '-rev'))
       
  2368       follow)
       
  2369     define)
       
  2370   * set:
  2288   * set:
  2371   <filteredset
  2289   <filteredset
  2372     <spanset+ 0:3>,
  2290     <spanset+ 0:3>,
  2373     <spanset+ 0:10>>
  2291     <spanset+ 0:10>>
  2374   0
  2292   0
  2400           ('symbol', '2')))))
  2318           ('symbol', '2')))))
  2401   * optimized:
  2319   * optimized:
  2402   (and
  2320   (and
  2403     (range
  2321     (range
  2404       ('symbol', '2')
  2322       ('symbol', '2')
  2405       ('symbol', '0')
  2323       ('symbol', '0'))
  2406       define)
       
  2407     (func
  2324     (func
  2408       ('symbol', 'first')
  2325       ('symbol', 'first')
  2409       (func
  2326       (func
  2410         ('symbol', '_list')
  2327         ('symbol', '_list')
  2411         ('string', '1\x000\x002')
  2328         ('string', '1\x000\x002'))))
  2412         define)
       
  2413       follow)
       
  2414     define)
       
  2415   * set:
  2329   * set:
  2416   <filteredset
  2330   <filteredset
  2417     <baseset [1]>,
  2331     <baseset [1]>,
  2418     <spanset- 0:3>>
  2332     <spanset- 0:3>>
  2419   1
  2333   1
  2433             ('symbol', '1'))))))
  2347             ('symbol', '1'))))))
  2434   * optimized:
  2348   * optimized:
  2435   (difference
  2349   (difference
  2436     (range
  2350     (range
  2437       ('symbol', '2')
  2351       ('symbol', '2')
  2438       ('symbol', '0')
  2352       ('symbol', '0'))
  2439       define)
       
  2440     (func
  2353     (func
  2441       ('symbol', 'last')
  2354       ('symbol', 'last')
  2442       (func
  2355       (func
  2443         ('symbol', '_list')
  2356         ('symbol', '_list')
  2444         ('string', '0\x002\x001')
  2357         ('string', '0\x002\x001'))))
  2445         define)
       
  2446       any)
       
  2447     define)
       
  2448   * set:
  2358   * set:
  2449   <filteredset
  2359   <filteredset
  2450     <spanset- 0:3>,
  2360     <spanset- 0:3>,
  2451     <not
  2361     <not
  2452       <baseset [1]>>>
  2362       <baseset [1]>>>
  2475             ('symbol', '1'))))))
  2385             ('symbol', '1'))))))
  2476   * optimized:
  2386   * optimized:
  2477   (and
  2387   (and
  2478     (range
  2388     (range
  2479       ('symbol', '2')
  2389       ('symbol', '2')
  2480       ('symbol', '0')
  2390       ('symbol', '0'))
  2481       define)
       
  2482     (range
  2391     (range
  2483       (func
  2392       (func
  2484         ('symbol', '_list')
  2393         ('symbol', '_list')
  2485         ('string', '1\x000\x002')
  2394         ('string', '1\x000\x002'))
  2486         define)
       
  2487       (func
  2395       (func
  2488         ('symbol', '_list')
  2396         ('symbol', '_list')
  2489         ('string', '0\x002\x001')
  2397         ('string', '0\x002\x001'))))
  2490         define)
       
  2491       follow)
       
  2492     define)
       
  2493   * set:
  2398   * set:
  2494   <filteredset
  2399   <filteredset
  2495     <spanset- 0:3>,
  2400     <spanset- 0:3>,
  2496     <baseset [1]>>
  2401     <baseset [1]>>
  2497   1
  2402   1
  2498 
  2403 
  2499  'A & B' can be rewritten as 'B & A' by weight, but that's fine as long as
  2404  'A & B' can be rewritten as 'flipand(B, A)' by weight.
  2500  the ordering rule is determined before the rewrite; in this example,
       
  2501  'B' follows the order of the initial set, which is the same order as 'A'
       
  2502  since 'A' also follows the order:
       
  2503 
  2405 
  2504   $ try --optimize 'contains("glob:*") & (2 + 0 + 1)'
  2406   $ try --optimize 'contains("glob:*") & (2 + 0 + 1)'
  2505   (and
  2407   (and
  2506     (func
  2408     (func
  2507       ('symbol', 'contains')
  2409       ('symbol', 'contains')
  2511         (list
  2413         (list
  2512           ('symbol', '2')
  2414           ('symbol', '2')
  2513           ('symbol', '0')
  2415           ('symbol', '0')
  2514           ('symbol', '1')))))
  2416           ('symbol', '1')))))
  2515   * optimized:
  2417   * optimized:
  2516   (and
  2418   (flipand
  2517     (func
  2419     (func
  2518       ('symbol', '_list')
  2420       ('symbol', '_list')
  2519       ('string', '2\x000\x001')
  2421       ('string', '2\x000\x001'))
  2520       follow)
       
  2521     (func
  2422     (func
  2522       ('symbol', 'contains')
  2423       ('symbol', 'contains')
  2523       ('string', 'glob:*')
  2424       ('string', 'glob:*')))
  2524       define)
       
  2525     define)
       
  2526   * set:
  2425   * set:
  2527   <filteredset
  2426   <filteredset
  2528     <baseset+ [0, 1, 2]>,
  2427     <baseset+ [0, 1, 2]>,
  2529     <contains 'glob:*'>>
  2428     <contains 'glob:*'>>
  2530   0
  2429   0
  2546         (list
  2445         (list
  2547           ('symbol', '0')
  2446           ('symbol', '0')
  2548           ('symbol', '2')
  2447           ('symbol', '2')
  2549           ('symbol', '1')))))
  2448           ('symbol', '1')))))
  2550   * optimized:
  2449   * optimized:
  2551   (and
  2450   (flipand
  2552     (func
  2451     (func
  2553       ('symbol', '_list')
  2452       ('symbol', '_list')
  2554       ('string', '0\x002\x001')
  2453       ('string', '0\x002\x001'))
  2555       follow)
       
  2556     (func
  2454     (func
  2557       ('symbol', 'reverse')
  2455       ('symbol', 'reverse')
  2558       (func
  2456       (func
  2559         ('symbol', 'contains')
  2457         ('symbol', 'contains')
  2560         ('string', 'glob:*')
  2458         ('string', 'glob:*'))))
  2561         define)
       
  2562       define)
       
  2563     define)
       
  2564   * set:
  2459   * set:
  2565   <filteredset
  2460   <filteredset
  2566     <baseset- [0, 1, 2]>,
  2461     <baseset- [0, 1, 2]>,
  2567     <contains 'glob:*'>>
  2462     <contains 'glob:*'>>
  2568   2
  2463   2
  2951       ('symbol', 'tip')
  2846       ('symbol', 'tip')
  2952       ('symbol', 'null')))
  2847       ('symbol', 'null')))
  2953   * optimized:
  2848   * optimized:
  2954   (func
  2849   (func
  2955     ('symbol', '_list')
  2850     ('symbol', '_list')
  2956     ('string', '0\x001\x002\x00-2\x00tip\x00null')
  2851     ('string', '0\x001\x002\x00-2\x00tip\x00null'))
  2957     define)
       
  2958   * set:
  2852   * set:
  2959   <baseset [0, 1, 2, 8, 9, -1]>
  2853   <baseset [0, 1, 2, 8, 9, -1]>
  2960   0
  2854   0
  2961   1
  2855   1
  2962   2
  2856   2
  2975   * optimized:
  2869   * optimized:
  2976   (or
  2870   (or
  2977     (list
  2871     (list
  2978       (func
  2872       (func
  2979         ('symbol', '_list')
  2873         ('symbol', '_list')
  2980         ('string', '0\x001')
  2874         ('string', '0\x001'))
  2981         define)
       
  2982       (range
  2875       (range
  2983         ('symbol', '2')
  2876         ('symbol', '2')
  2984         ('symbol', '3')
  2877         ('symbol', '3'))))
  2985         define))
       
  2986     define)
       
  2987   * set:
  2878   * set:
  2988   <addset
  2879   <addset
  2989     <baseset [0, 1]>,
  2880     <baseset [0, 1]>,
  2990     <spanset+ 2:4>>
  2881     <spanset+ 2:4>>
  2991   0
  2882   0
  3008   * optimized:
  2899   * optimized:
  3009   (or
  2900   (or
  3010     (list
  2901     (list
  3011       (range
  2902       (range
  3012         ('symbol', '0')
  2903         ('symbol', '0')
  3013         ('symbol', '1')
  2904         ('symbol', '1'))
  3014         define)
       
  3015       ('symbol', '2')
  2905       ('symbol', '2')
  3016       (range
  2906       (range
  3017         ('symbol', '3')
  2907         ('symbol', '3')
  3018         ('symbol', '4')
  2908         ('symbol', '4'))
  3019         define)
       
  3020       (func
  2909       (func
  3021         ('symbol', '_list')
  2910         ('symbol', '_list')
  3022         ('string', '5\x006')
  2911         ('string', '5\x006'))))
  3023         define))
       
  3024     define)
       
  3025   * set:
  2912   * set:
  3026   <addset
  2913   <addset
  3027     <addset
  2914     <addset
  3028       <spanset+ 0:2>,
  2915       <spanset+ 0:2>,
  3029       <baseset [2]>>,
  2916       <baseset [2]>>,
  3046     (list
  2933     (list
  3047       ('symbol', '0')
  2934       ('symbol', '0')
  3048       ('symbol', '1')
  2935       ('symbol', '1')
  3049       ('symbol', '2')
  2936       ('symbol', '2')
  3050       ('symbol', '3')
  2937       ('symbol', '3')
  3051       ('symbol', '4'))
  2938       ('symbol', '4')))
  3052     define)
       
  3053   * set:
  2939   * set:
  3054   <addset
  2940   <addset
  3055     <addset
  2941     <addset
  3056       <baseset [0]>,
  2942       <baseset [0]>,
  3057       <baseset [1]>>,
  2943       <baseset [1]>>,
  3167         None)))
  3053         None)))
  3168   * optimized:
  3054   * optimized:
  3169   (or
  3055   (or
  3170     (list
  3056     (list
  3171       ('symbol', '0')
  3057       ('symbol', '0')
  3172       None)
  3058       None))
  3173     define)
       
  3174   hg: parse error: missing argument
  3059   hg: parse error: missing argument
  3175   [255]
  3060   [255]
  3176 
  3061 
  3177 test that chained `or` operations never eat up stack (issue4624)
  3062 test that chained `or` operations never eat up stack (issue4624)
  3178 (uses `0:1` instead of `0` to avoid future optimization of trivial revisions)
  3063 (uses `0:1` instead of `0` to avoid future optimization of trivial revisions)
  3198   * optimized:
  3083   * optimized:
  3199   (func
  3084   (func
  3200     ('symbol', 'only')
  3085     ('symbol', 'only')
  3201     (list
  3086     (list
  3202       ('symbol', '3')
  3087       ('symbol', '3')
  3203       ('symbol', '1'))
  3088       ('symbol', '1')))
  3204     define)
       
  3205   * set:
  3089   * set:
  3206   <baseset+ [3]>
  3090   <baseset+ [3]>
  3207   3
  3091   3
  3208   $ try --optimize 'ancestors(1) - ancestors(3)'
  3092   $ try --optimize 'ancestors(1) - ancestors(3)'
  3209   (minus
  3093   (minus
  3216   * optimized:
  3100   * optimized:
  3217   (func
  3101   (func
  3218     ('symbol', 'only')
  3102     ('symbol', 'only')
  3219     (list
  3103     (list
  3220       ('symbol', '1')
  3104       ('symbol', '1')
  3221       ('symbol', '3'))
  3105       ('symbol', '3')))
  3222     define)
       
  3223   * set:
  3106   * set:
  3224   <baseset+ []>
  3107   <baseset+ []>
  3225   $ try --optimize 'not ::2 and ::6'
  3108   $ try --optimize 'not ::2 and ::6'
  3226   (and
  3109   (and
  3227     (not
  3110     (not
  3232   * optimized:
  3115   * optimized:
  3233   (func
  3116   (func
  3234     ('symbol', 'only')
  3117     ('symbol', 'only')
  3235     (list
  3118     (list
  3236       ('symbol', '6')
  3119       ('symbol', '6')
  3237       ('symbol', '2'))
  3120       ('symbol', '2')))
  3238     define)
       
  3239   * set:
  3121   * set:
  3240   <baseset+ [3, 4, 5, 6]>
  3122   <baseset+ [3, 4, 5, 6]>
  3241   3
  3123   3
  3242   4
  3124   4
  3243   5
  3125   5
  3254   * optimized:
  3136   * optimized:
  3255   (func
  3137   (func
  3256     ('symbol', 'only')
  3138     ('symbol', 'only')
  3257     (list
  3139     (list
  3258       ('symbol', '6')
  3140       ('symbol', '6')
  3259       ('symbol', '4'))
  3141       ('symbol', '4')))
  3260     define)
       
  3261   * set:
  3142   * set:
  3262   <baseset+ [3, 5, 6]>
  3143   <baseset+ [3, 5, 6]>
  3263   3
  3144   3
  3264   5
  3145   5
  3265   6
  3146   6
  3271     (dagrangepre
  3152     (dagrangepre
  3272       ('symbol', '1'))
  3153       ('symbol', '1'))
  3273     (group
  3154     (group
  3274       None))
  3155       None))
  3275   * optimized:
  3156   * optimized:
  3276   (and
  3157   (flipand
  3277     None
  3158     None
  3278     (func
  3159     (func
  3279       ('symbol', 'ancestors')
  3160       ('symbol', 'ancestors')
  3280       ('symbol', '1')
  3161       ('symbol', '1')))
  3281       define)
       
  3282     define)
       
  3283   hg: parse error: missing argument
  3162   hg: parse error: missing argument
  3284   [255]
  3163   [255]
  3285 
  3164 
  3286 optimization to only() works only if ancestors() takes only one argument
  3165 optimization to only() works only if ancestors() takes only one argument
  3287 
  3166 
  3288   $ hg debugrevspec -p optimized 'ancestors(6) - ancestors(4, 1)'
  3167   $ hg debugrevspec -p optimized 'ancestors(6) - ancestors(4, 1)'
  3289   * optimized:
  3168   * optimized:
  3290   (difference
  3169   (difference
  3291     (func
  3170     (func
  3292       ('symbol', 'ancestors')
  3171       ('symbol', 'ancestors')
  3293       ('symbol', '6')
  3172       ('symbol', '6'))
  3294       define)
       
  3295     (func
  3173     (func
  3296       ('symbol', 'ancestors')
  3174       ('symbol', 'ancestors')
  3297       (list
  3175       (list
  3298         ('symbol', '4')
  3176         ('symbol', '4')
  3299         ('symbol', '1'))
  3177         ('symbol', '1'))))
  3300       any)
       
  3301     define)
       
  3302   0
  3178   0
  3303   1
  3179   1
  3304   3
  3180   3
  3305   5
  3181   5
  3306   6
  3182   6
  3309   (difference
  3185   (difference
  3310     (func
  3186     (func
  3311       ('symbol', 'ancestors')
  3187       ('symbol', 'ancestors')
  3312       (list
  3188       (list
  3313         ('symbol', '6')
  3189         ('symbol', '6')
  3314         ('symbol', '1'))
  3190         ('symbol', '1')))
  3315       define)
       
  3316     (func
  3191     (func
  3317       ('symbol', 'ancestors')
  3192       ('symbol', 'ancestors')
  3318       ('symbol', '4')
  3193       ('symbol', '4')))
  3319       any)
       
  3320     define)
       
  3321   5
  3194   5
  3322   6
  3195   6
  3323 
  3196 
  3324 optimization disabled if keyword arguments passed (because we're too lazy
  3197 optimization disabled if keyword arguments passed (because we're too lazy
  3325 to support it)
  3198 to support it)
  3329   (difference
  3202   (difference
  3330     (func
  3203     (func
  3331       ('symbol', 'ancestors')
  3204       ('symbol', 'ancestors')
  3332       (keyvalue
  3205       (keyvalue
  3333         ('symbol', 'set')
  3206         ('symbol', 'set')
  3334         ('symbol', '6'))
  3207         ('symbol', '6')))
  3335       define)
       
  3336     (func
  3208     (func
  3337       ('symbol', 'ancestors')
  3209       ('symbol', 'ancestors')
  3338       (keyvalue
  3210       (keyvalue
  3339         ('symbol', 'set')
  3211         ('symbol', 'set')
  3340         ('symbol', '4'))
  3212         ('symbol', '4'))))
  3341       any)
       
  3342     define)
       
  3343   3
  3213   3
  3344   5
  3214   5
  3345   6
  3215   6
  3346 
  3216 
  3347 invalid function call should not be optimized to only()
  3217 invalid function call should not be optimized to only()