a
    &0_7V                  
   @   s  d dl mZ d dl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
mZmZ ejjZejjZejjZejjZejZejZejZejZejZej Z Z!ej"Z#e#Z$ej"Z%ej&Z'e#dj(Z)d Z*dZ+dZ,dZ-d	Z.d
Z/e0eje0ej"krejZ1ejZ2n&e0ej3e0ej"kr$ej4Z1ej3Z2G dd dej5Z6G dd dej5Z7dZ8dZ9dZ:dZ;dZ<dZ=dZ>dZ?dZ@G dd dej5ZAG dd dej5ZBdZCd ZDG dd dej5ZEG dd dej5ZFG d d! d!ej5ZGed"j(ZHed#j(ZId$ZJdZKd$ZLG d%d& d&ej5ZMG d'd( d(ej5ZNG d)d* d*ej5ZOeejegejP_Qe%ejP_Rej"e%ej"ej"ej"eej"ej"gejS_QeejS_Re%gejT_QeejT_Re eeej"eee#gejU_Qe#ejU_Re#ej"gejV_QeejV_Re#gejW_QeejW_Rze e ej"gejX_QeejX_RW n eYy   Y n0 e egejZ_QeejZ_Rd Z[dZ\dZ]dZ^dZ_d+Z`d,Zae gejb_Qeejb_Re ej"eej"ej"ej"ej"egejc_Qeejc_Re ej"egejd_Qeejd_Reeegeje_Qe#eje_Re#ej"gejf_Qeejf_Rg ejg_Qeejg_Re#ej"egejh_Qeejh_Re e ej"ej"eeej"e ej"ej"g
eji_Qeeji_Regejj_Qdejj_Rg ejk_Qeejk_ReleeZmemegejn_Qeejn_Re#egejo_Qeejo_Re#ej"gejp_Qeejp_Regejq_Qe#ejq_Re#ej"gejr_Qeejr_Rej"ej"gejs_Qeejs_Re#ej"gejt_Qeejt_Re#ejugejv_Qeejv_Relee$e2Zwewe2gejx_Qeejx_Re#ej"eej"ej"ej"gejy_Qeejy_Rd-d. Zzd/d0 Z{dXd2d3Z|d4d5 Z}d6d7 Z~d8d9 Zd:d; Zd<d= Zd>d? Zd@dA ZdBdC ZdDdE ZdFdG ZdHdI Zg ZdJdK ZdLdM ZdNdO ZdPdQ ZdRdS ZdTdU ZdVdW ZdS )Y    )absolute_importN   )encodingpycompat   W   m   z      c                   @   s   e Zd ZdefdefgZdS )	_FILETIMEZdwLowDateTimeZdwHighDateTimeN)__name__
__module____qualname___DWORD_fields_ r   r   1/usr/lib/python3/dist-packages/mercurial/win32.pyr   ;   s   r   c                   @   sL   e Zd Zdefdefdefdefdefdefdefdefd	efd
efg
ZdS )_BY_HANDLE_FILE_INFORMATIONZdwFileAttributesZftCreationTimeZftLastAccessTimeZftLastWriteTimedwVolumeSerialNumberZnFileSizeHighZnFileSizeLownNumberOfLinksnFileIndexHighnFileIndexLowN)r   r   r   r   r   r   r   r   r   r   r   ?   s   r            i      i    i   i  c                   @   s~   e Zd Zdefdefdefdefdefdefdefdefd	efd
efdefdefdefdefdejfdefdefdefgZ	dS )_STARTUPINFOcbZ
lpReservedZ	lpDesktopZlpTitleZdwXZdwYZdwXSizeZdwYSizeZdwXCountCharsZdwYCountCharsZdwFillAttributeZdwFlagsZwShowWindowZcbReserved2ZlpReserved2Z	hStdInputZ
hStdOutputZ	hStdErrorN)
r   r   r   r   _LPSTR_WORDctypesc_char_p_HANDLEr   r   r   r   r   r   b   s&   r   c                   @   s(   e Zd ZdefdefdefdefgZdS )_PROCESS_INFORMATIONhProcesshThreaddwProcessIdZ
dwThreadIdN)r   r   r   r#   r   r   r   r   r   r   r$   y   s
   r$   i   c                   @   s    e Zd ZdejfdejfgZdS )_COORDXYNr   r   r   r!   Zc_shortr   r   r   r   r   r(      s   r(   c                   @   s0   e Zd ZdejfdejfdejfdejfgZdS )_SMALL_RECTLeftTopRightBottomNr+   r   r   r   r   r,      s
   r,   c                   @   s.   e Zd ZdefdefdefdefdefgZdS )_CONSOLE_SCREEN_BUFFER_INFOZdwSizeZdwCursorPositionZwAttributessrWindowZdwMaximumWindowSizeN)r   r   r   r(   r    r,   r   r   r   r   r   r1      s   r1   iii   c                
   @   sJ   e Zd Zdefdefdefdefdejfdefdejfdefd	eff	Zd
S )CERT_CHAIN_CONTEXTcbSizedwErrorStatusZdwInfoStatusZcChainZrgpChainZcLowerQualityChainContextZrgpLowerQualityChainContextZfHasRevocationFreshnessTimedwRevocationFreshnessTimeN)r   r   r   r   r!   c_void_p_BOOLr   r   r   r   r   r3      s   r3   c                   @   s$   e Zd ZdefdefdejffZdS )CERT_USAGE_MATCHZdwTypeZcUsageIdentifierZrgpszUsageIdentifierN)r   r   r   r   r!   r7   r   r   r   r   r   r9      s   r9   c                
   @   sJ   e Zd Zdefdefdefdefdefdefdejfdejfd	eff	Zd
S )CERT_CHAIN_PARAr4   RequestedUsageZRequestedIssuancePolicyZdwUrlRetrievalTimeoutZfCheckRevocationFreshnessTimer6   ZpftCacheResyncZpStrongSignParaZdwStrongSignFlagsN)	r   r   r   r   r9   r8   r!   r7   r   r   r   r   r   r:      s   r:         c                 C   sD   t  }|dkr|d8 }tj|d}t|jdt| |jf d S )Nil        )codez%s: %s)		_kernel32GetLastErrorr!   WinErrorOSErrorerrnor   strfromlocalstrerror)namer>   errr   r   r   _raiseoserrorb  s    rH   c              	   C   sp   t | dttB tB d ttd }|tkr.t|  z0t	 }t 
|t|sPt|  |W t | S t | 0 d S Nr   )r?   CreateFileA_FILE_SHARE_READ_FILE_SHARE_WRITE_FILE_SHARE_DELETE_OPEN_EXISTING_FILE_FLAG_BACKUP_SEMANTICS_INVALID_HANDLE_VALUErH   r   GetFileInformationByHandler!   byrefCloseHandle)rF   ZfhZfir   r   r   _getfileinfon  s&    
	
rT   Tc                 C   s   t t}| }tt tt d}tt| t	| }|du rFt
d d}|sV|dO }zftd|ddt ||dt |st
d |j}|jt@ dkW |rt| t| S t| n|rt| t| 0 dS )a  Tests the given certificate to see if there is a complete chain to a
       trusted root certificate.  As a side effect, missing certificates are
       downloaded and installed unless ``build=False``.  True is returned if a
       chain to a trusted root exists (even if built on the fly), otherwise
       False.  NB: A chain to a trusted root does NOT imply that the certificate
       is valid.
    )r4   r;   Ns   CertCreateCertificateContextr      s   CertGetCertificateChain)r!   ZPOINTERr3   r:   sizeofr9   _crypt32CertCreateCertificateContextX509_ASN_ENCODINGlenrH   CertGetCertificateChainrR   contentsr5   CERT_TRUST_IS_PARTIAL_CHAINZCertFreeCertificateChainCertFreeCertificateContext)ZcertZbuildZchainctxptrZ	pchainctxZ	chainparaZcertctxflagsZchainctxr   r   r   checkcertificatechain  sJ    	




  
r`   c                 C   s:   zt || d st|  W n ty4   t|  Y n0 d S N)r?   CreateHardLinkArH   AttributeError)srcZdstr   r   r   oslink  s
    re   c                 C   s
   t | jS )z-return number of hardlinks for the given file)rT   r   )rF   r   r   r   nlinks  s    rf   c                 C   s4   t | }t |}|j|jko2|j|jko2|j|jkS )zDReturns whether path1 and path2 refer to the same file or directory.)rT   r   r   r   Zpath1Zpath2Zres1Zres2r   r   r   samefile  s    

rh   c                 C   s   t | }t |}|j|jkS )z7Returns whether path1 and path2 are on the same device.)rT   r   rg   r   r   r   
samedevice  s    ri   c              	   C   sR   t |  }t }t|d dd t|d sLt }|t	krBdS t
||jS rI   )msvcrtZget_osfhandlefilenor   r?   PeekNamedPiper!   rR   r@   _ERROR_BROKEN_PIPErA   value)pipehandleZavailrG   r   r   r   peekpipe  s    
rq   c                 C   s(   | j t jkrdS t } | tkp&| tkS )NF)rC   ZEINVALr?   r@   rm   _ERROR_NO_DATA)rG   r   r   r   lasterrorwaspipeerror  s    rs   c              	   C   sh   t td| }|r\z<t }t |t|rB|jtkW t 	| S W t 	| nt 	| 0 t 
 tkS )zOreturn True if pid is still running or unable to
    determine, False otherwiseF)r?   OpenProcess_PROCESS_QUERY_INFORMATIONr   GetExitCodeProcessr!   rR   rn   _STILL_ACTIVErS   r@   _ERROR_INVALID_PARAMETER)pidhZstatusr   r   r   testpid  s    

r{   c                  C   sP   d} t | d }tdt || }|dkr8t  n|| krJt t|jS )zreturn full path of hg.exeiX  r   Nr   )r!   create_string_bufferr?   GetModuleFileNameArR   rA   _ERROR_INSUFFICIENT_BUFFERrn   )sizebufrZ   r   r   r   executablepath  s    

r   c                 C   sJ   t j| }tt|td }t|}t	|t
||sDt |jS )zGet the mount point of the filesystem from a directory or file
    (best-effort)

    Returns None if we are unsure. Raises OSError on ENOENT, EPERM, etc.
    r   )ospathrealpathmaxrZ   	_MAX_PATHr!   r|   r?   GetVolumePathNameArR   rA   rn   )r   r   r   r   r   r   r   getvolumename  s    
r   c                 C   sp   t | }t|}|tkrdS |ttttfvr2dS td }t	
|}t|dddddt	||sjt	 |jS )zGet the filesystem type name from a directory or file (best-effort)

    Returns None if we are unsure. Raises OSError on ENOENT, EPERM, etc.
    s   cifsNr   r   )r   r?   GetDriveTypeA_DRIVE_REMOTE_DRIVE_REMOVABLE_DRIVE_FIXED_DRIVE_CDROM_DRIVE_RAMDISKr   r!   r|   GetVolumeInformationArR   rA   rn   )r   Zvolumetr   rF   r   r   r   	getfstype  s$    

r   c                  C   s>   t d} t| jd }tt|t| s8t |jS )zreturn name of current useri,  r   )r   r!   r|   rn   	_advapi32GetUserNameArR   rA   )r   r   r   r   r   getuser6  s
    r   c                  C   s:   dd } t rdS t| }t | t|ds6t dS )zRegister a termination handler for console events including
    CTRL+C. python signal handlers do not work well with socket
    operations.
    c                 S   s   t d d S )Nr   )r?   ExitProcess)Zeventr   r   r   handlerH  s    z!setsignalhandler.<locals>.handlerNT)_signalhandler_SIGNAL_HANDLERappendr?   SetConsoleCtrlHandlerr!   rA   )r   rz   r   r   r   setsignalhandlerB  s    
r   c                  C   s$   dd } t  }tt| | d S )Nc                 S   s6   t  }t| t| ||jkr2t| t dS dS )NFT)r   _user32GetWindowThreadProcessIdr!   rR   rn   
ShowWindow_SW_HIDE)Zhwndry   wpidr   r   r   callbackT  s    
zhidewindow.<locals>.callback)r?   GetCurrentProcessIdr   EnumWindows_WNDENUMPROC)r   ry   r   r   r   
hidewindowS  s    r   c                  C   sv   d} d}t t}|d u s"|tkr*| |fS t }t |t|sJ| |fS |jj	|jj
 } |jj|jj d }| |fS )NO      r   )r?   GetStdHandle_STD_ERROR_HANDLErP   r1   GetConsoleScreenBufferInfor!   rR   r2   r/   r-   r0   r.   )widthZheightZ	screenbufZcsbir   r   r   termsize`  s    r   c                  C   sh   d} t t}|tkrdS td}t |t|s8dS |j| @ dkrd| j| O  _t 	||sddS dS )zaEnable virtual terminal mode for the associated console.  Return True if
    enabled, else False.r   Fr   T)
r?   r   _STD_OUTPUT_HANDLErP   r   GetConsoleModer!   rR   rn   SetConsoleMode)Z"ENABLE_VIRTUAL_TERMINAL_PROCESSINGrp   moder   r   r   enablevtmodeu  s    r   c                 C   s   t  }tt |_t }d}tjD ]}|d|tj| f 7 }q"|sFd}|d7 }tt	
tj| } td t| d d dt|t t|t|
}|st t|j t|j |jS )N    s   %s=%s     F)r   r!   rV   r   r$   r   environ
subprocessZlist2cmdliner   ZrapplyrD   r?   CreateProcessAZ
strtolocal_CREATE_NO_WINDOWgetcwdrR   rA   rS   r%   r&   r'   )argsZsiZpienvkresr   r   r   spawndetached  s6    
r   c                 C   s   t j| r"ttjdt|  t	dD ]b}d| t
ddf }zt | | W  qW q, ty } z|jtjkrx W Y d}~q,d}~0 0 q,ttjdzt | W n@ ty   t|t zt | W n ty   Y n0 Y n0 dS )z3try to implement POSIX' unlink semantics on Windowsz'Unlinking directory not permitted: '%s'
   s   %s-%08xr   l    Nz"No usable temporary filename found)r   r   isdirIOErrorrC   ZEPERMr   rD   r   ZxrangerandomZrandintrenamerB   ZEEXISTunlinkr?   SetFileAttributesA_FILE_ATTRIBUTE_NORMAL)fZtriesZtemper   r   r   r     s0    
r   c                 C   s   t |  |rt| t d S ra   )r   mkdirr?   r   #_FILE_ATTRIBUTE_NOT_CONTENT_INDEXED)r   Z
notindexedr   r   r   makedir  s    
r   )T)Z
__future__r   r!   Zctypes.wintypesZwintypesrC   rj   r   r   r    r   r   ZwindllZkernel32r?   Zadvapi32r   Zuser32r   Zcrypt32rW   Zc_longr8   Zc_ushortr    Zc_ulongr   Zc_uintZ_UINTZ_LONGr"   Z_LPCSTRr   r7   r#   Z_HWNDZ_PCCERT_CONTEXTZMAX_PATHr   rn   rP   Z_ERROR_SUCCESSZ_ERROR_NO_MORE_FILESrx   rm   r~   rr   rV   Z_WPARAMZ_LPARAMZ
c_longlongZc_ulonglongZ	Structurer   r   rK   rL   rM   rN   rO   r   r   ru   rw   r   r$   r   r   r(   r,   r1   r   r   r]   rY   ZPKCS_7_ASN_ENCODINGr3   r9   r:   rX   argtypesZrestyper[   r^   rJ   rQ   rS   rb   rc   r   Z_DRIVE_UNKNOWNZ_DRIVE_NO_ROOT_DIRr   r   r   r   r   r   r   r   rt   rv   r@   r}   r   r   r   ZWINFUNCTYPEr   r   r   r   r   r   r   r   Zc_intr   r   r   rl   rH   rT   r`   re   rf   rh   ri   rq   rs   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s  

		


	

	





2	*8