
    q&fq              
          d dl Z ddlmZ ddlmZ ddlmZmZmZm	Z	m
Z
 ddlmZ i ddd	d
ddddddddddddddddddddddddd d!d"d#d$d#d#d%d&d'd'd(d)d'd*Zh d+Zi Zd,d-hZ e ej$                  d.            Z e ej$                   ej(                  e j*                         ej(                  e j,                        z   d/z                e eej0                   ed0d1                  z  Ze e ej$                  d2            z  Zd\d3Z e       Zd4 Zd5 Z efd6Z!d7 Z"d8 Z#d9 Z$eefd:Z%d; Z&d< Z'i Z(d= Z)d> Z*d? Z+d@ Z,dA Z-dB Z.dC Z/dD Z0dE Z1edFhz  Z2d]dGZ3 G dH dIejh                        Z5d^dJZ6dK Z7d^dLZ8dM Z9dN Z:dO Z;dP Z<dQ Z=e;e=dRZ>dS Z?dT Z@dU ZAdV ZBdW ZCdX ZDe
j                  j                  dY      ZGdZ ZHd[ ZIy)_    N   )_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)r2   r3   NN   !   and)r!   NN)r5   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   rA   rB      end>   r:   r5   r2      "   's   ()[]#:=,-|&+!~^%s   ._@      s   -/c              #     K   t        | t              st        j                  d| z        t	        j
                  |       } |t        }|t        }| r}r{| j                  dd      }t        fd|D              rU|d   r
d|d   df t        |      dkD  r't        |d         }dd|f |d   rd|d   |dz   f ddt        |       f ydt        |       }}||k  r| |   }|j                         rn|dk(  r| ||d	z    d
k(  rd
d|f |dz  }n|dk(  r| ||d	z    dk(  rdd|f |dz  }n|dk(  r| ||d	z    dk(  rdd|f |dz  }n|t        v r	|d|f nz|t        v s|dk(  r| ||d	z    dv r|dk(  r|dz  }| |   }d }	nt        j                  }	|dz  }|}||k  r2| |   }
|
dk(  r|d	z  }|
|k(  rd |	| ||       |f n|dz  }||k  r2t        j                   t#        d      |      ||v r|}|dz  }||k  r+| |   }
|
|vrn!|
dk(  r| |dz
     dk(  r|dz  }n|dz  }||k  r+| || }|t$        v r|d|f nkd|v r`r |      rd||f nU|j                  d      }|dd D ]%  }|rd||f |t        |      z  }dd|f |dz  }' |d   rd|d   |f nd||f |dz  }n"t        j                   t#        d      | z  |      |dz  }||k  rdd|f yw)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   4   K   | ]  }|s |        y wN ).0symlookups     6/usr/lib/python3/dist-packages/mercurial/revsetlang.py	<genexpr>ztokenize.<locals>.<genexpr>v   s     3ssvc{3s   r   rA   rF   r?   r%      .r+   r   r      r)s   r's   r"c                     | S rM   rN   xs    rR   <lambda>ztokenize.<locals>.<lambda>   s    1        \rB   s   unterminated stringr    s   syntax error in revset '%s')
isinstancebytesr   ProgrammingErrorr	   bytestr_syminitletters_symletterssplitalllenisspace_simpleopletters_quotelettersr   unescapestr
ParseErrorr   keywords)programrQ   syminitletters
symletterspartssposlcdecodedrP   ps    `           rR   tokenizerw   S   s    * gu%$$5?
 	
 w'G( 
6 dA&3e33Qx %(A..5zA~aMT1o%8$eAhA664W..GC
'CL99;I'#a0E9$$$1HCI'#a0E9$$$1HCI'#a0E9$$$1HC""dC. DycAg&.8DyqCL$++1HCA'CL:1HC6$fWQs^&<a@@q ' &&q)?'@!DD. A1HC'CLJ&I'#'"2d":1HCq ' !C.ChD!n$fSk$c1--  IIdOE"3BZ #,a"33SV#T1o-Q Ry(%)Q77 #q))1HC""01G;S  	qk 'l 4
s   GK3AK37B2K3+K3c                 \    | r| d   dk(  r| d   S t        j                  t        d            )Nr   rA   r   s   not a symbol)r   rj   r   rW   s    rR   	getsymbolry      s/    QqTYt


1_-
..rZ   c                 Z    | r| d   dk(  s| d   dk(  r| d   S t        j                  |      )Nr   rB   rA   r   r   rj   )rX   errs     rR   	getstringr}      s5    adi1Q49#4t


3
rZ   c                     | s
|t         ur|S 	 t        t        | |            S # t        $ r t	        j
                  |      w xY wrM   )_notsetintr}   
ValueErrorr   rj   )rX   r|   defaults      rR   
getintegerr      sH    '$9Q$%% $s##$s	   # Ac                 p    t        j                  t        |             }||S t        j                  |      rM   )r   	parseboolry   r   rj   )rX   r|   values      rR   
getbooleanr      s2      1.E


3
rZ   c                 <    | sg S | d   dk(  rt        | dd        S | gS )Nr   r@   r   )listrW   s    rR   getlistr      s,    	twAabE{3JrZ   c                     | st        j                  |      | d   }|dk(  r
| d   | d   fS |dk(  rd | d   fS |dk(  r| d   d fS |dk(  ryt        j                  |      )	Nr   r0   r   r?   r/   r1   r.   NNr{   )rX   r|   ops      rR   getranger     s    s##	
1B	X~tQqTz	{	QqTz	|	tTz	{	


3
rZ   c                     | r | d   dk(  s| d   dk(  rt        | |      }||fS t        | |      \  }}t        |||      t        |||      fS )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   rB   rA   )r   r   )rX   err1err2deffirstdeflastnabs           rR   getintranger     s_     	adi1Q49#4q$!tAtDAqax(*Qg*FFFrZ   c                     t        |       }t        |      |k  s|dk\  r#t        |      |kD  rt        j                  |      |S )Nr   )r   re   r   rj   )rX   minmaxr|   rr   s        rR   getargsr      s<    
A
1v|qSVc\s##HrZ   c                 n    t        j                  t        |       |t        j                  |      dd      S )Nr>   rA   )keyvaluenodekeynode)r   buildargsdictr   splitargspec)rX   funcnamekeyss      rR   getargsdictr   '  s3    
D!  rZ   c                 \    t         j                  |       }|t        |       xt         | <   }|S rM   )
_treecachegetparse)spectrees     rR   _cachedtreer   5  s-    >>$D|"'+-
44KrZ   c                 F    t        |       }t        j                  |dg| S )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'))
    rA      _)r   r   	buildtree)tmplspecreplstemplates      rR   _buildr   =  s'     8$HH&7@%@@rZ   c                 L    t        |       }t        j                  ||dddh      S )a  Test 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>   r@   )r   r   	matchtree)patspecr   patterns      rR   _matchr   G  s0     '"G(;*@ rZ   c                      t        dd| |f      S )Ns!   ancestors(_) and not ancestors(_)r5   )r   )revsbasess     rR   
_matchonlyr   U  s    6u8MNNrZ   c                    t        | t              s| S | d   }|dk(  rud| d   f}| d   d   dk(  rt        d|| d   d   f      S | d   d   dk(  rt        d	|f      S | d   d   d
k(  rt        d|| d   d   f      S | d   d   dk(  rSt        d|f      S |dk(  r|t        d| dd z         fS |dk(  r)| d   d   dk(  rt        d| d   d   | d   d   | d   f      S |ft        d | dd D              z   S )zrRewrite 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*   r/   r0   r.   r1   r:   r@   Nr   r      relsubscriptc              3   2   K   | ]  }t        |        y wrM   )_fixopsrO   ys     rR   rS   z_fixops.<locals>.<genexpr>t  s     33   )r]   tupler   )rX   r   posts      rR   r   r   Y  sH    a	
1B	Y qt$Q47n$KqtAw788qT!W&OT233qT!W#HdAaD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3rZ   c                    | | S | d   }|dk(  rt        t        dg| dd         S |dk(  rt        t        dg| dd         S |dk(  rt        t        d| d               S |d	k(  rt        j                  t	        d
            |dk(  rt        t        d| d               S |dk(  rt        t        d| d               S |dk(  r(t        | d   t	        d            }t        dd|z   f      S |dv r| S |dk(  r|d fS |dv r|t        | d         fS |dk(  rt        | d         S |dv r!t        | d         }t        | d         }|||fS |dk(  r0t        | d         }t        | d         }t        | d         }||||fS |dk(  r|ft        d | dd  D              z   S |dk(  r|| d   t        | d         fS |dk(  r|| d   t        | d         fS t        d|z        ) Nr   r$   s   _ and not _r   r8   
   only(_, _)r9   s   only(_)r'   s   can't use '::' in this contextr(   s   ancestors(_)r*   s   descendants(_)r"   s   can't negate thatrB   r    rB   rA      smartsetr.   >   r:   r2   r/   r1   r   r   >   r5   r0   r   r   r)   r   r   r?   r   r=   r@   c              3   2   K   | ]  }t        |        y wrM   _analyzer   s     rR   rS   z_analyze.<locals>.<genexpr>  s     8QXa[8r   r>   r      invalid operator %r)r   r   r   rj   r   r}   r   r   )rX   r   rp   tatbtcs         rR   r   r   w  s?   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-..	2	2	{	Dz	H	HHQqTN##	x!~	  
 ad^ad^B|		ad^ad^ad^BB	wuu8!AB%8888	{	AaD(1Q4.))	wAaD(1Q4.))
+b0
11rZ   c                     t        |       S )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   rW   s    rR   analyzer     s     A;rZ   c                    | d| fS | d   }|dv rd| fS |dk(  rt        | d         \  }}t        | d         \  }}t        ||      }t        dd||f      }|r%t        |d         dv r|t	        d	|d   |d         fS t        ||      xs t        ||      }|r|t	        d
g|dd   fS t        d|      }|r
|d||d   ffS ||kD  rd}||||ffS |dk(  rg g g cfd}t        | d         D ]_  }	t        |	      \  }}
|
$|
d   dk(  s|
d   dk(  rj                  ||
f       7 |        j                  |       j                  |
       a  |        t              dk(  r
d   d   fS t              |dt              z   ffS |dk(  rGt        d| d         rt        t	        d            }|d   |d   fS t        | d         }|d   ||d   ffS |dk(  rd| fS |dv rt        | d         }|d   ||d   ffS |dv r,t        | d         \  }}t        | d         \  }}||z   |||ffS |dv rt        | d         \  }}
|||
| d   ffS |dk(  rt        | d         \  }}
|||
| d   | d   ffS |dk(  r&t        d | dd  D         \  t              |fz   fS |dk(  rt        | d         \  }}
||| d   |
ffS |dk(  rst        | d         }t        | d         \  }}t        t        j                  |      d d      }t        d!|      }|d"k(  r|r||z   t	        d#|d         fS ||z   || d   |ffS t!        d$|z        )%Nr   r   g      ?r5   r   r?   s   _() & ancestors(_)>      draft   secret
   _notpublics   _phaseandancestors(_, _)r   s   not _s
   differences	   andsmallyr:   c                      sy t              dk(  r	d   \  } }n4dj                  d D              }t        dd|f      }t        |      \  } }j	                  |        j	                  |       d d = y )Nr   r       c              3   ,   K   | ]  \  }}|d      yw)r   NrN   )rO   wts      rR   rS   z-_optimize.<locals>.flushss.<locals>.<genexpr>  s     31qt3s   s   _list(_)rB   )re   joinr   	_optimizeappend)r   r   rp   r   sstswss       rR   flushssz_optimize.<locals>.flushss  so    2w!|!u1JJ333;A7 |1IIaLIIaL1rZ   rB   rA   r   r2   s   public()s   _notpublic()r.   )r/   r1   r   )r)   r0   )r   r   r   r   r   r=   r@   c              3   2   K   | ]  }t        |        y wrM   r   r   s     rR   rS   z_optimize.<locals>.<genexpr>	  s     3y|3r   r>   r   _weights   commonancestors(_)s   headss   _commonancestorheads(_)r   )r   r   r   ry   r   r   r   r   re   r   r   zipsumgetattrsymbolsr   r   )rX   r   war   wbr   r   mr   r   r   ofr   r   r   s                @@@rR   r   r     s$   y!t	
1B	00Av	v1Q4B1Q4BBK (62r*:;1Q4$HHf8!A$!EEE r24*R"4f]3QqrU3338R r1Q40007B2r2,	u R
B	 1 	AQ<DAq}!A$)"3qty7H		1a&!IIIaLIIaL	 		r7a<a5"Q%<2wZ%)3444	v+qt$&12AQ41:!A$AQ4"ad##	{	!t	9	9adOtb!A$Z	&	&1Q4B1Q4BBwR$$	B	B112q!A$-		112q!A$!%%%	w3QqrU34B2w
""	{	112qtQ-	wadO1Q4BGKKNIq1("- =Qr66"<adCCC2vAaD"~%%
+b0
11rZ   c                 "    t        |       \  }}|S )z[Optimize evaluatable tree

    All pseudo operations should be transformed beforehand.
    r   )r   r   newtrees      rR   optimizer     s    
 !GWNrZ      $c                 X   |r$| j                  d      r| j                  d      rd}t        j                  t              }|j	                  t        | ||            \  }}|t        |       k7  rt        j                  t        d      |      t        t        j                  |d            S )aQ  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)rQ   rm   s   invalid token)r@   r:   )
startswithendswithr   elementsr   rw   re   r   rj   r   r   simplifyinfixops)r   rQ   rm   rv   r   rq   s         rR   
_parsewithr   *  s    , $//*-$--2EhAf^DID# c$iq!12C886**41ABCCrZ   c                   @    e Zd ZdZ ed      Zed        Zed        Zy)_aliasrulesz0Parsing and expansion rule set of revset aliasess   revset aliasc                 $    t        | t              S )a  Parse 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.
        rm   )r   _aliassyminitletters)r   s    rR   _parsez_aliasrules._parseP  s     $/CDDrZ   c                 X    | d   dk(  r"| d   d   dk(  r| d   d   t        | d         fS y y )Nr   r   r   rA   r?   )r   r   s    rR   _trygetfuncz_aliasrules._trygetfuncZ  sA    7g$q'!*	"971:wtAw/// #:rZ   N)	__name__
__module____qualname____doc__r   _sectionstaticmethodr   r  rN   rZ   rR   r   r   K  s7    :!HE E 0 0rZ   r   c                     t         j                  |      }t         j                  ||       } |`t        |j	                               D ]D  \  }}|j
                  s|j                  r  |t        d      |j
                  z         d|_        F | S )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        rR   expandaliasesr  `  sz    ""7+Ggt,D!'--/2 	$KD%{{5<<Q'(EKK89#	$ KrZ   c                    t        | t              r| d   dv r| S | d   dk(  r| g}g }|r{|j                         }|d   dk(  r|j                  t	        |dd              nB|d   dv r|j                  |d          n&t        d      |d   z  }t        j                  |      |r{dd	j                  |      fS t        d
 | D              S )z(Fold elements to be concatenated by `##`r   r   r   r   NrB   rA   s#   "##" can't concatenate "%s" elementrB   rZ   c              3   2   K   | ]  }t        |        y wrM   )
foldconcat)rO   r   s     rR   rS   zfoldconcat.<locals>.<genexpr>  s     1qZ]1r   )
r]   r   popextendreversedr   r   r   rj   r   )r   pendingrr   emsgs        rR   r  r  m  s    dE"d1g 2 '
 Aw*&Atz!x!"/1//1BCqtL&&s++  388A;''1D111rZ   c                     	 t        | |      S # t        j                  $ rR}|j                  @|j                  }| j	                  dd      } | dz   d|dz   z  z   dz   t        d      z   |_         d }~ww xY w)N)rQ      
    r   s   ^ s   here)r   r   rj   locationreplacer   hint)r   rQ   instlocs       rR   r   r     sy    $v.. 
==$--C<<t,D
 utsQw'77%?!G*LDI
s    A4AA//A4c                 X    dt        j                  t        j                  |             z  S )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	   r`   )rp   s    rR   _quoter'    s%     Z))(*:*:1*=>>>rZ   c                 v   | dk(  rdt        |      z  S | dk(  rt        |      S | dk(  r&t        |t              st        t        |       d|z  S | dk(  rt        t        |            S | dk(  r	 t        |j                               S t        j                  t        d      | z        # t        $ r t        w xY w)	N   ds   _rev(%d)   srU   s   (%s)   n   bs&   unexpected revspec format character %s)r   r'  r]   r^   	TypeErrorr   r   branchAttributeErrorr   rj   r   )rs   args     rR   _formatargtyper1    s    DySX%%	
dc{	
d#u%Oc
}	
dc#h	
d	#**,'' 

1FG!K
LL  	O	s   .B( (B8c                    t        |       }|dk(  ry|dk(  rt        || d         S |dk(  rt        |       S |dk(  rdt        dj	                  |             z  S |dk(  rd	dj	                  d
 | D              z  S |dk(  r	 ddj	                  d | D              z  S |dz  }dt        | d | |      t        | |d  |      fz  S # t
        $ r t        w xY w)Nr   	   _list('')r   r)  r*  s	   _list(%s)r   r+  s   _hexlist('%s')c              3   2   K   | ]  }t        |        y wrM   r   rO   r   s     rR   rS   z!_formatlistexp.<locals>.<genexpr>  s     -@c!f-@r   r,  s   _list('%s')c              3   <   K   | ]  }|j                           y wrM   )r.  r5  s     rR   rS   z!_formatlistexp.<locals>.<genexpr>  s     .Eaqxxz.Es   r?   s
   (%s or %s))re   r1  _formatintlistr'  r   r/  r-  _formatlistexp)rp   r   rr   r   s       rR   r8  r8    s    AAAv	
aa1&&	
da  	
dfUZZ]333	
d 5::-@a-@#@@@	
d	!EJJ.E1.E$EEE 	
QAN1Ra5!4nQqrUA6NOOO	  	O	s   >B? ?Cc                     	 t        |       }|dk(  ry|dk(  rt        d| d         S ddj                  d | D              z  S # t        t        f$ r t        j                  t        d            w xY w)	Nr   r3  r   r)  s   _intlist('%s')r   c              3   8   K   | ]  }d t        |      z    yw)s   %dN)r   r5  s     rR   rS   z!_formatintlist.<locals>.<genexpr>  s     -Kec!fn-Ks      invalid argument for revspec)re   r1  r   r-  r   r   rj   r   )datarr   s     rR   r7  r7    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 .A0c                 8    dj                  fd| D              S )Ns   , c              3   6   K   | ]  }t        |        y wrM   )r1  )rO   r   r   s     rR   rS   z"_formatparamexp.<locals>.<genexpr>  s     9qnQ*9s   )r   )argsr   s    `rR   _formatparamexpr@    s    ::9D999rZ   )   l   pc                 2   t        | |      }g }|D ]t  \  }}||j                  |       |dk(  r?t        |t              rt	        |      }|j                  t        t        |                   ^t        j                  d|z         dj                  |      S )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\\'')"
       baseset   unknown revspec item type: %rrZ   )

_parseargsr   r]   setr  r7  r   r   r_   r   )exprr?  parsedretr   r0  s         rR   
formatspecrK    s    J d#F
C O39JJsO*_#s#SkJJ~d3i01(()IA)MNNO 88C=rZ   c                    t        | |      }g }g }|D ]o  \  }}||j                  |       |dk(  r:dt        j                  |      f}|j                  |       |j                  d       Yt	        j
                  d|z         dj                  |      } t        | t              }t        j                  |dg| }t        |      }t        |      }t        |      }|S )z<similar to formatspec but return a parsed and optimized treerD  r   r   rE  rZ   r   )rA   r   )rF  r   r
   basesetr   r_   r   r   r   r   r   r  r   r   )	rH  r?  rI  rJ  inputsr   r0  r   r   s	            rR   spectreerO    s    d#F
CF O39JJsO*_"H$4$4S$9:GMM'"JJt(()IA)MNNO 88C=Dd+?@DD"3=f=DdD4=DD>DKrZ   c                    t        j                  |       } t        |      }g }d}|t        |       k  r| j	                  d|      }|dk  r|j                  d| |d f       n|j                  d| || f       |dz   }	 | |   }|dk(  r|j                  d|f       |dz  }|	 t        |      }t        j                  |      }|rW|dz  }|dk(  }		 | |   }|	r |dk(  r|r|j                  d	|f       |dz  }	 |j                  d |t        |      |      f       n	 |j                  dt#        ||      f       |dz  }|t        |       k  r	 t        |       t        j                  t        d            # t        $ r t        j                  t        d            w xY w# t        $ r t        j                  t        d            w xY w# t        $ r t        j                  t        d            w xY w# t        t         f$ r t        j                  t        d
            w xY w# t        t         f$ r t        j                  t        d
            w xY w# t        $ r Y |S w xY w)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   r7   Nr   s#   incomplete revspec format characters   missing argument for revspecrA  r)  rD  r;  s$   too many revspec arguments specified)r	   r`   iterre   findr   
IndexErrorr   rj   r   nextStopIteration_formatlistfuncsr   r   r-  r   r1  )
rH  r?  argiterrJ  rq   qru   r0  r   islists
             rR   rF  rF  /  s    D!D4jG
C
C
D	/IIdC q5JJd34j)*

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

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

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

D.C"89: 	qa D	/dWq!HIJJW  	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   >E8 "F# G 7#G9 H* )I 8(F #(G(G69.H'*.I	I('I(c                 .    t        j                  | d      S )Nr  )r   prettyformatr   s    rR   r[  r[  v  s    t%;<<rZ   c                 \    t        | t              rt        t        t        |             dz   S y)Nr   r   )r]   r   r   mapdepthr   s    rR   r^  r^  z  s&    $3ud#$q((rZ   c                     t        | t              r| d   dv r
t               S t               }| dd  D ]  }|t        |      z  } | d   dk(  r|j	                  | d   d          |S )Nr   r  r   r   )r]   r   rG  	funcsusedadd)r   funcsrp   s      rR   r`  r`    sn    dE"d1g1G&Guab 	"AYq\!E	"7gIId1gaj!rZ   s   [0-9a-fA-F]{1,40}$c                 ,    t         j                  |       S )z,returns true if the symbol looks like a hash)_hashrematch)symbols    rR   _ishashlikesymbolrg    s    ==  rZ   c                     | sg S | d   dk(  rt        | d         r| d   gS g S t        |       dk\  rg }| dd D ]  }|t        |      z  } |S g S )a7  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   rA   r   r=   N)rg  re   gethashlikesymbols)r   resultssubtrees      rR   ri  ri    sx     	Aw)T!W%G9 I 
TaABx 	3G)'22G	3IrZ   )NNNr   rM   )Jstringi18nr   noder    r   r   r	   r
   r   utilsr   r   rk   r   rh   rG  iterbytestrrg   sysbytesascii_lettersdigitsr]  bytechrrangera   rb   rw   objectr   ry   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   basealiasrulesr   r  r  r   r'  r1  r8  r7  r@  rV  rK  rO  rF  r[  r^  r`  recompilerd  rg  ri  rN   rZ   rR   <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  H&../
(

FMM
*	+
	 HeCo./0 $8H$8$8$? @@ET (/   ' $   )0 
G 
AO4<32lb2J '$/ DB0&'' 0*
22 ?M(P,	C:
 
 0f.DN=	 ''///
0!
rZ   