U ÀÒ.e ã @ sè d dl Z d dlZ d dlZd dlZd dlmZ d dlmZ d dlm Z d dl mZ d dlm Z d dlmZ d dlmZ er˜d d lmZmZ G d d„ deƒZdd „ Zdd„ Zdd„ Zedd„ ƒZe dddZerÚedd„ ƒZn ee jƒZdS )é N)Úcontextmanager)ÚNamedTemporaryFile)Úretry)ÚPY2)Úget_path_uid)Úcast)ÚMYPY_CHECK_RUNNING)ÚBinaryIOÚIteratorc @ s e Zd Zedd„ ƒZdS )ÚNamedTemporaryFileResultc C s d S ©N© )Úselfr r úB/usr/lib/python3.8/site-packages/pip/_internal/utils/filesystem.pyÚfile s zNamedTemporaryFileResult.fileN)Ú__name__Ú __module__Ú__qualname__Úpropertyr r r r r r s r c C s† t tdƒsdS d }| |kr‚tj | ¡rnt ¡ dkr^zt| ƒ}W n tk rT Y dS X |dkS t | tj¡S q| tj | ¡ }} qdS )NÚgeteuidTr F) ÚhasattrÚosÚpathÚlexistsr r ÚOSErrorÚaccessÚW_OKÚdirname)r ZpreviousZpath_uidr r r Úcheck_path_owner s r c C sr zt | |¡ W n\ ttfk rl | |fD ]8}zt|ƒ}W n tk rP Y q,X |r,t d| ¡‚q,‚ Y nX dS )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_fixed5 s r% c C s t t | ¡j¡S r )ÚstatÚS_ISSOCKr ÚlstatÚst_mode)r r r r r! M s r! c c sb t dtj | ¡tj | ¡dd8}td|ƒ}z |V W 5 |j ¡ t |j ¡ ¡ X W 5 Q R X dS )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) r r r r Úbasenamer r ÚflushÚfsyncÚfileno)r r$ Úresultr r r Úadjacent_tmp_fileR s ü r3 iè éú )Zstop_max_delayZ wait_fixedc C s@ zt | |¡ W n* tk r: t |¡ t | |¡ Y nX d S r )r Úrenamer Úremove)r" r# r r r Úreplacei s r7 )r Zos.pathr r&