
    	^cU                     f   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
 ddlmZ ddlmZmZmZmZmZ  ej        d          Zej        Zej        Zej        Zej        Zej        Zej        Zej        Zej        Zej        Zej        Zej        Zej         j!        Z!ej"        Z"ej#        Z#dZ$ G d d	          Z% G d
 d          Z&d<dZ'ej(        Z(d Z)d Z* G d d          Z+d Z,d Z-d Z.d Z/d=dZ0d Z1d Z2d Z3d Z4d Z5d Z6d Z7 ej8        d           Z9 ej8        d!          Z:d" Z;ej<        j=        Z>ej?        Z@d# ZAd$ ZBdaCdaDd% ZEd& ZFd' ZGd( ZHd) ZIejJ        ejK        hZLd* ZMd>d+ZNd>d,ZOd- ZPd. ZQd/ ZRd0 ZSd1 ZTd2 ZU G d3 d4          ZVd?d5ZWd6ZXd7 ZYd8 ZZd9 Z[d: Z\d; Z]dS )@    N   )_)getattr)encodingerrorpolicypycompatwin32osutil   c                   f    e Zd ZdZdZdZdZd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd ZdS )mixedfilemodewrappera)  Wraps a file handle when it is opened in read/write mode.

    fopen() and fdopen() on Windows have a specific-to-Windows requirement
    that files opened with mode r+, w+, or a+ make a call to a file positioning
    function when switching between reads and writes. Without this extra call,
    Python will raise a not very intuitive "IOError: [Errno 0] Error."

    This class wraps posixfile instances when the file is opened in read/write
    mode and automatically adds checks or inserts appropriate file positioning
    calls when necessary.
    r   r      c                 v    t                               | d|           t                               | dd           d S )N_fp_lastopr   )object__setattr__selffps     3/usr/lib/python3/dist-packages/mercurial/windows.py__init__zmixedfilemodewrapper.__init__C   s8    4+++4A.....    c                 8    | j                                          | S Nr   	__enter__r   s    r   r   zmixedfilemodewrapper.__enter__G   s    r   c                 >    | j                             |||           d S r   r   __exit__)r   exc_typeexc_valexc_tbs       r   r"   zmixedfilemodewrapper.__exit__K   s"    (GV44444r   c                 ,    t          | j        |          S r   r   r   r   names     r   __getattr__z mixedfilemodewrapper.__getattr__N       tx&&&r   c                 8    | j                             ||          S r   )r   r   )r   r)   values      r   r   z mixedfilemodewrapper.__setattr__Q   s    x##D%000r   c                 P    | j                             dt          j                   d S )Nr   )r   seekosSEEK_CURr   s    r   	_noopseekzmixedfilemodewrapper._noopseekT   s     a%%%%%r   c                 h    t                               | d| j                    | j        j        |i |S Nr   )r   r   OPNONEr   r/   r   argskwargss      r   r/   zmixedfilemodewrapper.seekW   s5    4DK888tx}d-f---r   c                     | j         | j        k    r|                                  t                              | d| j                   | j                            |          S r4   )r   OPREADr2   r   r   OPWRITEr   write)r   ds     r   r<   zmixedfilemodewrapper.write[   sO    <4;&&NN4DL999x~~a   r   c                     | j         | j        k    r|                                  t                              | d| j                    | j        j        |i |S r4   )r   r:   
_noopeseekr   r   r;   r   
writelinesr6   s      r   r@   zmixedfilemodewrapper.writelinesb   sU    <4;&&OO4DL999"tx"D3F333r   c                     | j         | j        k    r|                                  t                              | d| j                    | j        j        |i |S r4   )r   r;   r2   r   r   r:   r   readr6   s      r   rB   zmixedfilemodewrapper.readi   sT    <4<''NN4DK888tx}d-f---r   c                     | j         | j        k    r|                                  t                              | d| j                    | j        j        |i |S r4   )r   r;   r2   r   r   r:   r   readliner6   s      r   rD   zmixedfilemodewrapper.readlinep   sU    <4<''NN4DK888 tx $1&111r   c                     | j         | j        k    r|                                  t                              | d| j                    | j        j        |i |S r4   )r   r;   r2   r   r   r:   r   	readlinesr6   s      r   rF   zmixedfilemodewrapper.readlinesw   sU    <4<''NN4DK888!tx!426222r   N)__name__
__module____qualname____doc__r5   r:   r;   r   r   r"   r*   r   r2   r/   r<   r@   rB   rD   rF    r   r   r   r   2   s        
 
 FFG/ / /  5 5 5' ' '1 1 1& & &. . .! ! !4 4 4. . .2 2 23 3 3 3 3r   r   c                   0    e Zd ZdZd Zd Zd Zd Zd ZdS )fdproxyzeWraps osutil.posixfile() to override the name attribute to reflect the
    underlying file name.
    c                 "    || _         || _        d S r   )r)   r   )r   r)   r   s      r   r   zfdproxy.__init__   s    	r   c                 8    | j                                          | S r   r   r   s    r   r   zfdproxy.__enter__   s     r   c                 >    | j                             |||           d S r   r!   )r   r#   	exc_value	tracebacks       r   r"   zfdproxy.__exit__   s"    (Iy99999r   c                 *    t          | j                  S r   )iterr   r   s    r   __iter__zfdproxy.__iter__   s    DH~~r   c                 ,    t          | j        |          S r   r'   r(   s     r   r*   zfdproxy.__getattr__   r+   r   N)	rG   rH   rI   rJ   r   r   r"   rU   r*   rK   r   r   rM   rM      si             : : :  ' ' ' ' 'r   rM      rc                 T   	 t                               | ||          }t          | |          }d|v r |                    dt          j                   d|v rt          |          S |S # t          $ r6}t          |j	        t          j        |           d|j                  d}~ww xY w)z/Open a file with even more POSIX-like semantics   ar      +z: N)r   	posixfilerM   r/   r0   SEEK_ENDr   WindowsErrorIOErrorerrnor   strfromlocalstrerror)r)   mode	bufferingr   errs        r   r\   r\      s    
dD)44 T2 4<<GGAr{###4<<'+++	 
 
 
I8#8#>#>#>#>M
 
 	

s   A"A' %A' '
B'11B""B'c                 N    	 |                                  S # t          $ r Y dS w xY wNF)isattyAttributeErrorr   s    r   _isattyrk      s7    yy{{   uus    
$$c                     d} 	 t          j                    }|dk    s|dk    rn$|dk    rt          |dk    r| dd         } n| |z   } Dt          j        d           t          j        d           t	          j        |           S )	zPrompt for password with echo off, using Windows getch().

    This shouldn't be called directly- use ``ui.getpass()`` instead, which
    checks if the session is interactive first.
     T
NrX   )msvcrtgetwchKeyboardInterruptputwchr   
unitolocal)pwcs     r   get_passwordry      s     
B	MOO::e<<##::CRCBBaB	 M%
M%r"""r   c                   0    e Zd ZdZd Zd Zd Zd Zd ZdS )	winstdoutzSome files on Windows misbehave.

    When writing to a broken pipe, EINVAL instead of EPIPE may be raised.

    When writing too many bytes to a console at the same, a "Not enough space"
    error may happen. Python 3 already works around that.
    c                     || _         d S r   rj   r   s     r   r   zwinstdout.__init__   s    r   c                 ,    t          | j        |          S r   )r   r   )r   keys     r   r*   zwinstdout.__getattr__   s    tw$$$r   c                 \    	 | j                                          d S # t          $ r Y d S w xY wr   )r   closer_   r   s    r   r   zwinstdout.close   s<    	GMMOOOOO 	 	 	DD	s    
++c                     	 | j                             |          S # t          $ rS}|j        dk    rt	          j        |          s |                                  t          t          j        d          d }~ww xY w)Nr   Broken pipe)r   r<   r_   r`   r
   lasterrorwaspipeerrorr   EPIPE)r   sinsts      r   r<   zwinstdout.write   sv    	67==### 	6 	6 	6zQu'B4'H'HJJLLL%+}555		6s    
A9AA44A9c                     	 | j                                         S # t          $ r4}t          j        |          s t          t
          j        d          d }~ww xY w)Nr   )r   flushr_   r
   r   r`   r   )r   r   s     r   r   zwinstdout.flush   s^    	67==??" 	6 	6 	6.t44 %+}555	6s    
A/AAN)	rG   rH   rI   rJ   r   r*   r   r<   r   rK   r   r   r{   r{      si           % % %  6 6 66 6 6 6 6r   r{   c                      dS NTrK   rK   r   r   openhardlinksr          4r   c                 F    | dd         }|d         dk    r
|dd         }|S )z<parses the output produced by patch and returns the filename   Nr      `r   rX   rK   )output_linepfs     r   parsepatchoutputr      s/    	RSS	B	!u}}"XIr   c                 8   d|                                  v rdpd}|rd||fz  p|}|                    d          s|                    d          r$t          j        t	          d          |z            t          |          }|rd|t          |          |fz  }|S )	z$Build argument list for ssh or Plinks   plinks   -Ps   -ps   %s@%s   -   /s9   illegal ssh hostname or username starting with - or /: %ss   %s %s %s)lower
startswithr   Abortr   
shellquote)sshcmdhostuserportpflagr7   s         r   sshargsr     s    &059EE-Xt,5Dt 
 5 5 
kJKK
 
 	
 dD =eZ%5%5t<<Kr   c                     d S r   rK   )flxs      r   setflagsr         Dr   Fc                     d S r   rK   )srcdstrc   enforcewritables       r   copymoder     r   r   c                     dS rg   rK   paths    r   	checkexecr         5r   c                     dS rg   rK   r   s    r   	checklinkr   !  r   r   c                     t          | dd           }|7 |            dk    r+t          j         |            t          j                   d S d S d S )Nfilenor   )r   rr   setmoder0   O_BINARY)fdfnos     r   	setbinaryr   %  sS     "h
%
%C
3355A::ssuubk***** ::r   c                 B    |                      t          j        d          S )Nr   )replacer	   ossepr   s    r   pconvertr   -  s    <<---r   c                 .    |                      dd          S )Nr      \)r   r   s    r   	localpathr   1  s    <<e$$$r   c                 Z    t          t          j                            |                     S r   )r   r0   r   normpathr   s    r   r   r   5  s     BG$$T**+++r   c                 *    t          j        |           S r   )r   upperr   s    r   normcaser   9  s    >$r   s   ^[a-z]:z^[a-z]:c                 t   t           j                            |           }t          |t                    rBt
                              |          r'|dd                                         |dd          z   }nAt                              |          r'|dd                                         |dd          z   }|S )Nr   r   )	r0   r   abspath
isinstancebytes
DRIVE_RE_Bmatchr   
DRIVE_RE_S)r   abs_paths     r   r   r   A  s    wt$$H (E"" 8H%% 	<!}**,,x|;H			(	#	# 8AaC=&&((8ABB<7Or   c                     dS rg   rK   )s1s2s     r   samestatr   U  r   r   c                     t           fddD                       s S t          j        t          j        t          j        z             dz   }d}d}t                     }||k     rv ||dz            }|dk    re |dz   d          t                     }	                      d          }|d	 d|         z   d	z   z  }n# t          $ r || z   z  }|dz
  }Y nw xY w|d
k    rg |dz   d          t                     }	                      d
          } d|         }|d
|z   d
z   z  }n# t          $ r |d
 z   z  }|dz
  }Y nw xY w|dk    r |dz   |dz            dk    r |dz   d          t                     }	                      d          } d|         }|	                    |d          dk    r|d
|z   d
z   z  }n|d|z   dz   z  }n# t          $ r |d z   z  }|dz
  }Y nw xY wd}|dz  } ||dz            }|dk    r%||v r!||z  }|dz  } ||dz            }|dk    r||v !|	                    |d          dk    r|d
|z   d
z   z  }n|d|z   z  }|dk    r|dz  }nf|dk    r!|dz   |k     r |dz   |dz            dv r|dz  }n?|dk    r4|dz   |k     r+ |dz   |dz            dv r| |dz   |dz            z  }|dz  }n||z  }|dz  }||k     v|S )a  Convert shell variables in the form $var and ${var} inside ``path``
    to %var% form.  Existing Windows style variables are left unchanged.

    The variables are limited to the given environment.  Unknown variables are
    left unchanged.

    >>> e = {b'var1': b'v1', b'var2': b'v2', b'var3': b'v3'}
    >>> # Only valid values are expanded
    >>> shelltocmdexe(b'cmd $var1 ${var2} %var3% $missing ${missing} %missing%',
    ...               e)
    'cmd %var1% %var2% %var3% $missing ${missing} %missing%'
    >>> # Single quote prevents expansion, as does \$ escaping
    >>> shelltocmdexe(b"cmd '$var1 ${var2} %var3%' \$var1 \${var2} \\", e)
    'cmd "$var1 ${var2} %var3%" $var1 ${var2} \\'
    >>> # $$ is not special. %% is not special either, but can be the end and
    >>> # start of consecutive variables
    >>> shelltocmdexe(b"cmd $$ %% %var1%%var2%", e)
    'cmd $$ %% %var1%%var2%'
    >>> # No double substitution
    >>> shelltocmdexe(b"$var1 %var1%", {b'var1': b'%var2%', b'var2': b'boom'})
    '%var1% %var1%'
    >>> # Tilde expansion
    >>> shelltocmdexe(b"~/dir ~\dir2 ~tmpfile \~/", {})
    '%USERPROFILE%/dir %USERPROFILE%\\dir2 ~tmpfile ~/'
    c              3       K   | ]}|v V  	d S r   rK   ).0rx   r   s     r   	<genexpr>z shelltocmdexe.<locals>.<genexpr>s  s'      ))QqDy))))))r   s   $'~s   _-r   r   r      'N   "   %   $r      {   }s   ${   ~)r   r   s   %USERPROFILE%r   )r   r   )
anyr	   sysbytesstringascii_lettersdigitslenindex
ValueErrorget)r   envvarcharsresr   pathlenrx   vars   `       r   shelltocmdexer   Y  s   4 ))))&)))))  !5!EFFNH
CE$iiG
'//"#::	$D$iiG$

5))td6E6l*T11 $ $ $q4x!$ $YY	$D$iiG)

4((
 6E6ltczD((  $ $ $td{"!$ $YYEAI	)*d22EAIKK(d))( JJt,,Evv,C wwsC((C//tczD00us{T11! ( ( (54<'C#aKEEE( 
*+3hh1==1HCQJEUUQY./A 3hh1== 773$$++4#:,,CC4#:%C88QJEII	G##UQY*+}<<##CCJJ	G##UQY*+|;; 4	EAI-..CQJEE1HC
Y '//Z Js7   (C CCD. .E	E	AG G/.G/c                    t           t          j        d          a t          t          j        d          j        a| r+t          |           st                               |           s| S dt                               d|           z  S )a  
    >>> shellquote(br'C:\Users\xyz')
    '"C:\\Users\\xyz"'
    >>> shellquote(br'C:\Users\xyz/mixed')
    '"C:\\Users\\xyz/mixed"'
    >>> # Would be safe not to quote too, since it is all double backslashes
    >>> shellquote(br'C:\\Users\\xyz')
    '"C:\\\\Users\\\\xyz"'
    >>> # But this must be quoted
    >>> shellquote(br'C:\\Users\\xyz/abc')
    '"C:\\\\Users\\\\xyz/abc"'
    Ns   (\\*)("|\\$)s   [^a-zA-Z0-9._:/-]s   "%s"s   \1\1\\\2)_quotererecompile_needsshellquotesearchsubr   s    r   r   r     s     :.// :&;<<C !!$$ X__Q-?-? X\\,2222r   c                 n    |                      d          r|                     d          r
| dd         S | S )Nr   r   rX   )r   endswithr   s    r   _unquoter     s;    ||D ajj.. 2wHr   c                 ^    t          j        t          t          j        | d                    S )z3Parse a command string in cmd.exe way (best-effort)F)posix)r	   maplistr   
shlexsplitr   s    r   
shellsplitr     s%    Hh&9!5&I&I&IJJJr   c                     dS r   rK   sts    r   isownerr     r   r   c                    t           j                            dd          }d |                                                    t
          j                  D             t          j        	                    |           d                                         v rdgfd}t
          j
        | v r ||           S t           j                            dd                              t
          j                  D ]1} |t          j                            ||                     }||c S 2 |t          j                            t          j                            |                               S )a*  Find executable for command searching like cmd.exe does.
    If command is a basename then PATH is searched for command.
    PATH isn't searched if command is an absolute or relative path.
    An extension from PATHEXT is found and added if not present.
    If command isn't found None is returned.s   PATHEXTs   .COM;.EXE;.BAT;.CMDc                     g | ]}|S rK   rK   )r   exts     r   
<listcomp>zfindexe.<locals>.<listcomp>  s    IIIIIIr   r   r   c                 b    D ]*}| |z   }t           j                            |          r|c S +dS )z:Will append extension (if needed) and return existing fileN)r0   r   exists)pathcommandr  
executablepathextss      r   findexistingzfindexe.<locals>.findexisting  sH     	" 	"C$s*Jw~~j)) "!!!!"tr   s   PATH)r   environr   r   splitr	   	ospathsepr0   r   splitextr   join
expanduser
expandvars)commandpathextr  r   r  r  s        @r   findexer  	  sN    "":/EFFGIIw}}44X5GHHIIIH	w  #))++x775     ~  |G$$$ $$Wc22889KLL  !\"',,tW"="=>>
! "<**27+=+=g+F+FGGHHHr   c              #     K   i }t           j        | D ]}t          |          }t          j                            |          \  }}|sd}|                    |d          }|M	 fdt          |d          D             }n# t          t          f$ r i }Y nw xY w|
                    ||          }|                    |d          V  dS )zStat each file in files. Yield each stat, or None if a file
    does not exist or has a type we don't care about.

    Cluster and cache stat per directory to minimize number of OS stat calls.   .Nc                 f    i | ]-\  }}} |j                   t          v t          |          |.S rK   )st_mode_wantedkindsr   )r   nkr   getkinds       r   
<dictcomp>zstatfiles.<locals>.<dictcomp>8  sH       1awqy))\99 QKK999r   T)statS_IFMTr   r0   r   r
  r   listdirFileNotFoundErrorNotADirectoryError
setdefault)filesdircachenfdirbasecachedmapr  s          @r   	statfilesr)  )  s     
 HkG $ $b\\GMM"%%	T 	CS$''=   #*3#5#5  
 &'9:   ''T22Eiid######!$ $s   $BBBc                 v    | s6	 t          j        t          j                              S # t          $ r Y nw xY wdS )ziReturn the name of the user with the given uid.

    If uid is None, return the name of the current user.N)r	   fsencodegetpassgetuserModuleNotFoundError)uids    r   usernamer0  C  sS      	$W_%6%6777" 	 	 	 D		
 4s   $) 
66c                     dS )zkReturn the name of the group with the given gid.

    If gid is None, return the name of the current group.NrK   )gids    r   	groupnamer3  R  s	     4r   c                     t          j        |           }	 t          j        |          }n!# t          $ r}t          |          d }~ww xY wt          j        |          S r   )r	   fsdecoder0   readlinkr   ri   r+  )pathnamer   linkes       r   r6  r6  Y  sj    X&&D {4        
 Q  T"""s   + 
A	AA	c                    t          |           rdS t          j        |            t          j                            |           \  }}|s"t          j                            |          \  }}|ri|ri	 t          |          rdS t          j        |           n# t
          t          f$ r Y dS w xY wt          j                            |          \  }}|r|edS dS dS dS )zspecial version of os.removedirs that does not remove symlinked
    directories or junction points if they actually contain filesN)r  r0   rmdirr   r
  r   OSError)r)   headtails      r   
removedirsr?  f  s    t}} HTNNNt$$JD$ )W]]4((
d
 )4 )	t}} HTNNNNG$ 	 	 	EE	W]]4((
d  )4 ) ) ) ) ) ) ) ) )s   1B B B,+B,c                     	 t          j        | |           dS # t          $ r( t          |           t          j        | |           Y dS w xY w)z=atomically rename file src to dst, replacing dst if it existsN)r0   renameFileExistsErrorunlink)r   r   s     r   rA  rA  y  s`    
	#s   s
	#ss    .A
Ac                  Z    d t           j        gt           j        d d         z   D             S )Nc                 6    g | ]}t          j        |          S rK   )r   
strtolocal)r   args     r   r  zgethgcmd.<locals>.<listcomp>  s#    PPPH$$PPPr   r   )sysr  argvrK   r   r   gethgcmdrJ    s*    PP0@38BQB<0OPPPPr   c                     t           r   )KeyError)r)   s    r   groupmembersrM    s    
Nr   c                     dS rg   rK   )r   s    r   isexecrO    r   r   c                       e Zd Zd Zd ZdS )	cachestatc                     d S r   rK   )r   r   s     r   r   zcachestat.__init__  s    r   c                     dS rg   rK   r   s    r   	cacheablezcachestat.cacheable  s    ur   N)rG   rH   rI   r   rT  rK   r   r   rQ  rQ    s2              r   rQ  c                    |t           j        t           j        f}nt          |t          t
          f          s|f}|D ]}	 t          j        |t          j        |                     5 }d}|t          j        |          }t          j	        ||          d         }t          j
        |          cddd           c S # 1 swxY w Y   # t          $ r Y w xY wdS )a)  Look up a key/value name in the Windows registry.

    valname: value name. If unspecified, the default value for the key
    is used.
    scope: optionally specify scope for registry lookup, this can be
    a sequence of scopes to look up in order. Default (CURRENT_USER,
    LOCAL_MACHINE).
    Nr   )winregHKEY_CURRENT_USERHKEY_LOCAL_MACHINEr   listtupleOpenKeyr   ra   QueryValueExrv   EnvironmentError)r~   valnamescoper   hkeyr)   vals          r   	lookupregrb    s=    })6+DEe}--   	8#8#=#=>> 
0$&#099D)$55a8  *3//
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0   	 	 	D	 s7    'C	'AB=.C	=C	C	C	C		
CCTc                     dS )z(check whether a stat result is a symlinkFrK   r   s    r   
statislinkrd        5r   c                     dS )z1check whether a stat result is an executable fileFrK   r   s    r   
statisexecrg    re  r   c                     t                      r   NotImplementedError)fdss    r   pollrl    s    


r   c                     g }	 t          j        |           }|sn.|                     |          }|sn|                    |           Ed                    |          S )z$Read all available data from a pipe.Tr   )r
   peekpiperB   appendr  )pipechunkssizer   s       r   readpipers    sk    F~d## 	IIdOO 	a 88Fr   c                      t          d          )Nzunsupported platformri  )sockr   s     r   bindunixsocketrv    s    
4
5
55r   )rW   rX   rg   r   )NN)^r`   r,  rr   r0   r   r  r   rH  rV  i18nr   r	   r   rm   r   r   r   r
   	importmodr   getvolumenamegetfsmountpoint	getfstyper-  
hidewindowmakedirnlinksoslink
samedevicesamefilesetsignalhandlerspawndetachedr   r
  testpidrC  umaskr   rM   r\   r  rk   ry   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   normcasespecsr   normcasespecupperfallbacknormcasefallbackr   r   r   r   r   r   r   r   r  S_IFREGS_IFLNKr  r)  r0  r3  r6  r?  rA  rJ  rM  rO  rQ  rb  expandglobsrd  rg  rl  rs  rv  rK   r   r   <module>r     s      				 				   



                           
	(	#	#%O	
-

-		
>) #

-	J3 J3 J3 J3 J3 J3 J3 J3Z' ' ' ' ' ' ' '2
 
 
 
4 .  # # #,$6 $6 $6 $6 $6 $6 $6 $6N      	 	 		 	 	 	    + + +. . .% % %, , ,      RZ
##
RZ	""
    %+)   o o oz  3 3 3<  K K K  I I I: dl+$ $ $4      
# 
# 
#) ) )&  Q Q Q  
            B   
  
     
   6 6 6 6 6r   