3

g                 @   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-v59g9nu1/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 rdS tjj| s*td }xp| |krtjj| rtj dkrzyt	| }W n t
k
rp   dS X |dkS tj| tjS q0| tjj|  }} q0W 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   sv   yt j| | W n` ttfk
rp   xD| |gD ]8}yt|}W n tk
rR   Y q.X |r.t jd| q.W  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 jtj| jS )N)statS_ISSOCKr   lstatst_mode)r   r   r   r   r(   Q   s    r(   c             c   sb   t dtjj| tjj| dd8}td|}z
|V  W d|jj  tj|jj	  X W d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@   yt j| | W n* tk
r:   t j| t j| | Y nX d S )N)r   renamer   remove)r*   r+   r   r   r   replacem   s
    
rB   c             C   sL   x*t jj| s*t jj| }|| kr$P |} qW t jdkrDt j| 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    
rH   c                s   d}d xt dD ]}|dj fddt dD  }tjj| |}ytj|tjtjB tjB }W nB tk
r } z&|j	t	j
krw|j	t	jkrdS  W Y d d }~X qX tj| tj| d	S qW td
d S )N(accesstest_deleteme_fishfingers_custard_$abcdefghijklmnopqrstuvwxyz0123456789
    c             3   s   | ]}t j V  qd S )N)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   r7   irE   r   fder   )rQ   r   rF      s$     

rF   ) rZ   r   os.pathrM   r%   r/   r   
contextlibr   tempfiler   pip._vendor.retryingr   pip._vendor.sixr   pip._internal.utils.compatr   pip._internal.utils.typingr   r   typingr	   r
   r   r$   r.   r(   r<   _replace_retryrB   rH   rF   r   r   r   r   <module>   s2   

