
    	^c-W                        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
Z
d dlZddlmZ ddlmZmZ ddlmZmZmZmZ  ej        d          Zej        j        Zej        j        Zej        j        Z	 ej        Zn# e$ r d ZY nw xY wej        Zej        Zej         Z ej!        Z!dZ" ej#        d           Z# ej#        e#           eZ$d	 Z%d
 Z&d Z'd Z(d Z)d Z*d Z+d=dZ,d Z-d Z.d Z/d Z0d Z1d Z2d Z3d Z4d Z5d Z6d Z7d Z8ej9        j:        Z;e8Z<ej=        rd Z8ej9        j:        Z;d Z<ej>        dk    r& e?g d d!"          Z@d# Z8ej9        jA        Z;e8Z<d$ Z-d% Z.daBd& ZCd' ZDd( ZEd) ZFd* ZGd+ ZHejI        ejJ        hZKd, ZLd- ZMd>d.ZNd>d/ZOd0 ZPd1 ZQd2 ZRd3 ZSd?d4ZTd5 ZU G d6 d7          ZVd8 ZWd9 ZXd: ZYd; ZZd< Z[dS )@    N   )_)getattropen)encodingerrorpolicypycompatosutilc                 @    t          t          j        d| |fz            )Ns!   hardlinks not supported: %s to %s)OSErrorerrnoEINVAL)srcdsts     1/usr/lib/python3/dist-packages/mercurial/posix.pyoslinkr   /   s%    L>#sK
 
 	
    Fc                     |                      dd          }t          |          dk    rd| fS |d                             d          }|r
||d         fS |d         dz   |d         fS )a  Same as posixpath.split, but faster

    >>> import posixpath
    >>> for f in [b'/absolute/path/to/file',
    ...           b'relative/path/to/file',
    ...           b'file_alone',
    ...           b'path/to/directory/',
    ...           b'/multiple/path//separators',
    ...           b'/file_at_root',
    ...           b'///multiple_leading_separators_at_root',
    ...           b'']:
    ...     assert split(f) == posixpath.split(f), f
       /r   r   r   )rsplitlenrstrip)phtnhs      r   splitr   A   sq     
$		B
2ww!||Av	Ad		B	 2a5ya54<Ar   c                      dS )z@return true if it is safe to hold open file handles to hardlinksT r   r   r   openhardlinksr    X   s    4r   c                 4    t          j        |           j        S )z-return number of hardlinks for the given file)oslstatst_nlinknames    r   nlinksr'   ]   s    8D>>""r   c                     | dd         }t           j        dk    r|d         dk    r
|dd         }n8|                    d          r#|                    d          rd	|v r
|dd         }|S )
z<parses the output produced by patch and returns the filename   N   OpenVMSr      `r      '    )r
   sysplatform
startswithendswith)output_linepfs     r   parsepatchoutputr4   b   sz    	RSS	Bz))a5D==AbDB== 	2;;t#4#4 	AbDBIr   c                     |rd||fz  p|}d|dd         v r$t          j        t          d          |z            t          |          }|rdt          |          |fz  }|S )zBuild argument list for sshs   %s@%s   -Nr   s4   illegal ssh hostname or username starting with -: %ss   -p %s %s)r   Abortr   
shellquote)sshcmdhostuserportargss        r   sshargsr>   n   s    -Xt,5DtBQBxkEFFM
 
 	
 dD 6j..55Kr   c                 B    t          j        |           j        dz  dk    S )z"check whether a file is executable@   r   )r"   r#   st_mode)fs    r   isexecrC   {   s    8A;;&!++r   c                    t          j        |           }|j        }|rt          j        |          st          | d          5 }|                                }d d d            n# 1 swxY w Y   t          |            	 t          j        ||            nM# t          $ r@ t          | d          5 }|
                    |           d d d            n# 1 swxY w Y   Y nw xY wd S t          j        |          rkt          j        |           }t          |            t          | d          5 }|
                    |           d d d            n# 1 swxY w Y   dt           z  }|dz  }|j        dk    rt          |          t          |          k    rt          | d          5 }|                                }d d d            n# 1 swxY w Y   t          |            t          | d          5 }|
                    |           d d d            n# 1 swxY w Y   |r+|s)t          j        | ||dz  dz	  t           z  z             d S |s|rt          j        | |dz             d S d S d S )Ns   rbs   wb  r@   r   i$     )r"   r#   rA   statS_ISLNKr   readunlinksymlinkr   writereadlinkumaskr$   boolchmod)rB   lxstsfpdatasxs           r   setflagsrX      s   	!B

A |A 
	#a !2wwyy! ! ! ! ! ! ! ! ! ! ! ! ! ! !1III#
4#### # # #!U^^ #rHHTNNN# # # # # # # # # # # # # # ## 	|A {1~~q			!U^^ 	rHHTNNN	 	 	 	 	 	 	 	 	 	 	 	 	 	 	UFN	
UB	{Q477d2hh..!U^^ 	r7799D	 	 	 	 	 	 	 	 	 	 	 	 	 	 	q			!U^^ 	rHHTNNN	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	   	AUq(E61122222 2 
AI   s~   A##A'*A'>B C.CCC	CC	CC*EEE"GG
G-HHHc                     	 t          j        |           j        dz  }n!# t          $ r |}|t           }|dz  }Y nw xY w|}|r|t
          j        z  }t          j        ||           dS )zCopy the file mode from the file at path src to dst.
    If src doesn't exist, we're using mode instead. If mode is None, we're
    using umask.  NrE   )r"   r#   rA   FileNotFoundErrorrN   rG   S_IWUSRrP   )r   r   modeenforcewritablerA   new_modes         r   copymoder`      s    (3--'%/   ?fG5	 H !DL HS(s    ==c                 x   	 t           j        t           j        z  t           j        z  }t          j                            | d          }t          j                            |d          }t          j                            |d          }t          j                            |          sm	 t	          j        |           t          j                            |          rt          ||           nt          ||           n# t          t          f$ r Y nw xY wt          j                            |          rt          j                            |d          }t          j                            |d          }	 t	          j         |          j        }||z  dk    r	 t	          j         |          j        }nK# t          $ r> t          |d                                           t	          j         |          j        }Y nw xY w||z  dk    rdS t#          |           t#          |           n# t          $ r Y nw xY w|}n| }d	}t%          j        |d
          \  }	}
	 t	          j        |	           t	          j         |
          j        }||z  dk    rjt	          j        |
|dz  |z             t	          j         |
          j        |z  dk    r/|t	          j        |
|           d	}
	 |
t#          |
           dS dS |
t#          |
           d	S d	S # |
t#          |
           w w xY w# t          t          f$ r Y dS w xY w)z}
    Check whether the given path is on a filesystem with UNIX-like exec flags

    Requires a directory (like /foo/.hg)
       .hg   wcaches   stores   checkisexecs   checknoexecr      wTNs   hg-checkexec-dirprefixrZ   F)rG   S_IXUSRS_IXGRPS_IXOTHr"   pathjoinexistsmkdirr`   IOErrorr   isdirrA   r[   r   closerJ   r
   mkstemprP   rename)rk   	EXECFLAGSbasedircachedirstoredircheckisexecchecknoexecmcheckdirfhfns              r   	checkexecr~      s;   BL4</$,>	',,tV,,7<<337<<22w~~h'' 	 """7>>(++ 0Xx0000Wh///W%    7=="" 	',,x@@K',,x@@K$GK((0 y=A%%9GK008, 9 9 9[$//55777GK0089 9}))#t;'''{####% %   *  HH HK!h7GHHHB	HRLLL#A9}!!QY233372;;&2a77".	"k222!~r




 ~r~r




 ~r~r



 W   uus   B%L$ (AC= <L$ =DL$ DA#L$ 5H' 	L$ F2 1L$ 2AG:7L$ 9G::L$ L$ '
H41L$ 3H44#L$ B
L #L$ 8L$ L!!L$ $L98L9c                     	 t           j                            | dd          }t           j                            |d          }t           j                            |          rdS t           j                            |          r|}n| }d}t          j        t          j        |          d          }t          j	        |          }	 d}|;t          j
        |d          }t           j                            |j                  }nWd	}	 t           j                            ||          }t          |d
                                           n# t          $ r Y dS w xY w	 t          j        ||           |t#          |           n6	 t          j        ||           n# t&          $ r t#          |           Y nw xY w	 ||                                 dS dS # t(          $ r Y ||                                 w xY w# ||                                 w w xY w# t*          $ r Y dS t&          $ rN}|j        t,          j        k    r.t           j                            |          rt#          |           Y d}~dS d}~ww xY w)z?check whether the given path is on a symlink-capable filesystemTrb   rc   s	   checklinkNz
checklink-re   s   hg-checklink-s   checklink-targetrd   F)r"   rk   rl   islinkrp   tempfilemktempr
   fsdecodefsencodenamedtempfilebasenamer&   r   rq   PermissionErrorrK   rJ   rs   r   FileExistsErrorAttributeErrorr   EIOrm   )	rk   rv   	checklinkr{   r&   fdtargetfullpathinsts	            r   r   r     s   :7<<fi88GLL<88	7>>)$$ 	47=="" 	HHHH!(++M
 
 
  &&+	B+ )9   ))"'22 -	!!w||Hf==H4((..0000& ! ! ! !55!
64(((#4LLLL%	$	2222" % % %t%
 >HHJJJJJ ">	 #   >HHJJJ >HHJJJJ " 	 	 	55 	 	 	zUY&&27>>$+?+?&t55555		s   AH 	AE H 
EH EH 'G F G F85G 7F88G <H 
G: G= !H 9G::G= =HH 
I=&	I=/AI88I=c                     dS )zCheck that the base-relative path is a valid filename on this platform.
    Returns None if the path is ok, or a UI string describing the problem.Nr   rk   s    r   checkosfilenamer   Q  s	     4r   c                 B     t          t          dd           |           S )zGet the filesystem mount point from a directory (best-effort)

    Returns None if we are unsure. Raises OSError on ENOENT, EPERM, etc.
    getfsmountpointc                     d S Nr   rR   s    r   <lambda>z!getfsmountpoint.<locals>.<lambda>\  s     r   r   r   dirpaths    r   r   r   W  s#    
 >76,nn==gFFFr   c                 B     t          t          dd           |           S )zGet the filesystem type name from a directory (best-effort)

    Returns None if we are unsure. Raises OSError on ENOENT, EPERM, etc.
    	getfstypec                     d S r   r   r   s    r   r   zgetfstype.<locals>.<lambda>d  s    $ r   r   r   s    r   r   r   _  s"    
 876;77@@@r   c                  N    t          j        t          j        d                    S )N )r   
strtolocalgetpassr   r   r   get_passwordr   g  s    wr22333r   c                     d S r   r   )r   s    r   	setbinaryr   k      Dr   c                     | S r   r   r   s    r   pconvertr   o      Kr   c                     | S r   r   r   s    r   	localpathr   s  r   r   c                 B    t           j                            | |          S )zwReturns whether path1 and path2 refer to the same file. This is only
    guaranteed to work for files, not directories.)r"   rk   samefile)fpath1fpath2s     r   r   r   w  s     7FF+++r   c                 r    t          j        |           }t          j        |          }|j        |j        k    S )zyReturns whether fpath1 and fpath2 are on the same device. This is only
    guaranteed to work for files, not directories.)r"   r#   st_dev)r   r   st1st2s       r   
samedevicer   }  s1     (6

C
(6

C:##r   c                 *    |                                  S r   )lowerr   s    r   normcaser     s    ::<<r   c                 j    	 t          j        |           S # t          $ r t          |           cY S w xY w)a  
        Normalize a filename for OS X-compatible comparison:
        - escape-encode invalid characters
        - decompose to NFD
        - lowercase
        - omit ignored characters [200c-200f, 202a-202e, 206a-206f,feff]

        >>> normcase(b'UPPER')
        'upper'
        >>> normcase(b'Caf\xc3\xa9')
        'cafe\xcc\x81'
        >>> normcase(b'\xc3\x89')
        'e\xcc\x81'
        >>> normcase(b'\xb8\xca\xc3\xca\xbe\xc8.JPG') # issue3918
        '%b8%ca%c3\xca\xbe%c8.jpg'
        )r   
asciilowerUnicodeDecodeErrornormcasefallbackr   s    r   r   r     sG    $	*&t,,,! 	* 	* 	*#D)))))	*s    22c           	         	 |                      d          }n# t          $ r d}d}t          |           }||k     rf	 t          j        | |          }|t          |          z  }n2# t
          $ r% dt          | ||dz                      z  }|dz  }Y nw xY w||z  }||k     f|                     d          }Y nw xY wt          j        d|          	                                
                    d          }t          j        |          S )Nzutf-8r   r   s   %%%02Xr   NFD)decoder   r   r   getutf8char
ValueErrorordunicodedata	normalizer   encodehfsignoreclean)rk   urT   posrQ   cencs          r   r   r     s.   	"G$$AA! 	" 	" 	"ACD		A'' ,T377A3q66MCC!   !CS37](;$<$<<A1HCCC Q '' !!AAA	"" #E1--3355<<WEE&s+++s2    #B9'A$#B9$,BB9B#B98B9s   cygwin)s   /usr/bins   /usr/libs	   /cygdriveT)reversec                    t          |           }|dk    s| d         t          j        k    rt          j        |           S t
          D ]h}|                     |          st          |          }||k    r|c S | |         t          j        k    r!|t          j        | |d                    z   c S it          j        |           S )Nr   )r   r
   ossepr   uppercygwinmountpointsr0   )rk   pathlenmpmplens       r   r   r     s    d))qLLd1g77>$''' $ 	9 	9B??2&& GGE			E{hn,,HN4<888888 - ~d###r   c                     dS NFr   r   s    r   r~   r~         ur   c                     dS r   r   r   s    r   r   r     r   r   c                     t           j        dk    rd| z  S t          t          j        d          j        a| rt          |           s| S d|                     dd          z  S )Nr*   s   "%s"s   [^a-zA-Z0-9._/+-]s   '%s'r-   s   '\'')r
   r/   _needsshellquoterecompilesearchreplacerT   s    r   r8   r8     sj    z)){:&;<<C 3!!$$ 342222r   c                 .    t          j        | d          S )z7Parse a command string in POSIX shell way (best-effort)T)posix)r
   
shlexsplitr   s    r   
shellsplitr     s    q----r   c                     t           j        dk    rdS 	 t          j        | d           dS # t          $ r}|j        t
          j        k    cY d}~S d}~ww xY w)z5return False if pid dead, True if running or not surer*   Tr   N)r
   r/   r"   killr   r   ESRCH)pidr   s     r   testpidr     sk    z))t)
Qt ) ) )zU[((((((()s   + 
AA	AAc                 :    | j         t          j                    k    S )z;Return True if the stat object st is from the current user.)st_uidr"   getuidrS   s    r   isownerr     s    9	##r   c                    t           j        dk    r| S d }t           j        | v r ||           S t           j        dk    r) |t          j                            d|                     S t          j                            dd          	                    t           j
                  D ]1} |t          j                            ||                     }||c S 2dS )zFind executable for command searching like which does.
    If command is a basename then PATH is searched for command.
    PATH isn't searched if command is an absolute or relative path.
    If command isn't found None is returned.r*   c                     	 t           j                            |           r!t          j        | t           j                  r| S d S r   )r"   rk   isfileaccessX_OK)
executables    r   findexistingzfindexe.<locals>.findexisting$  s;    27>>*%% 	")J*H*H 	tr   s   plan9s   /bins   PATHr   N)r
   r/   r   r"   rk   rl   r   environgetr   	ospathsep)commandr   rk   r   s       r   findexer     s    
 z))   ~  |G$$$x''|BGLL'::;;; $$Wc22889KLL  !\"',,tW"="=>>
! "4r   c                      d S r   r   r   r   r   setsignalhandlerr   7  r   r   c              #      K   t           j        }t          j        }| D ]E}	  ||          } ||j                  t
          vrd}n# t          t          f$ r d}Y nw xY w|V  FdS )zqStat each file in files. Yield each stat, or None if a file does not
    exist or has a type we don't care about.N)r"   r#   rG   S_IFMTrA   _wantedkindsr[   NotADirectoryError)filesr#   getkindnfrS   s        r   	statfilesr   >  s       HEkG  	rBwrz"",66!#56 	 	 	BBB	 s   $AAAc                  L    t          j        t          j                              S )zreturn name of current user)r
   r   r   getuserr   r   r   r  r  M  s    W_..///r   c                     | t          j                    } 	 t          j        t	          j        |           d                   S # t          $ r d| z  cY S w xY w)ziReturn the name of the user with the given uid.

    If uid is None, return the name of the current user.Nr   s   %d)r"   r   r
   r   pwdgetpwuidKeyError)uids    r   usernamer  R  sd    
 {ikk c!2!21!5666   s{s   +A AAc                     | t          j                    } 	 t          j        t	          j        |           d                   S # t          $ r t          j        |           cY S w xY w)zkReturn the name of the group with the given gid.

    If gid is None, return the name of the current group.Nr   )r"   getgidr
   r   grpgetgrgidr  bytestr)gids    r   	groupnamer  _  sk    
 {ikk% c!2!21!5666 % % %$$$$$%s   +A A$#A$c                     t          j        |           } t          j        t           j        t	          t          j        |           j                            S )zkReturn the list of members of the group with the given
    name, KeyError if the group does not exist.
    )r
   r   rapplyr   listr  getgrnamgr_memr%   s    r   groupmembersr  l  s>     T""D?8,d3<3E3E3L.M.MNNNr   c                 |    t          j        t           j        t          t           dd          z  | d         |           S )NP_DETACHr   )r"   spawnvpP_NOWAITr   )r=   s    r   spawndetachedr  t  s-    :bkGB
A$>$>>QNNNr   c                  *    t           j        d d         S )Nr   )sysargvr   r   r   gethgcmdr  x  s    8BQB<r   c                 .    t          j        |            d S r   )r"   rn   )rk   
notindexeds     r   makedirr!  |  s    HTNNNNNr   c                     d S r   r   )keyr&   scopes      r   	lookupregr%    s    4r   c                      dS )zHide current shell window.

    Used to hide the window opened when starting asynchronous
    child process under Windows, unneeded on other systems.
    Nr   r   r   r   
hidewindowr'    s	     	Dr   c                   4    e Zd Zd Zd Zej        Zd Zd ZdS )	cachestatc                 8    t          j        |          | _        d S r   )r"   rG   )selfrk   s     r   __init__zcachestat.__init__  s    GDMM			r   c                 4    t          | j        j                  S r   )rO   rG   st_ino)r+  s    r   	cacheablezcachestat.cacheable  s    DI$%%%r   c                 R   	 | j         j        |j         j        k    o| j         j        |j         j        k    o| j         j        |j         j        k    o| j         j        |j         j        k    o| j         j        |j         j        k    o| j         j        |j         j        k    oy| j         j        |j         j        k    o_| j         t           j                 |j         t           j                 k    o/| j         t           j	                 |j         t           j	                 k    S # t          $ r Y dS w xY wr   )rG   rA   r.  r   r$   r   st_gidst_sizeST_MTIMEST_CTIMEr   r+  others     r   __eq__zcachestat.__eq__  s    	 	!UZ%77 JI$
(99JI$
(99J I&%**==J I$
(99	J
 I$
(99J I%);;J Idm,
4=0IIJ Idm,
4=0II
  	 	 	55	s   DD 
D&%D&c                     | |k     S r   r   r5  s     r   __ne__zcachestat.__ne__  s    5=  r   N)	__name__
__module____qualname__r,  r/  object__hash__r7  r9  r   r   r   r)  r)    sY        " " "& & & H  *! ! ! ! !r   r)  c                 8    | ot          j        | j                  S )z(check whether a stat result is a symlink)rG   rH   rA   r   s    r   
statislinkr@    s    *$,rz***r   c                 "    | o| j         dz  dk    S )z1check whether a stat result is an executable filer@   r   )rA   r   s    r   
statisexecrB    s    +2:%*+r   c           
          	 t          j         | | |           }n# t          $ r t                      w xY wt          t	          t          t          |g                                         S )zblock until something happens on any file descriptor

    This is a generic helper that will check for any activity
    (read, write.  exception) and return the list of touched files.

    In unsupported cases, it will raise a NotImplementedError)selectr   NotImplementedErrorsortedr  setsum)fdsress     r   pollrK    si    $mCc** $ $ $!###$$s3sB<<(())***s    2c                    t          j         | t           j                  }|t          j        z  }t          j         | t           j        |          }	 g }	 	 |                                 }|sn'|                    |           n# t          $ r Y nw xY w?d                    |          t          j         | t           j        |           S # t          j         | t           j        |           w xY w)z$Read all available data from a pipe.Tr   )	fcntlF_GETFLr"   
O_NONBLOCKF_SETFLrI   appendro   rl   )pipeflagsoldflagschunksrT   s        r   readpiperV    s    
 Kem,,E	R]E{466H3	IIKK a       	 xxD%-2222D%-2222s<   C B *C +B  C 
BC BC "C)c                 x   t           j                            |          \  }}d}	 |r3t          j        dt           j                  }t          j        |           |                     |           |rt          j        |           |rt          j        |           dS dS # |rt          j        |           w w xY w)z1Bind the UNIX domain socket to the specified pathN   .)	r"   rk   r   r   O_DIRECTORYchdirbindfchdirrq   )sockrk   dirnamer   bakwdfds        r   bindunixsocketr`    s    
 d++GXG	 	gdBN33GHW		( 	Ig 	HW	 	7 	HW	s   A B   B9r   r   )NN)\r   rM  r   r  r"   r  r   rD  rG   r  r   r   i18nr   r
   r   r   r   r   r   r	   	importmodr   rk   normpathsamestatabspathlinkr   r   rM   rJ   rs   
removedirsexpandglobsrN   	posixfiler   r    r'   r4   r>   rC   rX   r`   r~   r   r   r   r   r   r   r   r   r   r   r   normcasespecsr   normcasespecr   isdarwinr/   rF  r   r6  r   r8   r   r   r   r   r   S_IFREGS_IFLNKr   r   r  r  r  r  r  r  r!  r%  r'  r)  r@  rB  rK  rV  r`  r   r   r   <module>ro     sC      



 				 



 				   



                              
	(	#	#77
'/

WFF 
 
 


 
 
 
 

 ;		]
 	  .  
# # #
	 	 	
 
 
, , ,
) ) )X   (M M M`> > >B  G G GA A A4 4 4	 	 	    , , ,$ $ $  
 %+  1,* * *. )/L, , ,2 9$$ 	
 	
 	

   $ $ $& )/L      
3 
3 
3. . .
) ) )$ $ $
  6	 	 	 dl+  0 0 0

 
 
 

% 
% 
% 
%O O OO O O       	 	 	! ! ! ! ! ! ! !D+ + +
, , ,
+ + +3 3 32    s    B BB