
    	^cz-                     j   d Z ddlZddlZddlmZ ddlZddlZddlmZ	 ddl
mZ ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZ ej        d         dk    Zdej        v ZdZ e            sddlZej        Zd Z ej!        Z!d Z"d Z#d	 Z$ej%        d
k    r ej&                     ej'        Z'ej(        Z(ej)        *                    d          Z+ej,        *                    d          Z-ej%        *                    d          Z.ej/        *                    d          Z0ej1        *                    d          Z2ej3        *                    d          Z4ej5        Z6e6re6*                    d          Z6ej7        *                    d          Z8ej9        *                    d          Z:ej;        Z<e<r ej'        e<          Z<d Z=d Z>d Z?e@ZAejB        ZCeDZE eFedd          .ej%        d
k    rd ejG        D             ZHnd ejG        D             ZH ejI        d          jJ        ZKdjL        ZM G d deN          ZOd ZPd ZQd ZRd ZSd ZTd ZUd ZVd ZWd ZX eXejY                  ZY eXejF                  ZF eXejZ                  ZZ eXej[                  Z[ej\        Z]e^Z_d7d!Z` eXejZ                  Zad" Zbd# Zcd$ Zdd8d&Zed' Zfd( Zgejh        Zie:j                    d)          Zke:j                    d*          Zle:j                    d+          Zme.d,k    Zne.d-k    Zod. Zpd/ Zqd9d2Zrd9d3Zsd:d4Zt	 d;d6ZudS )<zwMercurial portability shim for python 3.

This contains aliases to hide python version-specific details from the core.
    N   __pypy__Fc                 <    |                      |d                    d S )Nr   )set_exception)fexc_infos     4/usr/lib/python3/dist-packages/mercurial/pycompat.pyfuture_set_exception_infor
   *   s    OOHQK         c                     | S N )as    r	   identityr   1   s    Hr   c                 D    ||S t          |t          t          t          f          r$ t	          |           fd|D                       S t          |t
                    r6 t	          |           fd|                                D                       S   |          S )Nc              3   8   K   | ]}t          |          V  d S r   _rapply).0xr   s     r	   	<genexpr>z_rapply.<locals>.<genexpr>:   s+      22!1222222r   c              3   ^   K   | ]'\  }}t          |          t          |          fV  (d S r   r   )r   kvr   s      r	   r   z_rapply.<locals>.<genexpr><   s<      NN41aA16NNNNNNr   )
isinstancelistsettupletypedictitemsr   xss   ` r	   r   r   5   s    	z	"tS%()) 3tBxx2222r222222"d OtBxxNNNN288::NNNNNN1R55Lr   c                 8    | t           u r|S t          | |          S )a  Apply function recursively to every item preserving the data structure

    >>> def f(x):
    ...     return 'f(%s)' % x
    >>> rapply(f, None) is None
    True
    >>> rapply(f, 'a')
    'f(a)'
    >>> rapply(f, {'a'}) == {'f(a)'}
    True
    >>> rapply(f, ['a', 'b', None, {'c': 'd'}, []])
    ['f(a)', 'f(b)', None, {'f(c)': 'f(d)'}, []]

    >>> xs = [object()]
    >>> rapply(identity, xs) is xs
    True
    )r   r   r"   s     r	   rapplyr%   @   s     $ 	H}}	1b>>r   ntasciic                  .    t          t          |            S r   )r   mapargss    r	   maplistr,   r       T
r   c                  .    t          t          |            S r   )r   ranger*   s    r	   	rangelistr0   v   s    tr   c                  .    t          t          |            S r   )r   zipr*   s    r	   ziplistr3   z   r-   r   argvc                 :    g | ]}|                     d d          S )mbcsignoreencoder   r   s     r	   
<listcomp>r;      s&    @@@!188FH--@@@r   c                 ,    g | ]}t          |          S r   )fsencoder:   s     r	   r;   r;      s    11118A;;111r   z>Bs   %rc                   8    e Zd ZdZerd	dZd	dZd Zd Zd Z	dS )
bytestraW  A bytes which mostly acts as a Python 2 str

    >>> bytestr(), bytestr(bytearray(b'foo')), bytestr(u'ascii'), bytestr(1)
    ('', 'foo', 'ascii', '1')
    >>> s = bytestr(b'foo')
    >>> assert s is bytestr(s)

    __bytes__() should be called if provided:

    >>> class bytesable:
    ...     def __bytes__(self):
    ...         return b'bytes'
    >>> bytestr(bytesable())
    'bytes'

    There's no implicit conversion from non-ascii str as its encoding is
    unknown:

    >>> bytestr(chr(0x80)) # doctest: +ELLIPSIS
    Traceback (most recent call last):
      ...
    UnicodeEncodeError: ...

    Comparison between bytestr and bytes should work:

    >>> assert bytestr(b'foo') == b'foo'
    >>> assert b'foo' == bytestr(b'foo')
    >>> assert b'f' in bytestr(b'foo')
    >>> assert bytestr(b'f') in b'foo'

    Sliced elements should be bytes, not integer:

    >>> s[1], s[:2]
    (b'o', b'fo')
    >>> list(s), list(reversed(s))
    ([b'f', b'o', b'o'], [b'o', b'o', b'f'])

    As bytestr type isn't propagated across operations, you need to cast
    bytes to bytestr explicitly:

    >>> s = bytestr(b'foo').upper()
    >>> t = bytestr(s)
    >>> s[0], t[0]
    (70, b'F')

    Be careful to not pass a bytestr object to a function which expects
    bytearray-like behavior.

    >>> t = bytes(t)  # cast to bytes
    >>> assert type(t) is bytes
    r   c                     d S r   r   )selfss     r	   __init__zbytestr.__init__   s    Dr   c                    t          |t                    r|S t          |t          t          f          s2t	          |d          s"t          |                              d          }t                              | |          S )N	__bytes__r'   )r   r?   bytes	bytearrayhasattrstrr9   __new__)clsrB   s     r	   rJ   zbytestr.__new__   sy    a!! 	Hy!
 
 	'|
 
	'
 Ag&&A}}S!$$$r   c                     t                               | |          }t          |t                     st          |          }|S r   )rF   __getitem__r   bytechr)rA   keyrB   s      r	   rM   zbytestr.__getitem__   s9    dC((!U## 	

Ar   c                 P    t          t                              |                     S r   )iterbytestrrF   __iter__rA   s    r	   rR   zbytestr.__iter__   s    5>>$//000r   c                 F    t                               |           dd          S )N   )rF   __repr__rS   s    r	   rV   zbytestr.__repr__   s    ~~d##ABB''r   N)r   )
__name__
__module____qualname____doc__TYPE_CHECKINGrC   rJ   rM   rR   rV   r   r   r	   r?   r?      s~        2 2p  	 	 	 		% 	% 	% 	%  1 1 1( ( ( ( (r   r?   c                 ,    t          t          |           S )z4Iterate bytes as if it were a str object of Python 2)r)   rN   rB   s    r	   rQ   rQ      s    w??r   c                 N    t          | t                    rt          |           S | S )zPromote bytes to bytestr)r   rF   r?   r]   s    r	   maybebytestrr_      s%    !U qzzHr   c                 Z    t          | t                    r| S |                     d          S )zConvert an internal str (e.g. keyword, __doc__) back to bytes

    This never raises UnicodeEncodeError, but only ASCII characters
    can be round-trip by sysstr(sysbytes(s)).
    zutf-8)r   rF   r9   r]   s    r	   sysbytesra      s-     !U 88Gr   c                 d    t          | t          j                  r| S |                     d          S )a$  Return a keyword str to be passed to Python functions such as
    getattr() and str.encode()

    This never raises UnicodeDecodeError. Non-ascii characters are
    considered invalid and mapped to arbitrary but unique code points
    such that 'sysstr(a) != sysstr(b)' for all 'a != b'.
    latin-1)r   builtinsrI   decoder]   s    r	   sysstrrf     s/     !X\"" 88Ir   c                 Z    t          | t                    r|                     d          S | S )z Converts a bytes url back to strr'   )r   rF   re   urls    r	   strurlrj     s+    #u #zz'"""Jr   c                 Z    t          | t                    r|                     d          S | S )z0Converts a str url to bytes by encoding in asciir'   )r   rI   r9   rh   s    r	   bytesurlrl     s+    #s #zz'"""Jr   c                 ,    |                      |          )z(Raise exception with the given traceback)with_traceback)exctbs     r	   raisewithtbrq   #  s    


R
 
  r   c                 J    t          | dd          }||S t          |          S )zPGet docstring as bytes; may be None so gettext() won't confuse it
    with _('')rZ   N)getattrra   )objdocs     r	   getdocrv   (  s+     #y$
'
'C
{
C==r   c                 F     t          j                    fd            }|S )Nc                 2     | t          |          g|R  S r   )rf   )objectnamer+   r   s      r	   wz_wrapattrfunc.<locals>.w2  s#    q-----r   )	functoolswraps)r   r{   s   ` r	   _wrapattrfuncr~   1  s8    _Q. . . . . Hr      rc                 J    t          j        | t          |          ||          S r   )rd   openrf   )rz   mode	bufferingencodings       r	   r   r   B  s    =vd||YAAAr   c                     d |D             }|                     d          }d |D             } | |||          \  }}d |D             }d |D             }||fS )z
    Takes bytes arguments, converts them to unicode, pass them to
    getopt.getopt(), convert the returned values back to bytes and then
    return them for Python 3 compatibility as getopt.getopt() don't accepts
    bytes on Python 3.
    c                 8    g | ]}|                     d           S rc   re   r:   s     r	   r;   z#_getoptbwrapper.<locals>.<listcomp>P  $    ...AAHHY...r   rc   c                 8    g | ]}|                     d           S r   r   r:   s     r	   r;   z#_getoptbwrapper.<locals>.<listcomp>R  s$    666##666r   c                 z    g | ]8}|d                               d          |d                              d          f9S )r   rc   rU   r8   r:   s     r	   r;   z#_getoptbwrapper.<locals>.<listcomp>T  s=    KKKQqT[[##QqT[[%;%;<KKKr   c                 8    g | ]}|                     d           S r   r8   r:   s     r	   r;   z#_getoptbwrapper.<locals>.<listcomp>U  r   r   r   )origr+   	shortlistnamelistoptss        r	   _getoptbwrapperr   I  s     /....D  ++I66X666HdIx00JD$KKdKKKD.....D:r   c                 B    d |                                  D             } | S )z
    Converts the keys of a python dictonary to str i.e. unicodes so that
    they can be passed as keyword arguments as dictionaries with bytes keys
    can't be passed as keyword arguments to functions on Python 3.
    c                 @    i | ]\  }}|                     d           |S r   r   r   r   r   s      r	   
<dictcomp>zstrkwargs.<locals>.<dictcomp>_  *    
:
:
:da188I
:
:
:r   r!   dics    r	   	strkwargsr   Y  s$     ;
:ciikk
:
:
:CJr   c                 B    d |                                  D             } | S )z
    Converts keys of python dictionaries to bytes as they were converted to
    str to pass that dictonary as a keyword argument on Python 3.
    c                 @    i | ]\  }}|                     d           |S r   r8   r   s      r	   r   zbyteskwargs.<locals>.<dictcomp>h  r   r   r   r   s    r	   byteskwargsr   c  s$    
 ;
:ciikk
:
:
:CJr   Tc                 l    t          j        |                     d          ||          }d |D             S )z
    Takes bytes argument, convert it to str i.e. unicodes, pass that into
    shlex.split(), convert the returned value to bytes and return that for
    Python 3 compatibility as shelx.split() don't accept bytes on Python 3.
    rc   c                 8    g | ]}|                     d           S r   r8   r:   s     r	   r;   zshlexsplit.<locals>.<listcomp>t  s$    ---AAHHY---r   )shlexsplitre   )rB   commentsposixrets       r	   
shlexsplitr   m  s7     +ahhy))8U
;
;C------r   c                 *    |                                  S r   r   r   s    r	   <lambda>r   w  s    aggii r   c                 *    |                                  S r   )valuesr   s    r	   r   r   x  s    qxxzz r   s   javas   darwins   linuxs   posixs   ntc                 :    t          t          j        | ||          S r   )r   getoptr+   r   r   s      r	   getoptbr     s    6=$	8DDDr   c                 :    t          t          j        | ||          S r   )r   r   
gnu_getoptr   s      r	   
gnugetoptbr     s    6,dIxHHHr   r      tmpc                 .    t          j        | ||          S r   )tempfilemkdtempsuffixprefixdirs      r	   r   r         FFC000r   c                 .    t          j        | ||          S r   )r   mkstempr   s      r	   r   r     r   r   c                 `    | d} nt          |           } d| v sJ t          j        | g|R i |S )Nzw+bb)rf   r   TemporaryFile)r   r+   kwargss      r	   unnamedtempfiler     sG    |d||$;;;;!$8888888r      w+bc                 `    t          |           } d| v sJ t          j        | |||||          S )Nr   )r   r   r   delete)rf   r   NamedTemporaryFile)r   bufsizer   r   r   r   s         r	   namedtempfiler     sC     $<<D$;;;;&gfVV   r   )r   r   N)FT)r   r   Nr   )r   r   r   r   NT)vrZ   rd   codecsconcurrent.futuresfuturesr|   r   http.clientclienthttplibhttp.cookiejar	cookiejar	cookielibinspectiojsonosqueuer   socketserverstructsysr   xmlrpc.client	xmlrpclibversion_infoispy3builtin_module_namesispypyr[   globalstypingr
   FileNotFoundErrorr   r   r%   rz   _enablelegacywindowsfsencodingr=   fsdecodecurdirr9   oscurdirlinesep	oslineseposnamepathsep	ospathseppardirospardirsepossepaltseposaltsepdevnull	osdevnullplatformsysplatform
executablesysexecutabler,   r0   r3   inputrawinputgetfullargspec
getargspecintlongrs   r4   sysargvStructpackrN   __mod__bytereprrF   r?   rQ   r_   ra   rf   rj   rl   rq   rv   r~   delattrrH   setattrr/   xrangerI   unicoder   safehasattrr   r   r   r   	iteritems
itervaluesloads
json_loads
startswithisjythonisdarwinislinuxisposix	iswindowsr   r   r   r   r   r   r   r   r	   <module>r     s      $ $ $ $ $ $            " " " " " "  				  				        



  ! ! ! ! ! ! 	q 	s/	/wyy )MMM(M! ! ! .       0 7e
 'C&(((;;9G$$Jg&&			 	 Jg&&	9G$$
g9 (w''HJg&&	l!!'** /BK..M       #


73) 
w%@@sx@@@11111
&-


"=S( S( S( S( S(e S( S( S(l  
    
 
 
    ! ! !
     -(
)
)
-(
)
)
-(
)
)
-(
)
)	
B B B B mH,--       . . . .  	!!
Z
!!'**!!),,

 
 
*
*
H
eO	E E EI I I1 1 1 1
1 1 1 19 9 9 9 JN     r   