U ��.e �@s�ddlZddlZddlZddlZddlmZddlmZddlm Z ddl m Z ddl m Z ddlmZddlmZer�dd lmZmZGd d �d e�Zd d �Zdd�Zdd�Zedd��Ze ddd�Ze r�edd��Zn eej�ZdS)�N)�contextmanager)�NamedTemporaryFile)�retry)�PY2)� get_path_uid)�cast)�MYPY_CHECK_RUNNING)�BinaryIO�Iteratorc@seZdZedd��ZdS)�NamedTemporaryFileResultcCsdS�N�)�selfr r �B/usr/lib/python3.8/site-packages/pip/_internal/utils/filesystem.py�fileszNamedTemporaryFileResult.fileN)�__name__� __module__� __qualname__�propertyrr r r rr sr cCs�ttd�sdSd}||kr�tj�|�rnt��dkr^z t|�}Wntk rTYdSX|dkSt�|tj�Sq|tj� |�}}qdS)N�geteuidTrF) �hasattr�os�path�lexistsrr�OSError�access�W_OK�dirname)rZpreviousZpath_uidr r r�check_path_owners    rc Csrzt�||�Wn\ttfk rl||fD]8}z t|�}Wntk rPYq,X|r,t�d|��q,�YnXdS)z�Wrap shutil.copy2() but map errors copying socket files to SpecialFileError as expected. See also https://bugs.python.org/issue37700. z`%s` is a socketN)�shutilZcopy2r�IOError� is_socketZSpecialFileError)�src�dest�fZis_socket_filer r r� copy2_fixed5s  r%cCst�t�|�j�Sr )�stat�S_ISSOCKr�lstat�st_mode)rr r rr!Msr!c csbtdtj�|�tj�|�dd��8}td|�}z |VW5|j��t�|j� ��XW5QRXdS)z�Given 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) rrrr�basenamerr�flush�fsync�fileno)rr$�resultr r r�adjacent_tmp_fileRs  �   r3i���)Zstop_max_delayZ wait_fixedcCs@zt�||�Wn*tk r:t�|�t�||�YnXdSr )r�renamer�remove)r"r#r r r�replaceis  r7)rZos.pathrr&� contextlibrZtempfilerZpip._vendor.retryingrZpip._vendor.sixrZpip._internal.utils.compatrZpip._internal.utils.miscrZpip._internal.utils.typingr�typingr r r rr%r!r3Z_replace_retryr7r r r r�s.