ó
j·Ã^c           @   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 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 d  d l m Z m Z e rd  d	 l m Z m Z m Z m Z m Z d
 e f d „  ƒ  YZ n  d „  Z d „  Z d „  Z  e	 d „  ƒ Z! e d d d d ƒ Z" e rte" d „  ƒ Z# n e" e j# ƒ Z# d „  Z$ d „  Z% d „  Z& d „  Z' d „  Z( d „  Z) d „  Z* d S(   iÿÿÿÿN(   t   contextmanager(   t   NamedTemporaryFile(   t   retry(   t   PY2(   t   get_path_uid(   t   format_size(   t   MYPY_CHECK_RUNNINGt   cast(   t   Anyt   BinaryIOt   Iteratort   Listt   Uniont   NamedTemporaryFileResultc           B   s   e  Z e d  „  ƒ Z RS(   c         C   s   d  S(   N(    (   t   self(    (    s/   site-packages/pip/_internal/utils/filesystem.pyt   file   s    (   t   __name__t
   __module__t   propertyR   (    (    (    s/   site-packages/pip/_internal/utils/filesystem.pyR      s   c         C   sÚ   t  j d k s t t d ƒ r# t St j j |  ƒ s; t ‚ d  } x’ |  | k rÕ t j j	 |  ƒ r¹ t j
 ƒ  d k r£ y t |  ƒ } Wn t k
 r˜ t SX| d k St j |  t j ƒ SqD |  t j j |  ƒ } }  qD Wt S(   Nt   win32t   geteuidi    (   t   syst   platformt   hasattrt   ost   Truet   patht   isabst   AssertionErrort   Nonet   lexistsR   R   t   OSErrort   Falset   accesst   W_OKt   dirname(   R   t   previoust   path_uid(    (    s/   site-packages/pip/_internal/utils/filesystem.pyt   check_path_owner   s    
c         C   s”   y t  j |  | ƒ Wny t t f k
 r x\ |  | g D]N } y t | ƒ } Wn t k
 r` q7 X| r7 t  j d j t ƒ    ƒ ‚ q7 q7 W‚  n Xd S(   s“   Wrap shutil.copy2() but map errors copying socket files to
    SpecialFileError as expected.

    See also https://bugs.python.org/issue37700.
    s   `{f}` is a socketN(   t   shutilt   copy2R   t   IOErrort	   is_sockett   SpecialFileErrort   formatt   locals(   t   srct   destt   ft   is_socket_file(    (    s/   site-packages/pip/_internal/utils/filesystem.pyt   copy2_fixed;   s    c         C   s   t  j t j |  ƒ j ƒ S(   N(   t   statt   S_ISSOCKR   t   lstatt   st_mode(   R   (    (    s/   site-packages/pip/_internal/utils/filesystem.pyR*   T   s    c      
   k   sˆ   t  d t d t j j |  ƒ d t j j |  ƒ d d |  F } t d | ƒ } z	 | VWd | j j ƒ  t j	 | j j
 ƒ  ƒ XWd QXd S(   s%  Return a file-like object pointing to a tmp file next to path.

    The file is created securely and is ensured to be written to disk
    after the context reaches its end.

    kwargs will be passed to tempfile.NamedTemporaryFile to control
    the way the temporary file will be opened.
    t   deletet   dirt   prefixt   suffixs   .tmpR   N(   R   R    R   R   R#   t   basenameR   R   t   flusht   fsynct   fileno(   R   t   kwargsR0   t   result(    (    s/   site-packages/pip/_internal/utils/filesystem.pyt   adjacent_tmp_fileY   s    		t   stop_max_delayiè  t
   wait_fixediú   c         C   sI   y t  j |  | ƒ Wn. t k
 rD t  j | ƒ t  j |  | ƒ n Xd  S(   N(   R   t   renameR   t   remove(   R.   R/   (    (    s/   site-packages/pip/_internal/utils/filesystem.pyt   replacev   s
    c         C   sm   x> t  j j |  ƒ s@ t  j j |  ƒ } | |  k r7 Pn  | }  q Wt  j d k rc t  j |  t  j ƒ St |  ƒ S(   sg   Check if a directory is writable.

    Uses os.access() on POSIX, tries creating files on Windows.
    t   posix(   R   R   t   isdirR#   t   nameR!   R"   t   _test_writable_dir_win(   R   t   parent(    (    s/   site-packages/pip/_internal/utils/filesystem.pyt   test_writable_dir…   s    
c            s  d } d ‰  xð t  d ƒ D]â } | d j ‡  f d †  t  d ƒ Dƒ ƒ } t j j |  | ƒ } y' t j | t j t j Bt j Bƒ } WnV t k
 rÜ } | j	 t	 j
 k r® q n  | j	 t	 j k sÒ | j	 t	 j k rÖ t S‚  q Xt j | ƒ t j | ƒ t Sq Wt d ƒ ‚ d  S(   Nt(   accesstest_deleteme_fishfingers_custard_t$   abcdefghijklmnopqrstuvwxyz0123456789i
   t    c         3   s   |  ] } t  j ˆ  ƒ Vq d  S(   N(   t   randomt   choice(   t   .0t   _(   t   alphabet(    s/   site-packages/pip/_internal/utils/filesystem.pys	   <genexpr>Ÿ   s    i   s3   Unexpected condition testing for writable directory(   t   ranget   joinR   R   t   opent   O_RDWRt   O_CREATt   O_EXCLR   t   errnot   EEXISTt   EPERMt   EACCESR    t   closet   unlinkR   t   EnvironmentError(   R   R;   t   iRI   R   t   fdt   e(    (   RT   s/   site-packages/pip/_internal/utils/filesystem.pyRJ   ˜   s$    )'$c            s\   g  } xO t  j |  ƒ D]> \ ‰  } } t j | | ƒ } | j ‡  f d †  | Dƒ ƒ q W| S(   s†   Returns a list of absolute paths of files beneath path, recursively,
    with filenames which match the UNIX-style shell glob pattern.c         3   s$   |  ] } t  j j ˆ  | ƒ Vq d  S(   N(   R   R   RV   (   RR   R0   (   t   root(    s/   site-packages/pip/_internal/utils/filesystem.pys	   <genexpr>Á   s    (   R   t   walkt   fnmatcht   filtert   extend(   R   t   patternR@   t   dirst   filest   matches(    (   Re   s/   site-packages/pip/_internal/utils/filesystem.pyt
   find_filesº   s
    !c         C   s&   t  j j |  ƒ r d St  j j |  ƒ S(   Ni    (   R   R   t   islinkt   getsize(   R   (    (    s/   site-packages/pip/_internal/utils/filesystem.pyt	   file_sizeÅ   s    c         C   s   t  t |  ƒ ƒ S(   N(   R   Rq   (   R   (    (    s/   site-packages/pip/_internal/utils/filesystem.pyt   format_file_sizeÍ   s    c         C   sc   d } xV t  j |  ƒ D]E \ } } } x3 | D]+ } t  j j | | ƒ } | t | ƒ 7} q, Wq W| S(   Ng        (   R   Rf   R   RV   Rq   (   R   t   sizeRe   t   _dirsRl   t   filenamet	   file_path(    (    s/   site-packages/pip/_internal/utils/filesystem.pyt   directory_sizeÒ   s    c         C   s   t  t |  ƒ ƒ S(   N(   R   Rw   (   R   (    (    s/   site-packages/pip/_internal/utils/filesystem.pyt   format_directory_sizeÜ   s    (+   R[   Rg   R   t   os.pathRP   R'   R3   R   t
   contextlibR    t   tempfileR   t   pip._vendor.retryingR   t   pip._vendor.sixR   t   pip._internal.utils.compatR   t   pip._internal.utils.miscR   t   pip._internal.utils.typingR   R   t   typingR   R	   R
   R   R   R   R&   R2   R*   RA   t   _replace_retryRF   RL   RJ   Rn   Rq   Rr   Rw   Rx   (    (    (    s/   site-packages/pip/_internal/utils/filesystem.pyt   <module>   s@   (			
		"				
