B
    =)H[Ñ…  ã               @   sv  d dl m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
Z
d dlZd dlZd dlZd dlmZmZmZ d dlmZ d dlmZ d dlmZ d dlmZmZ d dlmZmZ d d	lmZ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. d dl/m0Z0 d dl1Z1d dl2m3Z3 d dl4m5Z5m6Z6 d dl7m8Z8 d dl9m:Z: d dl;m<Z< d dl=m>Z> d dl?m@Z@ d dlAmBZB d dlCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZN d dlOmPZP d dlQmRZR d dlSmTZT d dlUmVZV yd dlWZWW n eXk
�r   dZWY nX eWdk	�p$e0ZYddd d!d"d#d$d%d&d'd(gZZe [e\¡Z]d)d*„ Z^G d+d,„ d,eƒZ_G d-d.„ d.eƒZ`G d/d0„ d0eƒZaG d1d2„ d2eƒZbG d3d4„ d4ejcƒZddVd5d„Zee fd6ejg¡Zhe fd7ejg¡Zid8d„ Zjd9d „ Zkd:d!„ Zld;d"„ Zmd<d#„ Znd=d>„ Zod?d%„ Zpd@d&„ ZqdAdB„ ZrdCdD„ ZsdEdF„ ZtdGdH„ ZudWdJd'„ZvdXdKd$„ZwdLdM„ ZxG dNdO„ dOe&jyƒZzdYdQd(„Z{dRdS„ Z|dTdU„ Z}dS )Zé    )Úabsolute_importN)ÚrequestsÚsixÚurllib3)ÚCacheControlAdapter)Ú	FileCache)Ú	LockError)ÚBaseAdapterÚHTTPAdapter)ÚAuthBaseÚHTTPBasicAuth)ÚCONTENT_CHUNK_SIZEÚResponse)ÚCaseInsensitiveDict)Úget_netrc_auth)Úxmlrpc_client)Úparse)Úrequest)Úunquote)ÚIS_PYOPENSSL)ÚWINDOWS)ÚHashMismatchÚInstallationError)Úwrite_delete_marker_file)ÚPyPI)Úauto_decode)Úcheck_path_owner)Úlibc_ver)Ú
indent_log)ÚARCHIVE_EXTENSIONSÚask_path_existsÚ
backup_dirÚcall_subprocessÚconsumeÚdisplay_pathÚformat_sizeÚget_installed_versionÚrmtreeÚsplitextÚunpack_file)ÚSETUPTOOLS_SHIM)ÚTempDirectory)ÚDownloadProgressProvider)ÚvcsÚget_file_contentÚis_urlÚurl_to_pathÚpath_to_urlÚis_archive_fileÚunpack_vcs_linkÚunpack_file_urlÚ
is_vcs_urlÚis_file_urlÚunpack_http_urlÚ
unpack_urlc              C   s  dt jdœt ¡ dt ¡ idœ} | d d dkrBt ¡ | d d< n’| d d dkr’tjjd	krntjd
d… }ntj}d dd„ |D ƒ¡| d d< nB| d d dkr´t ¡ | d d< n | d d dkrÔt ¡ | d d< tj 	d¡�rJddl
m} ttdd„ tdddg| ¡ ƒƒƒ}ttdd„ tddgtƒ ƒƒƒ}|�r<||d< |�rJ|| d< tj 	d¡�r|t ¡ d �r|dt ¡ d dœ| d< t ¡ �ršt ¡ |  di ¡d< t ¡ �r¸t ¡ |  di ¡d< t ¡ �rÎt ¡ | d< t�rÞtj| d < td!ƒ}|d
k	�rø|| d"< d#j| tj| d$d%d&�d'�S )(z6
    Return a string representing the user agent.
    Úpip)ÚnameÚversionr:   )Ú	installerÚpythonÚimplementationr>   ÚCPythonr;   ÚPyPyÚfinalNé   Ú.c             S   s   g | ]}t |ƒ‘qS © )Ústr)Ú.0ÚxrD   rD   úWC:\Users\HIRONO~1\AppData\Local\Temp\pip-install-qz7kpjmn\pip\pip\_internal\download.pyú
<listcomp>X   s    zuser_agent.<locals>.<listcomp>ÚJythonÚ
IronPythonÚlinuxr   )Údistroc             S   s   | d S )Né   rD   )rG   rD   rD   rH   Ú<lambda>d   s    zuser_agent.<locals>.<lambda>Úidc             S   s   | d S )NrN   rD   )rG   rD   rD   rH   rO   h   s    ÚlibÚlibcrM   ÚdarwinÚmacOSÚsystemÚreleaseÚcpuÚopenssl_versionÚ
setuptoolsÚsetuptools_versionz9{data[installer][name]}/{data[installer][version]} {json})ú,ú:T)Ú
separatorsÚ	sort_keys)ÚdataÚjson)r9   Ú__version__ÚplatformÚpython_versionÚpython_implementationÚsysÚpypy_version_infoÚreleaselevelÚjoinÚ
startswithÚpip._vendorrM   ÚdictÚfilterÚzipÚlinux_distributionr   Úmac_verrU   Ú
setdefaultrV   ÚmachineÚHAS_TLSÚsslÚOPENSSL_VERSIONr&   Úformatr`   Údumps)r_   rf   rM   Údistro_infosrR   rZ   rD   rD   rH   Ú
user_agentD   sV    





rx   c               @   s.   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
S )ÚMultiDomainBasicAuthTc             C   s   || _ i | _d S )N)Ú	promptingÚ	passwords)Úselfrz   rD   rD   rH   Ú__init__‹   s    zMultiDomainBasicAuth.__init__c             C   sÖ   t  |j¡}|j dd¡d }t  |d d… |f |dd …  ¡|_| j |d¡\}}|d krn|  |j¡\}}|d kr˜|d kr˜t	|jƒ}|r�|nd\}}|s |rÄ||f| j|< t
|p¶d|p¼dƒ|ƒ}| d| j¡ |S )Nú@rN   éÿÿÿÿé   )NNÚ Úresponse)Úurllib_parseÚurlparseÚurlÚnetlocÚrsplitÚ
urlunparser{   ÚgetÚparse_credentialsr   r   Úregister_hookÚ
handle_401)r|   ÚreqÚparsedr†   ÚusernameÚpasswordÚ
netrc_authrD   rD   rH   Ú__call__�   s    &
zMultiDomainBasicAuth.__call__c             K   s    |j dkr|S | js|S t |j¡}tj d|j ¡}t	 	d¡}|sH|rX||f| j
|j< |j |j ¡  t|ppd|pvdƒ|jƒ}|jj|f|Ž}|j |¡ |S )Ni‘  zUser for %s: z
Password: r�   )Ústatus_coderz   rƒ   r„   r…   r   ÚmovesÚinputr†   Úgetpassr{   ÚcontentÚrawÚrelease_connr   r   Ú
connectionÚsendÚhistoryÚappend)r|   ÚrespÚkwargsrŽ   r�   r�   r�   Únew_resprD   rD   rH   rŒ   °   s    


zMultiDomainBasicAuth.handle_401c             C   sP   d|krL|  dd¡d }d|kr@| dd¡\}}t|ƒt|ƒfS t|ƒd fS dS )Nr~   rN   r   r\   )NN)r‡   ÚsplitÚurllib_unquote)r|   r†   ÚuserinfoÚuserÚpwdrD   rD   rH   rŠ   Ò   s    z&MultiDomainBasicAuth.parse_credentialsN)T)Ú__name__Ú
__module__Ú__qualname__r}   r’   rŒ   rŠ   rD   rD   rD   rH   ry   ‰   s   
!"ry   c               @   s   e Zd Zddd„Zdd„ ZdS )ÚLocalFSAdapterNc          
   C   s®   t |jƒ}tƒ }d|_|j|_yt |¡}	W n. tk
rZ }
 zd|_|
|_W d d }
~
X Y nPX tj	j
|	jdd�}t |¡d p~d}t||	j|dœƒ|_t|dƒ|_|jj|_|S )	NéÈ   i”  T)Úusegmtr   z
text/plain)zContent-TypezContent-LengthzLast-ModifiedÚrb)r0   r…   r   r“   ÚosÚstatÚOSErrorr˜   ÚemailÚutilsÚ
formatdateÚst_mtimeÚ	mimetypesÚ
guess_typer   Úst_sizeÚheadersÚopenÚclose)r|   r   ÚstreamÚtimeoutÚverifyÚcertÚproxiesÚpathnamerž   ÚstatsÚexcÚmodifiedÚcontent_typerD   rD   rH   r›   Þ   s$    

zLocalFSAdapter.sendc             C   s   d S )NrD   )r|   rD   rD   rH   r¹   ù   s    zLocalFSAdapter.close)NNNNN)r¦   r§   r¨   r›   r¹   rD   rD   rD   rH   r©   Ü   s    
r©   c                   sD   e Zd ZdZ‡ fdd„Z‡ fdd„Z‡ fdd„Z‡ fdd	„Z‡  ZS )
ÚSafeFileCachezw
    A file based cache which is safe to use even when the target directory may
    not be accessible or writable.
    c                s4   t t| ƒj||Ž t| jƒs0t d| j¡ d | _d S )NzßThe directory '%s' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.)ÚsuperrÄ   r}   r   Ú	directoryÚloggerÚwarning)r|   ÚargsrŸ   )Ú	__class__rD   rH   r}     s    
zSafeFileCache.__init__c          
      s@   | j d krd S ytt| ƒj||ŽS  tttfk
r:   Y nX d S )N)rÆ   rÅ   rÄ   r‰   r   r¯   ÚIOError)r|   rÉ   rŸ   )rÊ   rD   rH   r‰     s    
zSafeFileCache.getc          
      s@   | j d krd S ytt| ƒj||ŽS  tttfk
r:   Y nX d S )N)rÆ   rÅ   rÄ   Úsetr   r¯   rË   )r|   rÉ   rŸ   )rÊ   rD   rH   rÌ   $  s    
zSafeFileCache.setc          
      s@   | j d krd S ytt| ƒj||ŽS  tttfk
r:   Y nX d S )N)rÆ   rÅ   rÄ   Údeleter   r¯   rË   )r|   rÉ   rŸ   )rÊ   rD   rH   rÍ   1  s    
zSafeFileCache.delete)	r¦   r§   r¨   Ú__doc__r}   r‰   rÌ   rÍ   Ú__classcell__rD   rD   )rÊ   rH   rÄ   ý   s
   rÄ   c               @   s   e Zd Zdd„ ZdS )ÚInsecureHTTPAdapterc             C   s   d|_ d |_d S )NÚ	CERT_NONE)Ú	cert_reqsÚca_certs)r|   Úconnr…   r¼   r½   rD   rD   rH   Úcert_verifyA  s    zInsecureHTTPAdapter.cert_verifyN)r¦   r§   r¨   rÕ   rD   rD   rD   rH   rÐ   ?  s   rÐ   c                   s,   e Zd ZdZ‡ fdd„Z‡ fdd„Z‡  ZS )Ú
PipSessionNc       	         sÚ   |  dd¡}|  dd ¡}|  dg ¡}tt| ƒj||Ž tƒ | jd< tƒ | _tj	|dddd	gd
d�}|r|t
t|dd�|d�}n
t|d�}t|d�}|  d|¡ |  d|¡ |  dtƒ ¡ x|D ]}|  d |¡|¡ q¼W d S )NÚretriesr   ÚcacheÚinsecure_hostsz
User-Agentiô  i÷  i  i  g      Ð?)ÚtotalÚstatus_forcelistÚbackoff_factorT)Úuse_dir_lock)rØ   Úmax_retries)rÞ   zhttps://zhttp://zfile://zhttps://{}/)ÚpoprÅ   rÖ   r}   rx   r·   ry   Úauthr   ÚRetryr   rÄ   r
   rÐ   Úmountr©   ru   )	r|   rÉ   rŸ   r×   rØ   rÙ   Úsecure_adapterÚinsecure_adapterÚhost)rÊ   rD   rH   r}   J  s*    





zPipSession.__init__c                s(   |  d| j¡ tt| ƒj||f|ž|ŽS )Nr»   )rp   r»   rÅ   rÖ   r   )r|   Úmethodr…   rÉ   rŸ   )rÊ   rD   rH   r   ˆ  s    zPipSession.request)r¦   r§   r¨   r»   r}   r   rÏ   rD   rD   )rÊ   rH   rÖ   F  s   >rÖ   c       
   
   C   sL  |dkrt dƒ‚t | ¡}|rè| d¡ ¡ }|dkrR|rR| d¡rRtd|| f ƒ‚|dkrÊ|  dd¡d }| dd	¡}t	 
|¡}|r¢| d¡d | d
d¡d  }t |¡}| d	¡rÄd	| d	¡ }|} n| | ¡}| ¡  |j|jfS y&t| dƒ�}t| ¡ ƒ}W dQ R X W n4 tk
�rB }	 ztdt|	ƒ ƒ‚W dd}	~	X Y nX | |fS )a*  Gets the content of a file; it may be a filename, file: URL, or
    http: URL.  Returns (location, content).  Content is unicode.

    :param url:         File path or url.
    :param comes_from:  Origin description of requirements.
    :param session:     Instance of pip.download.PipSession.
    NzAget_file_content() missing 1 required keyword argument: 'session'rN   ÚfileÚhttpz6Requirements file %s references URL %s, which is localr\   ú\ú/ú|r¬   z$Could not open requirements file: %s)Ú	TypeErrorÚ
_scheme_reÚsearchÚgroupÚlowerri   r   r¡   ÚreplaceÚ_url_slash_drive_reÚmatchrƒ   r   Úlstripr‰   Úraise_for_statusr…   Útextr¸   r   ÚreadrË   rE   )
r…   Ú
comes_fromÚsessionró   ÚschemeÚpathrž   Úfr—   rÁ   rD   rD   rH   r.   �  s>    





 z^(http|https|file):z/*([a-z])\|c             C   s6   d| krdS |   dd¡d  ¡ }|ddddgtj kS )	z)Returns true if the name looks like a URLr\   FrN   r   rè   Úhttpsrç   Úftp)r¡   rð   r-   Úall_schemes)r:   rú   rD   rD   rH   r/   Â  s    c             C   sH   |   d¡std|  ƒ‚t | ¡\}}}}}|r6d| }t || ¡}|S )z(
    Convert a file: URL to a path.
    zfile:z4You can only turn file: urls into filenames (not %r)z\\)ri   ÚAssertionErrorrƒ   ÚurlsplitÚurllib_requestÚurl2pathname)r…   Ú_r†   rû   rD   rD   rH   r0   Ê  s    
c             C   s*   t j t j | ¡¡} t dt | ¡¡}|S )zh
    Convert a path to a file: URL.  The path will be made absolute and have
    quoted path parts.
    zfile:)r­   rû   ÚnormpathÚabspathrƒ   Úurljoinr  Úpathname2url)rû   r…   rD   rD   rH   r1   Û  s    c             C   s    t | ƒd  ¡ }|tkrdS dS )z9Return True if `name` is a considered as an archive file.rN   TF)r(   rð   r   )r:   ÚextrD   rD   rH   r2   å  s    c             C   s   t | ƒ}| |¡ d S )N)Ú_get_used_vcs_backendÚunpack)ÚlinkÚlocationÚvcs_backendrD   rD   rH   r3   í  s    c             C   s.   x(t jD ]}| j|jkr|| jƒ}|S qW d S )N)r-   Úbackendsrú   Úschemesr…   )r  Úbackendr  rD   rD   rH   r
  ò  s    
r
  c             C   s   t t| ƒƒS )N)Úboolr
  )r  rD   rD   rH   r5   ù  s    c             C   s   | j  ¡  d¡S )Nzfile:)r…   rð   ri   )r  rD   rD   rH   r6   ý  s    c             C   s   t | jƒ}tj |¡S )z’Return whether a file:// Link points to a directory.

    ``link`` must not have any other scheme but file://. Call is_file_url()
    first.

    )r0   Úurl_without_fragmentr­   rû   Úisdir)r  Ú	link_pathrD   rD   rH   Ú
is_dir_url  s    
r  c             O   s   | S )NrD   )ÚiterablerÉ   rŸ   rD   rD   rH   Ú_progress_indicator  s    r  c          
      sB  yt ˆjd ƒ}W n tttfk
r0   d}Y nX tˆddƒ}t ¡ tj	krRd}n&|r\d}n|dkrjd}n|std}nd}|j
}‡fdd„}	‡ fd	d
„}
t}|jtjkr¬|}n|j}|rèt||d�}|rÚt d|t|ƒ¡ nt d|¡ n|rút d|¡ nt d|¡ t d|¡ |
||	tƒtƒƒ}|�r6| |¡ nt|ƒ d S )Nzcontent-lengthr   Ú
from_cacheFi@œ  Tc             3   s\   y$xˆ j j| dd�D ]
}|V  qW W n2 tk
rV   xˆ j  | ¡}|sHP |V  q6W Y nX d S )NF)Údecode_content)r˜   rº   ÚAttributeErrorr÷   )Ú
chunk_sizeÚchunk)rž   rD   rH   Ú	resp_read$  s    z _download_url.<locals>.resp_readc             3   s"   x| D ]}ˆ   |¡ |V  qW d S )N)Úwrite)Úchunksr  )Úcontent_filerD   rH   Úwritten_chunksI  s    

z%_download_url.<locals>.written_chunks)ÚmaxzDownloading %s (%s)zDownloading %szUsing cached %szDownloading from URL %s)Úintr·   Ú
ValueErrorÚKeyErrorrì   ÚgetattrrÇ   ÚgetEffectiveLevelÚloggingÚINFOÚshow_urlr  r†   r   r  r,   Úinfor%   Údebugr   Úcheck_against_chunksr#   )rž   r  r!  ÚhashesÚprogress_barÚtotal_lengthÚcached_respÚshow_progressr+  r  r"  Úprogress_indicatorr…   Údownloaded_chunksrD   )r!  rž   rH   Ú_download_url  sL    
%r6  c             C   sÎ   d}t j ||j¡}t j |¡rªtdt|ƒ dƒ}|dkr@d}nj|dkrdt dt|ƒ¡ t  	|¡ nF|dkr˜t
|ƒ}t d	t|ƒt|ƒ¡ t ||¡ n|d
krªt d¡ |rÊt | |¡ t dt|ƒ¡ d S )NTz8The file %s exists. (i)gnore, (w)ipe, (b)ackup, (a)abort)ÚiÚwÚbÚar7  Fr8  zDeleting %sr9  zBacking up %s to %sr:  r   zSaved %s)r­   rû   rh   ÚfilenameÚexistsr    r$   rÇ   rÈ   Úremover!   ÚshutilÚmovere   ÚexitÚcopyr,  )r;  r  r  rA  Údownload_locationr‚   Ú	dest_filerD   rD   rH   Ú
_copy_fileo  s.    

rD  Úonc       
   	   C   sœ   |d krt dƒ‚tdd��x}d }|r0t| ||ƒ}|rH|}t |¡d }	nt| ||j||ƒ\}}	t|||	| ƒ |r€|s€t||| ƒ |sŽt	 
|¡ W d Q R X d S )Nz@unpack_http_url() missing 1 required keyword argument: 'session'r  )Úkindr   )rì   r+   Ú_check_download_dirr´   rµ   Ú_download_http_urlrû   r)   rD  r­   Úunlink)
r  r  Údownload_dirrù   r/  r0  Útemp_dirÚalready_downloaded_pathÚ	from_pathrÃ   rD   rD   rH   r7   Š  s,    
c             C   s¬   t | jƒ}t| ƒrHtj |¡r&t|ƒ tj||dd� |rDt	 
d¡ dS |rV| |¡ d}|rjt| ||ƒ}|rt|}n|}t |¡d }t|||| ƒ |r¨|s¨t||| ƒ dS )z‘Unpack link into location.

    If download_dir is provided and link points to a file, make a copy
    of the link file inside download_dir.
    T)Úsymlinksz*Link is a directory, ignoring download_dirNr   )r0   r  r  r­   rû   r  r'   r>  ÚcopytreerÇ   r,  Úcheck_against_pathrG  r´   rµ   r)   rD  )r  r  rJ  r/  r  rL  rM  rÃ   rD   rD   rH   r4   °  s,    


c          	   C   s´   t j |¡rt|ƒ d}tjg}| d¡ | t| ¡ | d¡ |d|g7 }t 	d| ¡ t
ƒ � t|| dd� W dQ R X t j |t  |¡d	 ¡}t 	d
||¡ t||ddd� dS )zÐCopy distribution files in `link_path` to `location`.

    Invoked when user requests to install a local directory. E.g.:

        pip install .
        pip install ~/dev/git-repos/python-prompt-toolkit

    zsetup.pyz-cÚsdistz
--dist-dirzRunning setup.py sdist for %sF)ÚcwdÚshow_stdoutNr   zUnpacking sdist %s into %s)rÃ   r  )r­   rû   r  r'   re   Ú
executabler�   r*   rÇ   r,  r   r"   rh   Úlistdirr)   )r  r  Úsetup_pyÚ
sdist_argsrQ  rD   rD   rH   Ú_copy_dist_from_dirà  s    

rX  c               @   s$   e Zd ZdZddd„Zd	dd„ZdS )
ÚPipXmlrpcTransportzRProvide a `xmlrpclib.Transport` implementation via a `PipSession`
    object.
    Fc             C   s*   t j | |¡ t |¡}|j| _|| _d S )N)r   Ú	Transportr}   rƒ   r„   rú   Ú_schemeÚ_session)r|   Ú	index_urlrù   Úuse_datetimeÚindex_partsrD   rD   rH   r}   	  s    
zPipXmlrpcTransport.__init__c       
   
   C   s�   | j ||d d d f}t |¡}y6ddi}| jj|||dd�}| ¡  || _|  |j¡S  t	j
k
rŠ }	 zt d|	jj|¡ ‚ W d d }	~	X Y nX d S )NzContent-Typeztext/xmlT)r_   r·   rº   zHTTP error %s while getting %s)r[  rƒ   rˆ   r\  Úpostrõ   ÚverboseÚparse_responser˜   r   Ú	HTTPErrorrÇ   Úcriticalr‚   r“   )
r|   rå   ÚhandlerÚrequest_bodyra  Úpartsr…   r·   r‚   rÁ   rD   rD   rH   r     s    


zPipXmlrpcTransport.requestN)F)F)r¦   r§   r¨   rÎ   r}   r   rD   rD   rD   rH   rY    s   
rY  Fc             C   s`   t | ƒrt| |ƒ n<t| ƒr.t| |||d� n"|dkr<tƒ }t| |||||d� |r\t|ƒ dS )av  Unpack link.
       If link is a VCS link:
         if only_download, export into download_dir and ignore location
          else unpack into location
       for other types of link:
         - unpack into location
         - if download_dir, copy the file into download_dir
         - if only_download, mark location for deletion

    :param hashes: A Hashes object, one of whose embedded hashes must match,
        or HashMismatch will be raised. If the Hashes is empty, no matches are
        required, and unhashable types of requirements (like VCS ones, which
        would ordinarily raise HashUnsupported) are allowed.
    )r/  N)r/  r0  )r5   r3   r6   r4   rÖ   r7   r   )r  r  rJ  Úonly_downloadrù   r/  r0  rD   rD   rH   r8   !  s    c          
   C   sB  | j  dd¡d }y |j|ddidd�}| ¡  W n8 tjk
rj } zt d|jj	| ¡ ‚ W d	d	}~X Y nX |j
 d
d¡}| j}	|j
 d¡}
|
r¬t |
¡\}}| d¡pª|	}	t|	ƒd }|sÒt |¡}|rÒ|	|7 }	|�s| j |j k�rtj |j ¡d }|�r|	|7 }	tj ||	¡}t|dƒ�}t|| |||ƒ W d	Q R X ||fS )z6Download link url into temp_dir using provided sessionú#rN   r   zAccept-EncodingÚidentityT)r·   rº   zHTTP error %s while getting %sNzcontent-typer�   zcontent-dispositionr;  Úwb)r…   r¡   r‰   rõ   r   rc  rÇ   rd  r‚   r“   r·   r;  ÚcgiÚparse_headerr(   r´   Úguess_extensionr­   rû   rh   r¸   r6  )r  rù   rK  r/  r0  Ú
target_urlrž   rÁ   rÃ   r;  Úcontent_dispositionÚtypeÚparamsr	  Ú	file_pathr!  rD   rD   rH   rH  K  s<    
rH  c             C   sn   t j || j¡}t j |¡rjt d|¡ |rfy| |¡ W n* tk
rd   t 	d|¡ t  
|¡ dS X |S dS )z† Check download_dir for previously downloaded file with correct hash
        If a correct file is found return its path else None
    zFile was already downloaded %sz;Previously-downloaded file %s has bad hash. Re-downloading.N)r­   rû   rh   r;  r<  rÇ   r,  rP  r   rÈ   rI  )r  rJ  r/  Údownload_pathrD   rD   rH   rG  †  s    
rG  )NN)NNNrE  )NN)NFNNrE  )~Ú
__future__r   rl  Úemail.utilsr°   r–   r`   r)  r´   r­   rb   Úrer>  re   rj   r   r   r   Úpip._vendor.cachecontrolr   Úpip._vendor.cachecontrol.cachesr   Úpip._vendor.lockfiler   Zpip._vendor.requests.adaptersr	   r
   Zpip._vendor.requests.authr   r   Zpip._vendor.requests.modelsr   r   Zpip._vendor.requests.structuresr   Zpip._vendor.requests.utilsr   Úpip._vendor.six.movesr   Zpip._vendor.six.moves.urllibr   rƒ   r   r  Ú"pip._vendor.six.moves.urllib.parser   r¢   Zpip._vendor.urllib3.utilr   r9   Úpip._internal.compatr   Úpip._internal.exceptionsr   r   Úpip._internal.locationsr   Úpip._internal.modelsr   Úpip._internal.utils.encodingr   Úpip._internal.utils.filesystemr   Úpip._internal.utils.glibcr   Úpip._internal.utils.loggingr   Úpip._internal.utils.miscr   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   Ú$pip._internal.utils.setuptools_buildr*   Úpip._internal.utils.temp_dirr+   Úpip._internal.utils.uir,   Úpip._internal.vcsr-   rs   ÚImportErrorrr   Ú__all__Ú	getLoggerr¦   rÇ   rx   ry   r©   rÄ   rÐ   ÚSessionrÖ   r.   ÚcompileÚIrí   rò   r/   r0   r1   r2   r3   r
  r5   r6   r  r  r6  rD  r7   r4   rX  rZ  rY  r8   rH  rG  rD   rD   rD   rH   Ú<module>   s¢   4

ES!BJ
.
_ 
%
0$  
(;