U
    Ȃe                     @   s  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 d dlmZ d dlmZ d dlmZmZ erd dlmZmZ G d	d
 d
eZdd Zdd Zdd Zedd ZedddZeredd Zn
eejZdd Zdd ZdS )    N)contextmanager)NamedTemporaryFile)retry)PY2)get_path_uid)MYPY_CHECK_RUNNINGcast)BinaryIOIteratorc                   @   s   e Zd Zedd ZdS )NamedTemporaryFileResultc                 C   s   d S N )selfr   r   B/tmp/pip-unpacked-wheel-vuk8uv8f/pip/_internal/utils/filesystem.pyfile   s    zNamedTemporaryFileResult.fileN)__name__
__module____qualname__propertyr   r   r   r   r   r      s   r   c                 C   s   t jdksttdsdS tj| s(td }| |krtj| rt dkrxzt	| }W n t
k
rn   Y dS X |dkS t| tjS q,| tj|  }} q,dS )Nwin32geteuidTr   F)sysplatformhasattrospathisabsAssertionErrorlexistsr   r   OSErroraccessW_OKdirname)r   previouspath_uidr   r   r   check_path_owner   s    r%   c                 C   sr   zt | | W n\ ttfk
rl   | |fD ]8}zt|}W n tk
rP   Y q,X |r,t d| q, Y nX dS )zWrap shutil.copy2() but map errors copying socket files to
    SpecialFileError as expected.

    See also https://bugs.python.org/issue37700.
    z`%s` is a socketN)shutilcopy2r   IOError	is_socketSpecialFileError)srcdestfis_socket_filer   r   r   copy2_fixed9   s    r/   c                 C   s   t t| jS r   )statS_ISSOCKr   lstatst_mode)r   r   r   r   r)   Q   s    r)   c                 c   sb   t dtj| tj| dd8}td|}z
|V  W 5 |j  t|j	  X W 5 Q R X dS )zGiven a path to a file, open a temp file next to it securely and ensure
    it is written to disk after the context reaches its end.
    Fz.tmp)deletedirprefixsuffixr   N)
r   r   r   r"   basenamer   r   flushfsyncfileno)r   r-   resultr   r   r   adjacent_tmp_fileV   s    




r=   i     )stop_max_delay
wait_fixedc                 C   s@   zt | | W n* tk
r:   t | t | | Y nX d S r   )r   renamer   remove)r+   r,   r   r   r   replacem   s
    
rC   c                 C   sH   t j| s(t j| }|| kr"q(|} q t jdkr@t | t jS t| S )zgCheck if a directory is writable.

    Uses os.access() on POSIX, tries creating files on Windows.
    posix)r   r   isdirr"   namer    r!   _test_writable_dir_win)r   parentr   r   r   test_writable_dir|   s    
rI   c                    s   d}d t dD ]}|d fddt dD  }tj| |}zt|tjtjB tjB }W nP tk
r } z2|j	t	j
krW Y  q|j	t	jkrW Y  dS  W 5 d }~X Y qX t| t|  d	S qtd
d S )N(accesstest_deleteme_fishfingers_custard_$abcdefghijklmnopqrstuvwxyz0123456789
    c                 3   s   | ]}t  V  qd S r   )randomchoice).0_alphabetr   r   	<genexpr>   s     z)_test_writable_dir_win.<locals>.<genexpr>   FTz3Unexpected condition testing for writable directory)rangejoinr   r   openO_RDWRO_CREATO_EXCLr   errnoEEXISTEPERMcloseunlinkEnvironmentError)r   r8   irF   r   fder   rR   r   rG      s&     

rG   ) r\   r   os.pathrN   r&   r0   r   
contextlibr   tempfiler   Zpip._vendor.retryingr   Zpip._vendor.sixr   pip._internal.utils.compatr   pip._internal.utils.typingr   r   typingr	   r
   r   r%   r/   r)   r=   _replace_retryrC   rI   rG   r   r   r   r   <module>   s6   
	
