
    6h t              
         S SK Jr  S SKrSSKJr  SSKJr  SSKJrJ	r	J
r
JrJr  SSKJr  0 SS	_S
S_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_S S_S!S"_S#S$_S%S$_S$S&S'S(S(S)S*S(S+.Er1 S,kr0 rS-S.1r\" \
R(                  " S/5      5      r\" \
R(                  " \
R,                  " \R.                  5      \
R,                  " \R0                  5      -   S0-   5      5      \" \" \
R4                  \" S1S25      5      5      -  r\\" \
R(                  " S35      5      -  rS]S4 jr\" 5       r S5 r!S6 r"\ 4S7 jr#S8 r$S9 r%S: r&\ \ 4S; jr'S< r(S= r)0 r*S> r+S? r,S@ r-SA r.SB r/SC r0SD r1SE r2SF r3\SG1-  r4S^SH jr5 " SI SJ\	Rl                  5      r7S_SK jr8SL r9S_SM jr:SN r;SO r<SP r=SQ r>SR r?\=\?SS.r@ST rASU rBSV rCSW rDSX rESY rF\R                  R                  SZ5      rIS[ rJS\ rKg)`    )annotationsN   )_hex)errorparserpycompatsmartsetutil)
stringutil   ()   N)   groupr      ))   funcr   r   N   [)r   NN)	   subscriptr      ]N   #)r   NN)   relationr   N   ##)   NN)   _concatr   N   ~)   NN)   ancestorr   N   ^)r   NN)   parentr   
   parentpost   -)   N)   negate   )   minusr"   N   ::)      dagrangeall)   dagrangeprer'   )   dagranger'      dagrangepost   ..   :)      rangeall)   rangeprer.   )   ranger.   	   rangepost   not)
   N)r3   r4   NN   !   and)r"   NN)r6   r"   N   &   %)r"   NN)   onlyr"      onlypost   or)   NN)r;   r<   N   |)   NN)   keyvaluer>   N)   NN)   listr@   N)r   NNNN)r      symbolNNN)r      stringNNN)   +   =   ,r   r   rB   rC      end>   r;   r6   r3      "   's   ()[]#:=,-|&+!~^%s   ._@      s   -/c              #    ^#    [        U [        5      (       d  [        R                  " SU -  5      e[        R
                  " U 5      n Uc  [        nUc  [        nU (       a  T(       a  U R                  SS5      n[        U4S jU 5       5      (       a`  US   (       a
  SUS   S4v   [        U5      S:  a,  [        US   5      nSSU4v   US   (       a  SUS   US-   4v   SS[        U 5      4v   gS[        U 5      pvXg:  Ga2  X   nUR                  5       (       a  GO
US:X  a  XUS	-    S
:X  a  S
SU4v   US-  nGOUS:X  a  XUS	-    S:X  a  SSU4v   US-  nGOUS:X  a  XUS	-    S:X  a  SSU4v   US-  nGOU[        ;   a	  USU4v   GOU[        ;   d  US:X  a  XUS	-    S;   a  US:X  a  US-  nX   nS n	O[        R                  n	US-  nUnXg:  a3  X   n
U
S:X  a  US	-  nM  X:X  a  SU	" XU 5      U4v   GO)US-  nXg:  a  M3  [        R                   " [#        S5      U5      eX;   a  UnUS-  nXg:  a-  X   n
X;  a  O#U
S:X  a  XS-
     S:X  a  US-  nOUS-  nXg:  a  M-  XU nU[$        ;   a  USU4v   OSU;   at  T(       a  T" U5      (       a  SX4v   O_UR                  S5      nUSS  H*  nU(       a  SX4v   U[        U5      -  nSSU4v   US-  nM,     US   (       a
  SUS   U4v   OSX4v   US-  nO#[        R                   " [#        S5      U -  U5      eUS-  nXg:  a  GM2  SSU4v   g7f)a  
Parse a revset statement into a stream of tokens

``syminitletters`` is the set of valid characters for the initial
letter of symbols.

By default, character ``c`` is recognized as valid for initial
letter of symbols, if ``c.isalnum() or c in '._@' or ord(c) > 127``.

``symletters`` is the set of valid characters for non-initial
letters of symbols.

By default, character ``c`` is recognized as valid for non-initial
letters of symbols, if ``c.isalnum() or c in '-._/@' or ord(c) > 127``.

Check that @ is a valid unquoted token character (issue3686):
>>> list(tokenize(b"@::"))
[('symbol', '@', 0), ('::', None, 1), ('end', None, 3)]

s&   revset statement must be bytes, got %rNr-   r   c              3  D   >#    U  H  o(       d  M  T" U5      v   M     g 7fN ).0symlookups     6/usr/lib/python3/dist-packages/mercurial/revsetlang.py	<genexpr>tokenize.<locals>.<genexpr>w   s     3ess{vc{{es   
  r   rB   rG   r@   r&      .r,   r   r      r)s   r's   r"c                    U $ rN   rO   xs    rS   <lambda>tokenize.<locals>.<lambda>   s    1       \rC   s   unterminated stringr!   s   syntax error in revset '%s')
isinstancebytesr   ProgrammingErrorr
   bytestr_syminitletters_symletterssplitalllenisspace_simpleopletters_quotelettersr	   unescapestr
ParseErrorr   keywords)programrR   syminitletters
symletterspartssposlcdecodedrQ   ps    `           rS   tokenizerz   T   s    * gu%%$$5?
 	
 w'G( 
6 dA&3e333Qx %(A..5zA~aMT1o%8$eAhA664W..G
'L99;;I'a0E9$$$1HCI'a0E9$$$1HCI'a0E9$$$1HC""dC. DycAg&.8DyqL$++1HCA'L:1HC6$fWs^&<a@@q ' &&q)?'@!DD A1HC'L&I''"2d":1HCq ' C.ChD!n$fSkk$c--  IIdOE"3BZ#,a"33SV#T1o-Q ( Ry(%)Q77 #))1HC""01G;S  	qk 'l 4
s   H	M AM ,C	M 8M c                j    U (       a  U S   S:X  a  U S   $ [         R                  " [        S5      5      e)Nr   rB   r   s   not a symbol)r   rm   r   rY   s    rS   	getsymbolr|      s/    QqTYt


1_-
..r]   c                j    U (       a  U S   S:X  d	  U S   S:X  a  U S   $ [         R                  " U5      e)Nr   rC   rB   r   r   rm   )rZ   errs     rS   	getstringr      s5    adi1Q49#4t


3
r]   c                    U (       d  U[         La  U$  [        [        X5      5      $ ! [         a    [        R
                  " U5      ef = frN   )_notsetintr   
ValueErrorr   rm   )rZ   r   defaults      rS   
getintegerr      sF    '$9Q$%% $s##$s	   ( !A	c                v    [         R                  " [        U 5      5      nUb  U$ [        R                  " U5      erN   )r   	parseboolr|   r   rm   )rZ   r   values      rS   
getbooleanr      s2      1.E


3
r]   c                H    U (       d  / $ U S   S:X  a  [        U SS  5      $ U /$ )Nr   rA   r   )listrY   s    rS   getlistr      s,    	twAabE{3Jr]   c                    U (       d  [         R                  " U5      eU S   nUS:X  a
  U S   U S   4$ US:X  a  S U S   4$ US:X  a  U S   S 4$ US:X  a  g[         R                  " U5      e)	Nr   r1   r   r@   r0   r2   r/   NNr~   )rZ   r   ops      rS   getranger     s    s##	
1B	X~tQqTz	{	QqTz	|	tTz	{	


3
r]   c                    U (       a   U S   S:X  d	  U S   S:X  a  [        X5      nXU4$ [        X5      u  pg[        XbU5      [        XrU5      4$ )zGet [first, last] integer range (both inclusive) from a parsed tree

If any of the sides omitted, and if no default provided, ParseError will
be raised.
r   rC   rB   )r   r   )rZ   err1err2deffirstdeflastnabs           rS   getintranger     sS     	adi1Q49#4qtADAax(*Qg*FFFr]   c                    [        U 5      n[        U5      U:  d  US:  a%  [        U5      U:  a  [        R                  " U5      eU$ )Nr   )r   rh   r   rm   )rZ   minmaxr   ru   s        rS   getargsr   !  s<    
A
1v|qSVc\s##Hr]   c                l    [         R                  " [        U 5      U[         R                  " U5      SSS9$ )Nr?   rB   )keyvaluenodekeynode)r	   buildargsdictr   splitargspec)rZ   funcnamekeyss      rS   getargsdictr   (  s3    
D!  r]   c                ^    [         R                  U 5      nUc  [        U 5      =[         U '   nU$ rN   )
_treecachegetparse)spectrees     rS   _cachedtreer   6  s-    >>$D|"'+-
44Kr]   c                H    [        U 5      n[        R                  " US/UQ76 $ )zCreate raw parsed tree from a template revset statement

>>> _build(b'f(_) and _', (b'string', b'1'), (b'symbol', b'2'))
('and', ('func', ('symbol', 'f'), ('string', '1')), ('symbol', '2'))
rB      _)r   r	   	buildtree)tmplspecreplstemplates      rS   _buildr   >  s'     8$HH&7@%@@r]   c                L    [        U 5      n[        R                  " X!SSS15      $ )zTest if a tree matches the given pattern statement; return the matches

>>> _match(b'f(_)', parse(b'f()'))
>>> _match(b'f(_)', parse(b'f(1)'))
[('func', ('symbol', 'f'), ('symbol', '1')), ('symbol', '1')]
>>> _match(b'f(_)', parse(b'f(1, 2)'))
r   r?   rA   )r   r	   	matchtree)patspecr   patterns      rS   _matchr   H  s.     '"G(;*@ r]   c                    [        SSX45      $ )Ns!   ancestors(_) and not ancestors(_)r6   )r   )revsbasess     rS   
_matchonlyr   V  s    68MNNr]   c                   [        U [        5      (       d  U $ U S   nUS:X  ax  SU S   4nU S   S   S:X  a  [        SX S   S   45      $ U S   S   S:X  a  [        S	U45      $ U S   S   S
:X  a  [        SX S   S   45      $ U S   S   S:X  a  [        SU45      $ OIUS:X  a  U[        SU SS -   5      4$ US:X  a*  U S   S   S:X  a  [        SU S   S   U S   S   U S   45      $ U4[        S U SS  5       5      -   $ )znRewrite raw parsed tree to resolve ambiguous syntax which cannot be
handled well by our simple top-down parserr   r   r    r   r@   r)   r*   r(   r+   r0   r1   r/   r2   r;   rA   Nr   r      relsubscriptc              3  8   #    U  H  n[        U5      v   M     g 7frN   )_fixopsrP   ys     rS   rT   _fixops.<locals>.<genexpr>u  s     3UU   )r`   tupler   )rZ   r   posts      rS   r   r   Z  sL    a	
1B	Y qt$Q47n$KtAw788qT!W&OT233qT!W#HdaDG455qT!W#L$/00 $	u GJ12./00	|	!Q; 61a!A$q'1Q4@AA553QqrU3333r]   c                   U c  U $ U S   nUS:X  a  [        [        S/U SS  Q76 5      $ US:X  a  [        [        S/U SS  Q76 5      $ US:X  a  [        [        SU S   5      5      $ US	:X  a  [        R                  " [	        S
5      5      eUS:X  a  [        [        SU S   5      5      $ US:X  a  [        [        SU S   5      5      $ US:X  a(  [        U S   [	        S5      5      n[        SSU-   45      $ US;   a  U $ US:X  a  US 4$ US;   a  U[        U S   5      4$ US:X  a  [        U S   5      $ US;   a   [        U S   5      n[        U S   5      nXU4$ US:X  a.  [        U S   5      n[        U S   5      n[        U S   5      nXXE4$ US:X  a  U4[        S U SS   5       5      -   $ US:X  a  XS   [        U S   5      4$ US:X  a  XS   [        U S   5      4$ [        SU-  5      e) Nr   r%   s   _ and not _r   r9   
   only(_, _)r:   s   only(_)r(   s   can't use '::' in this contextr)   s   ancestors(_)r+   s   descendants(_)r#   s   can't negate thatrC   r!   rC   rB      smartset   nodesetr/   >   r;   r3   r0   r2   r    r   >   r6   r1   r   r   r*   r   r   r@   r   r>   rA   c              3  8   #    U  H  n[        U5      v   M     g 7frN   _analyzer   s     rS   rT   _analyze.<locals>.<genexpr>  s     8%QXa[[%r   r?   r      invalid operator %r)r   r   r   rm   r   r   r   r   )rZ   r   rs   tatbtcs         rS   r   r   x  s5   y	
1B	X~~6!"677	w}5qu566	{	z1Q4011	~	q!BCDD	~	!566		0!A$788	yadA234D1H-..	>	>	{	Dz	H	HHQqTN##	x!~	  
 ad^ad^|		ad^ad^ad^	wuu8!AB%8888	{	aD(1Q4.))	waD(1Q4.))
+b0
11r]   c                    [        U 5      $ )zTransform raw parsed tree to evaluatable tree which can be fed to
optimize() or getset()

All pseudo operations should be mapped to real operations or functions
defined in methods or symbols table respectively.
r   rY   s    rS   analyzer     s     A;r]   c                  ^^^ U c  SU 4$ U S   nUS;   a  SU 4$ US:X  a  [        U S   5      u  p#[        U S   5      u  pE[        X$5      n[        SSX545      nU(       a'  [        US   5      S;   a  U[	        S	US   US   5      4$ [        X55      =(       d    [        XS5      nU(       a  U[	        S
/USS  Q76 4$ [        SU5      nU(       a	  USX7S   44$ X$:  a  SnXaX544$ US:X  a  / / / smmmUUU4S jn[        U S   5       Hb  n	[        U	5      u  pjU
b&  U
S   S:X  d	  U
S   S:X  a  TR                  Xj45        M9  U" 5         TR                  U5        TR                  U
5        Md     U" 5         [        T5      S:X  a
  TS   TS   4$ [        T5      US[        T5      -   44$ US:X  aK  [        SU S   5      (       a  [        [	        S5      5      nUS   US   4$ [        U S   5      nUS   XS   44$ US:X  a  SU 4$ US;   a  [        U S   5      nUS   XS   44$ US;   a(  [        U S   5      u  p#[        U S   5      u  pEX$-   XU44$ US;   a  [        U S   5      u  pjXaXS   44$ US:X  a  [        U S   5      u  pjXaXS   U S   44$ US:X  a&  [        S U SS   5       6 u  mm[        T5      U4T-   4$ US:X  a  [        U S   5      u  pjXaU S   U
44$ US:X  au  [        U S   5      n[        U S   5      u  p#[        [        R                  U5      S S5      n[        S!U5      nUS":X  a  U(       a  Xb-   [	        S#US   5      4$ Xb-   XS   U44$ [!        S$U-  5      e)%Nr   r   g      ?r6   r   r@   s   _() & ancestors(_)>      draft   secret
   _notpublics   _phaseandancestors(_, _)r   s   not _s
   differences	   andsmallyr;   c                    > T(       d  g [        T5      S:X  a  TS   u  pO3SR                  S T 5       5      n[        SSU45      n[        U5      u  pTR	                  U 5        TR	                  U5        TS S 2	 g )Nr   r       c              3  0   #    U  H  u  pUS    v   M     g7f)r   NrO   )rP   wts      rS   rT   -_optimize.<locals>.flushss.<locals>.<genexpr>  s     3qts   s   _list(_)rC   )rh   joinr   	_optimizeappend)r   r   rs   r   sstswss       rS   flushss_optimize.<locals>.flushss  sm    2w!|!u1JJ333;A7 |IIaLIIaL1r]   rC   rB   r   r3   s   public()s   _notpublic()r/   )r0   r2   r    )r*   r1   )r   r   r   r   r   r>   rA   c              3  8   #    U  H  n[        U5      v   M     g 7frN   r   r   s     rS   rT   _optimize.<locals>.<genexpr>  s     3Uy||Ur   r?   r   _weights   commonancestors(_)s   headss   _commonancestorheads(_)r   )r   r   r   r|   r   r   r   r   rh   r   r   zipsumgetattrsymbolsr   r   )rZ   r   war   wbr   r   mr   r   r   ofr   r   r   s                @@@rS   r   r     s   y!t	
1B	<<Av	v1Q41Q4K (62*:;1Q4$HHf8!A$!EEE r4*R"4f]3QqrU3338R rQ40007Br,	u R
B	 1AQ<DA}!A$)"3qty7H		1&!IIIaLIIaL  		r7a<a5"Q%<2wZ%)3444	v+qt$$&12AQ41:!A$AQ4"d##	{	!t	9	9adOtbA$Z	&	&1Q41Q4w$$	B	B1qA$-		1qA$!%%%	w3QqrU34B2w
""	{	1qtQ-	wadO1Q4GKKNIq1("- =Q66"<adCCCvaD"~%%
+b0
11r]   c                     [        U 5      u  pU$ )zSOptimize evaluatable tree

All pseudo operations should be transformed beforehand.
r   )r   r   newtrees      rS   optimizer     s    
 !GNr]      $c                t   U(       a.  U R                  S5      (       a  U R                  S5      (       a  Sn[        R                  " [        5      nUR	                  [        XUS95      u  pEU[        U 5      :w  a   [        R                  " [        S5      U5      e[        [        R                  " US5      5      $ )a  Generate a parse tree of given spec with given tokenizing options

>>> _parsewith(b'foo($1)', syminitletters=_aliassyminitletters)
('func', ('symbol', 'foo'), ('symbol', '$1'))
>>> from . import error
>>> from . import pycompat
>>> try:
...   _parsewith(b'$1')
... except error.ParseError as e:
...   pycompat.sysstr(e.message)
...   e.location
"syntax error in revset '$1'"
0
>>> try:
...   _parsewith(b'foo bar')
... except error.ParseError as e:
...   pycompat.sysstr(e.message)
...   e.location
'invalid token'
4
s   revset(r   N)rR   rp   s   invalid token)rA   r;   )
startswithendswithr	   elementsr   rz   rh   r   rm   r   r   simplifyinfixops)r   rR   rp   ry   r   rt   s         rS   
_parsewithr  ,  s    , $//*--$--2E2EhA^DID c$iq!12C886**41ABCCr]   c                  H    \ rS rSrSr\" S5      r\S 5       r\S 5       r	Sr
g)_aliasrulesiM  z0Parsing and expansion rule set of revset aliasess   revset aliasc                    [        U [        S9$ )zParse alias declaration/definition ``spec``

This allows symbol names to use also ``$`` as an initial letter
(for backward compatibility), and callers of this function should
examine whether ``$`` is used also for unexpected symbols or not.
rp   )r  _aliassyminitletters)r   s    rS   _parse_aliasrules._parseR  s     $/CDDr]   c                \    U S   S:X  a#  U S   S   S:X  a  U S   S   [        U S   5      4$ g g )Nr   r   r   rB   r@   )r   r   s    rS   _trygetfunc_aliasrules._trygetfunc\  sA    7g$q'!*	"971:wtAw/// #:r]   rO   N)__name__
__module____qualname____firstlineno____doc__r   _sectionstaticmethodr  r  __static_attributes__rO   r]   rS   r  r  M  s7    :!HE E 0 0r]   r  c                :   [         R                  U5      n[         R                  X5      n Ubm  [        UR	                  5       5       HP  u  p4UR
                  (       d  M  UR                  (       a  M+  U" [        S5      UR
                  -  5        SUl        MR     U $ )zCExpand aliases in a tree, aliases is a list of (name, value) tupless   warning: %s
T)r  buildmapexpandsorteditemsr   warnedr   )r   aliaseswarnnamealiass        rS   expandaliasesr  b  su    ""7+Gg,D!'--/2KD{{{5<<<Q'(EKK89# 3 Kr]   c                   [        U [        5      (       a	  U S   S;   a  U $ U S   S:X  a  U /n/ nU(       a  UR                  5       nUS   S:X  a  UR                  [	        USS 5      5        OEUS   S;   a  UR                  US   5        O'[        S5      US   -  n[        R                  " U5      eU(       a  M  SS	R                  U5      4$ [        S
 U  5       5      $ )z(Fold elements to be concatenated by `##`r   )rC   rB   r   r   r   NrC   rB   s#   "##" can't concatenate "%s" elementrC   r]   c              3  8   #    U  H  n[        U5      v   M     g 7frN   )
foldconcat)rP   r   s     rS   rT   foldconcat.<locals>.<genexpr>  s     1DqZ]]Dr   )
r`   r   popextendreversedr   r   r   rm   r   )r   pendingru   emsgs        rS   r#  r#  o  s    dE""d1g 2 '
 Aw*&Atz!x!"/1//1BCqtL&&s++ g 388A;''1D111r]   c                     [        XS9$ ! [        R                   aS  nUR                  b@  UR                  nU R	                  SS5      n U S-   SUS-   -  -   S-   [        S5      -   Ul        e S nAff = f)N)rR      
    r   s   ^ s   here)r  r   rm   locationreplacer   hint)r   rR   instlocs       rS   r   r     sw    $.. 
==$--C<<t,D
 utsQw'77%?!G*LDI
s    A2AA--A2c                \    S[         R                  " [        R                  " U 5      5      -  $ )zQuote a value in order to make it safe for the revset engine.

>>> _quote(b'asdf')
"'asdf'"
>>> _quote(b"asdf'\"")
'\'asdf\\\'"\''
>>> _quote(b'asdf\'')
"'asdf\\''"
>>> _quote(1)
"'1'"
s   '%s')r   	escapestrr
   rc   )rs   s    rS   _quoter5    s%     Z))(*:*:1*=>>>r]   c                   U S:X  a  S[        U5      -  $ U S:X  a  [        U5      $ U S:X  a+  [        U[        5      (       d  [        e[        U5        SU-  $ U S:X  a  [        [        U5      5      $ U S:X  a   [        UR                  5       5      $ [        R                  " [        S5      U -  5      e! [         a    [        ef = f)	N   ds   _rev(%d)   srW   s   (%s)   n   bs&   unexpected revspec format character %s)r   r5  r`   ra   	TypeErrorr   r   branchAttributeErrorr   rm   r   )rv   args     rS   _formatargtyper?    s    DySX%%	
dc{	
d#u%%Oc
}	
dc#h	
d	#**,'' 

1FG!K
LL  	O	s   8B3 3Cc                   [        U 5      nUS:X  a  gUS:X  a  [        XS   5      $ US:X  a  [        U 5      $ US:X  a  S[        SR	                  U 5      5      -  $ US:X  a  S	SR	                  S
 U  5       5      -  $ US:X  a   SSR	                  S U  5       5      -  $ US-  nS[        U S U U5      [        XS  U5      4-  $ ! [
         a    [        ef = f)Nr   	   _list('')r   r7  r8  s	   _list(%s)r   r9  s   _hexlist('%s')c              3  8   #    U  H  n[        U5      v   M     g 7frN   r   rP   r   s     rS   rT   !_formatlistexp.<locals>.<genexpr>  s     -@ac!ffar   r:  s   _list('%s')c              3  @   #    U  H  oR                  5       v   M     g 7frN   )r<  rC  s     rS   rT   rD    s     .E1axxzz1s   r@   s
   (%s or %s))rh   r?  _formatintlistr5  r   r=  r;  _formatlistexp)rs   r   ru   r   s       rS   rG  rG    s    AAAv	
aa1&&	
da  	
dfUZZ]333	
d 5::-@a-@#@@@	
d	!EJJ.E1.E$EEE 	
QAN1Ra5!4nQrUA6NOOO	  	O	s   C Cc                     [        U 5      nUS:X  a  gUS:X  a  [        SU S   5      $ SSR                  S U  5       5      -  $ ! [        [        4 a     [
        R                  " [        S5      5      ef = f)	Nr   rA  r   r7  s   _intlist('%s')r   c              3  >   #    U  H  nS [        U5      -  v   M     g7f)s   %dN)r   rC  s     rS   rT   !_formatintlist.<locals>.<genexpr>  s     -Kdec!fnds      invalid argument for revspec)rh   r?  r   r;  r   r   rm   r   )dataru   s     rS   rF  rF    sz    CI6!V!$Q00 5::-Kd-K#KKKz" Cq!@ABBCs   A A A 0A4c                :   ^ SR                  U4S jU  5       5      $ )Ns   , c              3  <   >#    U  H  n[        TU5      v   M     g 7frN   )r?  )rP   r   r   s     rS   rT   "_formatparamexp.<locals>.<genexpr>  s     9DqnQ**Ds   )r   )argsr   s    `rS   _formatparamexprQ    s    ::9D999r]   )   l   pc                   [        X5      n/ nU H  u  pEUc  UR                  U5        M  US:X  aE  [        U[        5      (       a  [	        U5      nUR                  [        [        U5      5      5        Mf  US:X  a&  UR                  [        [        U5      S5      5        M  [        R                  " SU-  5      e   SR                  U5      $ )a  
This is a convenience function for using revsets internally, and
escapes arguments appropriately. Aliases are intentionally ignored
so that intended expression behavior isn't accidentally subverted.

Supported arguments:

%r = revset expression, parenthesized
%d = rev(int(arg)), no quoting
%s = string(arg), escaped and single-quoted
%b = arg.branch(), escaped and single-quoted
%n = hex(arg), single-quoted
%% = a literal '%'

Prefixing the type with 'l' specifies a parenthesized list of that type,
and 'p' specifies a list of function parameters of that type.

>>> formatspec(b'%r:: and %lr', b'10 or 11', (b"this()", b"that()"))
'(10 or 11):: and ((this()) or (that()))'
>>> formatspec(b'%d:: and not %d::', 10, 20)
'_rev(10):: and not _rev(20)::'
>>> formatspec(b'%ld or %ld', [], [1])
"_list('') or _rev(1)"
>>> formatspec(b'keyword(%s)', b'foo\xe9')
"keyword('foo\\xe9')"
>>> b = lambda: b'default'
>>> b.branch = b
>>> formatspec(b'branch(%b)', b)
"branch('default')"
>>> formatspec(b'root(%ls)', [b'a', b'b', b'c', b'd'])
"root(_list('a\\x00b\\x00c\\x00d'))"
>>> formatspec(b'sort(%r, %ps)', b':', [b'desc', b'user'])
"sort((:), 'desc', 'user')"
>>> formatspec(b'%ls', [b'a', b"'"])
"_list('a\\x00\\'')"
   basesetr   r9     unknown revspec item type: %rr]   )
_parseargsr   r`   setr  rF  r   rG  r   rb   r   )exprrP  parsedretr   r>  s         rS   
formatspecr\    s    J #F
C9JJsO*_#s##SkJJ~d3i01*_JJ~d3i67(()IA)MNN  88C=r]   c                $   [        X5      n/ n/ nU H  u  pVUc  UR                  U5        M  US:X  a<  S[        R                  " U5      4nUR                  U5        UR                  S5        M]  US:X  a(  SU4nUR                  U5        UR                  S5        M  [        R
                  " SU-  5      e   SR                  U5      n [        U [        S9n[        R                  " US/UQ76 n[        U5      n[        U5      n[        U5      nU$ )	z<similar to formatspec but return a parsed and optimized treerU  r   r   r   rV  r]   r  )rB   r   )rW  r   r   basesetr   rb   r   r  r  r	   r   r#  r   r   )	rY  rP  rZ  r[  inputsr   r>  r   r   s	            rS   spectreer`    s    #F
CF9JJsO*_"H$4$4S$9:GMM'"JJt*_!3'GMM'"JJt(()IA)MNN  88C=Dd+?@DD"3=f=DdD4=DD>DKr]   c                t   [         R                  " U 5      n [        U5      n/ nSnU[        U 5      :  Ga[  U R	                  SU5      nUS:  a  UR                  SXS 45        GO,UR                  SXU 45        US-   n X   nUS:X  a  UR                  SU45        US-  nM~   [        U5      n[        R                  U5      nU(       a  US-  nUS:H  n	 X   nU	(       a'  US:X  a!  U(       a  UR                  S	U45        US-  nM  U	(       a(  US
:X  a"  U(       a  UR                  SU45        US-  nGM   UR                  SU" [        U5      U5      45        O UR                  S[#        Xg5      45        US-  nU[        U 5      :  a  GM[   [        U5        [        R                  " [        S5      5      e! [         a     [        R                  " [        S5      5      ef = f! [         a     [        R                  " [        S5      5      ef = f! [         a     [        R                  " [        S5      5      ef = f! [        [         4 a     [        R                  " [        S5      5      ef = f! [        [         4 a     [        R                  " [        S5      5      ef = f! [         a     U$ f = f)zparse the expression and replace all inexpensive args

return a list of tuple [(arg-type, arg-value)]

Arg-type can be:
* None:      a string ready to be concatenated into a final spec
* 'baseset': an iterable of revisions
r   r8   Nr   s#   incomplete revspec format characters   missing argument for revspecrR  r7  rU  r9  r   rK  s$   too many revspec arguments specified)r
   rc   iterrh   findr   
IndexErrorr   rm   r   nextStopIteration_formatlistfuncsr   r   r;  r   r?  )
rY  rP  argiterr[  rt   qrx   r>  r   islists
             rS   rW  rW  7  s    D!D4jG
C
C
D	/IIdC q5JJd4j)*

D$1+&'!e	N	A 9JJay!1HC	Gw-C   #1HC$YFI
 !t) 

J,-qAI# 

J,-qK

D!DIq/23
K

D."89: 	qm D	/pWq!HIJJc  	N""1%K#LMM	N  	G""1%D#EFF	G  &&<= & z* K&&q)H'IJJK z* K&&q)H'IJJK  JsN    F< %G) H 9#I I6 *J) <*G&)*H*I 0I360J&)
J76J7c                0    [         R                  " U S5      $ )Nr!  )r	   prettyformatr
  s    rS   rl  rl    s    t%;<<r]   c                f    [        U [        5      (       a  [        [        [        U 5      5      S-   $ g)Nr   r   )r`   r   r   mapdepthr
  s    rS   ro  ro    s)    $3ud#$q((r]   c                    [        U [        5      (       a	  U S   S;   a
  [        5       $ [        5       nU SS   H  nU[        U5      -  nM     U S   S:X  a  UR	                  U S   S   5        U$ )Nr   r!  r   r   )r`   r   rX  	funcsusedadd)r   funcsrs   s      rS   rq  rq    sl    dE""d1g1G&GuabAYq\!E 7gIId1gaj!r]   s   [0-9a-fA-F]{1,40}$c                ,    [         R                  U 5      $ )z,returns true if the symbol looks like a hash)_hashrematch)symbols    rS   _ishashlikesymbolrx    s    ==  r]   c                    U (       d  / $ U S   S:X  a  [        U S   5      (       a  U S   /$  / $ [        U 5      S:  a  / nU SS  H  nU[        U5      -  nM     U$ / $ )a  returns the list of symbols of the tree that look like hashes

>>> gethashlikesymbols(parse(b'3::abe3ff'))
['3', 'abe3ff']
>>> gethashlikesymbols(parse(b'precursors(.)'))
[]
>>> gethashlikesymbols(parse(b'precursors(34)'))
['34']
>>> gethashlikesymbols(parse(b'abe3ffZ'))
[]
r   rB   r   r>   N)rx  rh   gethashlikesymbols)r   resultssubtrees      rS   rz  rz    s{     	Aw)T!W%%G9 & I 
TaABxG)'22G  Ir]   )NNNr   rN   )L
__future__r   stringi18nr   noder    r   r	   r
   r   r   utilsr   r   rn   r   rk   rX  iterbytestrrj   sysbytesascii_lettersdigitsrn  bytechrrangerd   re   rz   objectr   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  basealiasrulesr  r  r#  r   r5  r?  rG  rF  rQ  rg  r\  r`  rW  rl  ro  rq  recompileru  rx  rz  rO   r]   rS   <module>r     s   #     '
C' 	
9' 	
3	'
 
3' 	
3' 	
:' 	
9' 
 '  
 !'. 	
L/'0 01'2 	
.3'4 .5'6 	
,7'8 	
49': 
,;'< 	
+='> ,
1
-
%
%//'M'R #
tx++,?@A  &../


FMM
*	+
	 HeCo./0 H$8$8$? @@ET (/   ' $   )0 
G 
AO4<32lc2L '$/ DB0&'' 0*
22 ?M(P,	C:
 
 2j6JZ=	 ''///
0!
r]   