3
em                 @   s  d dl mZ 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Zd dlZd dlZd dlmZ d dlmZmZmZ d dlmZmZ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& e$rd dlm'Z( nd dlm(Z( dddddddddddddddddddd d!d"d#d$gZ)e	j*e+Z,dxZ-dyZ.dzZ/d{Z0e/e- e0 e. Z1e/e0 Z2yd dl3Z3e2e-7 Z2W n  e4k
r   e,j5d1 Y nX yd dl6Z6e2e.7 Z2W n  e4k
r   e,j5d2 Y nX d3d4 Z7d5d! Z8d6d Z9e&d7d8d9d|d;dZ:d<d= Z;d>d Z<d}d@dZ=dAdB Z>dCd Z?dDd Z@dEd ZAdFd ZBdGd ZCejDfdHdIZEdJd ZFdKd ZGd~dMdZHdNd ZIdOd ZJdPdQ ZKdRdS ZLdTdU ZMdVdW ZNdXdY ZOdLedLd:d:fdZd[ZPd\d] ZQd^d_ ZRd`d ZSdadb ZTddcdZUddd ZVded ZWddgdZXdhdi ZYdjdk ZZG dldm dme[Z\G dndo doe(Z]ej^dpdq Z_drd  Z`G dsdt dte[Zaddud$Zbdvdw ZcdS )    )absolute_import)dequeN)InstallationError)console_to_str
expanduserstdlib_pkgs)site_packages	user_siterunning_under_virtualenvvirtualenv_no_globalwrite_delete_marker_file)pkg_resources)input)PY2)retry)BytesIO)StringIOrmtreedisplay_path
backup_dirasksplitextformat_sizeis_installable_diris_svn_pagefile_contentssplit_leading_dirhas_leading_dirnormalize_pathrenamesget_terminal_sizeget_prog
unzip_file
untar_fileunpack_filecall_subprocesscaptured_stdout
ensure_dirARCHIVE_EXTENSIONSSUPPORTED_EXTENSIONSget_installed_version.tar.bz2.tbz.tar.xz.txz.tlz.tar.lz	.tar.lzma.zip.whl.tar.gz.tgz.tarzbz2 module is not availablezlzma module is not availablec             O   s,   yt | S  tk
r&   |||Y nX d S )N)
__import__ImportError)pkg_or_module_stringExceptionTypeargskwargs r=   1/tmp/pip-build-argcdawy/pip/pip/utils/__init__.pyimport_or_raiseI   s    r?   c             C   sD   yt j|  W n0 tk
r> } z|jtjkr. W Y dd}~X nX dS )z os.path.makedirs without EEXIST.N)osmakedirsOSErrorerrnoEEXIST)pather=   r=   r>   r'   P   s
    c               C   sD   y$t jjtjd dkr"dtj S W n tttfk
r>   Y nX dS )Nr   __main__.py-cz	%s -m pippip)rG   rH   )	r@   rE   basenamesysargv
executableAttributeError	TypeError
IndexErrorr=   r=   r=   r>   r!   Y   s    i  i  )stop_max_delay
wait_fixedFc             C   s   t j| |td d S )N)ignore_errorsonerror)shutilr   rmtree_errorhandler)dirrS   r=   r=   r>   r   c   s    c             C   s2   t j|jtj@ r,t j|tj | | dS  dS )zOn Windows, the files in .svn are read-only, so when rmtree() tries to
    remove them, an exception is thrown.  We catch that here, remove the
    read-only attribute, and hopefully continue without problems.N)r@   statst_modeS_IREADchmodS_IWRITE)funcrE   exc_infor=   r=   r>   rV   i   s
    rV   c             C   st   t jjt jj| } tjd dkrB| jtj d} | jtj	 d} | j
t j t jj rpd| tt j d  } | S )zTGives the display value for a given path, making it relative to cwd
    if possible.r      replace.N)r@   rE   normcaseabspathrK   version_infodecodegetfilesystemencodingencodegetdefaultencoding
startswithgetcwdseplen)rE   r=   r=   r>   r   x   s    .bakc             C   s:   d}|}x(t jj| | r0|d7 }|t| }q
W | | S )z\Figure out the name of a directory to back up the given dir to
    (adding .bak, .bak2, etc)   )r@   rE   existsstr)rW   extn	extensionr=   r=   r>   r      s    c             C   s2   x&t jjddj D ]}||kr|S qW t| |S )NPIP_EXISTS_ACTION )r@   environgetsplitr   )messageoptionsactionr=   r=   r>   ask_path_exists   s    r|   c             C   sZ   xTt jjdrtd|  t| }|j j }||krNtd|dj|f  q|S qW dS )z@Ask the message interactively, with the given possible responsesPIP_NO_INPUTz7No input was expected ($PIP_NO_INPUT set); question: %sz<Your response (%r) was not one of the expected responses: %sz, N)	r@   rv   rw   	Exceptionr   striplowerprintjoin)ry   rz   responser=   r=   r>   r      s    c             C   sL   | dkrd| d d  S | d	kr,d| d  S | dkr@d| d  S d|  S d S )
Ni  z%.1fMBg     @@
   z%ikBz%.1fkBz%ibytesi@B i'  r=   )bytesr=   r=   r>   r      s    c             C   s2   t jj| sdS t jj| d}t jj|r.dS dS )z@Return True if `path` is a directory containing a setup.py file.Fzsetup.pyT)r@   rE   isdirr   isfile)rE   setup_pyr=   r=   r>   r      s    c             C   s   t jd| ot jd| t jS )zT
    Returns true if the page appears to be the index page of an svn repository
    z<title>[^<]*Revision \d+:z#Powered by (?:<a[^>]*?>)?Subversion)researchI)htmlr=   r=   r>   r      s    c          	   C   s$   t | d}|j jdS Q R X d S )Nrbzutf-8)openreadre   )filenamefpr=   r=   r>   r      s    c             c   s    x| j |}|sP |V  qW dS )z7Yield pieces of data from a file-like object until EOF.N)r   )filesizechunkr=   r=   r>   read_chunks   s
    
r   c             C   sh   | j dj d} d| krHd| kr4| jd| jdk s<d| krH| jddS d| kr\| jddS | dfS d S )N/\rn   ru   )lstripfindrx   )rE   r=   r=   r>   r      s    $c             C   sD   d}x:| D ]2}t |\}}|s"dS |dkr0|}q
||kr
dS q
W dS )zyReturns true if all the paths have the same leading path name
    (i.e., everything is in one subdirectory in an archive)NFT)r   )pathscommon_prefixrE   prefixrestr=   r=   r>   r      s    
Tc             C   s2   t | } |rtjj| } ntjj| } tjj| S )zN
    Convert a path to its canonical, case-normalized, absolute version.

    )r   r@   rE   realpathrc   rb   )rE   resolve_symlinksr=   r=   r>   r      s
    c             C   s@   t j| \}}|j jdr8|dd | }|dd }||fS )z,Like os.path.splitext, but take off .tar tooz.tar   Nr   )	posixpathr   r   endswith)rE   baserq   r=   r=   r>   r      s
    c             C   s|   t jj|\}}|r0|r0t jj| r0t j| tj| | t jj| \}}|rx|rxyt j| W n tk
rv   Y nX dS )z7Like os.renames(), but handles renaming across devices.N)	r@   rE   rx   ro   rA   rU   move
removedirsrB   )oldnewheadtailr=   r=   r>   r     s    
c             C   sr   t | } t tj}t r(| jt tjS ddlm} | j|rjx&|dj D ]}| jt |rLdS qLW dS dS dS )aB  
    Return True if this is a path pip is allowed to modify.

    If we're in a virtualenv, sys.prefix points to the virtualenv's
    prefix; only sys.prefix is considered local.

    If we're not in a virtualenv, in general we can modify anything.
    However, if the OS vendor has configured distutils to install
    somewhere other than sys.prefix (which could be a subdirectory of
    sys.prefix, e.g. /usr/local), we consider sys.prefix itself nonlocal
    and the domain of the OS vendor. (In other words, everything _other
    than_ sys.prefix is considered local.)

    r   )distutils_schemeru   TFN)r   rK   r   r
   ri   pip.locationsr   values)rE   r   r   
local_pathr=   r=   r>   is_local  s    

r   c             C   s   t t| S )zh
    Return True if given Distribution object is installed somewhere pip
    is allowed to modify.

    )r   dist_location)distr=   r=   r>   dist_is_local5  s    r   c             C   s   t t| }|jt tS )zF
    Return True if given Distribution is installed in user site.
    )r   r   ri   r	   )r   	norm_pathr=   r=   r>   dist_in_usersite>  s    r   c             C   s   t t| jt tS )ze
    Return True if given Distribution is installed in
    distutils.sysconfig.get_python_lib().
    )r   r   ri   r   )r   r=   r=   r>   dist_in_site_packagesF  s    
r   c             C   s8   x2t jD ](}tjj|| jd }tjj|rdS qW dS )z$Is distribution an editable install?z	.egg-linkTF)rK   rE   r@   r   project_namer   )r   	path_itemegg_linkr=   r=   r>   dist_is_editableP  s
    r   c                sl   | r
t ndd |r dd  ndd  |r6dd ndd |rHtnd	d
  fddtjD S )a  
    Return a list of installed Distribution objects.

    If ``local_only`` is True (default), only return installations
    local to the current virtualenv, if in a virtualenv.

    ``skip`` argument is an iterable of lower-case project names to
    ignore; defaults to stdlib_pkgs

    If ``editables`` is False, don't report editables.

    If ``editables_only`` is True , only report editables.

    If ``user_only`` is True , only report installations in the user
    site directory.

    c             S   s   dS )NTr=   )dr=   r=   r>   
local_testr  s    z/get_installed_distributions.<locals>.local_testc             S   s   dS )NTr=   )r   r=   r=   r>   editable_testv  s    z2get_installed_distributions.<locals>.editable_testc             S   s
   t |  S )N)r   )r   r=   r=   r>   r   y  s    c             S   s   t | S )N)r   )r   r=   r=   r>   editables_only_test}  s    z8get_installed_distributions.<locals>.editables_only_testc             S   s   dS )NTr=   )r   r=   r=   r>   r     s    c             S   s   dS )NTr=   )r   r=   r=   r>   	user_test  s    z.get_installed_distributions.<locals>.user_testc                s:   g | ]2}|r|j kr |r|r|r|qS r=   )key).0r   )r   r   r   skipr   r=   r>   
<listcomp>  s    
z/get_installed_distributions.<locals>.<listcomp>)r   r   r   working_set)
local_onlyr   include_editableseditables_only	user_onlyr=   )r   r   r   r   r   r>   get_installed_distributionsY  s    

r   c             C   s   g }t  r6t r|jt qN|jt trN|jt ntrD|jt |jt x0|D ](}tjj|| jd }tjj	|rT|S qTW dS )a  
    Return the path for the .egg-link file if it exists, otherwise, None.

    There's 3 scenarios:
    1) not in a virtualenv
       try to find in site.USER_SITE, then site_packages
    2) in a no-global virtualenv
       try to find in site_packages
    3) in a yes-global virtualenv
       try to find in site_packages, then site.USER_SITE
       (don't look in global location)

    For #1 and #3, there could be odd cases, where there's an egg-link in 2
    locations.

    This method will just return the first one found.
    z	.egg-linkN)
r
   r   appendr   r	   r@   rE   r   r   r   )r   sitessiteegglinkr=   r=   r>   egg_link_path  s    



r   c             C   s   t | }|r|S | jS )z
    Get the site-packages location of this distribution. Generally
    this is dist.location, except in the case of develop-installed
    packages, where dist.location is the source code location, and we
    want to know where the egg-link file is.

    )r   location)r   r   r=   r=   r>   r     s    r   c           
   C   s   dd } | dp| dp| d}|sZy(t jt j t j}| |}t j| W n   Y nX |szt jjddt jjdd	f}t|d t|d fS )
zlReturns a tuple (x, y) representing the width(x) and the height(x)
    in characters of the terminal window.c             S   sP   y4dd l }dd l}dd l}|jd|j| |jd}W n
   d S |dkrLd S |S )Nr   hh1234)r   r   )fcntltermiosstructunpackioctl
TIOCGWINSZ)fdr   r   r   crr=   r=   r>   ioctl_GWINSZ  s    z'get_terminal_size.<locals>.ioctl_GWINSZr   rn   r_   LINES   COLUMNSP   )r@   r   ctermidO_RDONLYcloserv   rw   int)r   r   r   r=   r=   r>   r      s    c              C   s   t jd} t j|  | S )zBGet the current umask which involves having to set it temporarily.r   )r@   umask)maskr=   r=   r>   current_umask  s    

r   c             C   s  t | t| d}ztj|dd}t|j o0|}x|j D ]}|j}|j|}|}	|rdt	|d }	t
jj||	}	t
jj|	}
|	jds|	jdrt |	 q<t |
 t|	d}z|j| W d|j  |jd	? }|rtj|r|d
@ rt
j|	dt  d
B  X q<W W d|j  X dS )a  
    Unzip the file (with path `filename`) to the destination `location`.  All
    files are written based on system defaults and umask (i.e. permissions are
    not preserved), except that regular file members with any execute
    permissions (user, group, or world) have "chmod +x" applied after being
    written. Note that for windows, any execute changes using os.chmod are
    no-ops per the python docs.
    r   T)
allowZip64rn   r   r   wbN   I   i  )r'   r   zipfileZipFiler   namelistinfolistr   r   r   r@   rE   r   dirnamer   writer   external_attrrX   S_ISREGr[   r   )r   r   flattenzipfpzipleadinginfonamedatafnrW   r   moder=   r=   r>   r"     s0    	




 c              C   s  t | | j jds$| j jdr*d}nL| j jtr>d}n8| j jtrRd}n$| j jdrfd}ntjd|  d	}tj| |}zxt	d
d |j
 D }xZ|j
 D ]L}|j}|dkrq|rt|d }tjj||}|j rt | q|j rDy|j|| W n8 tk
r@ } ztjd| |j| wW Y dd}~X nX qy|j|}	W n< ttfk
r } ztjd| |j| wW Y dd}~X nX t tjj| t|d}
tj|	|
 W dQ R X |	j  |j|| |jd@ rtj|dt  dB  qW W d|j  X dS )a  
    Untar the file (with path `filename`) to the destination `location`.
    All files are written based on system defaults and umask (i.e. permissions
    are not preserved), except that regular file members with any execute
    permissions (user, group, or world) have "chmod +x" applied after being
    written.  Note that for windows, any execute changes using os.chmod are
    no-ops per the python docs.
    z.gzz.tgzzr:gzzr:bz2zr:xzz.tarrz-Cannot determine compression type for file %szr:*c             S   s   g | ]}|j d kr|j qS )pax_global_header)r   )r   memberr=   r=   r>   r   0  s    zuntar_file.<locals>.<listcomp>r   rn   z/In the tar file %s the member %s is invalid: %sNr   r   i  )r'   r   r   BZ2_EXTENSIONSXZ_EXTENSIONSloggerwarningtarfiler   r   
getmembersr   r   r@   rE   r   r   issym_extract_memberr~   extractfileKeyErrorrN   r   rU   copyfileobjr   utimer   r[   r   )r   r   r   tarr   r   r   rE   excr   destfpr=   r=   r>   r#     s`    	


c             C   s   t jj| } |dks,| j jts,tj| rDt| || jd d n|dkslt	j
| sl| j jtt t rxt| | nX|r|jdrtt| rddlm} |d|j j| ntjd	| || td
| d S )Nzapplication/zipz.whl)r   zapplication/x-gzipz	text/htmlr   )
Subversionzsvn+zZCannot unpack file %s (downloaded from %s, content-type: %s); cannot detect archive formatz%Cannot determine archive format of %s)r@   rE   r   r   r   ZIP_EXTENSIONSr   
is_zipfiler"   r  
is_tarfileTAR_EXTENSIONSr   r   r#   ri   r   r   pip.vcs.subversionr  urlr   r   criticalr   )r   r   content_typelinkr  r=   r=   r>   r$   a  s,    


raisec             C   s,  |r
d }nt j}|d krng }xF| D ]>}	d|	ksFd|	ksFd|	ksFd|	krVd|	jdd }	|j|	 q"W dj|}tjd| tjj	 }
|r|
j
| yt j| t jd |||
d}W n2 tk
r } ztjd	||  W Y d d }~X nX |d k	rNg }x\t|jj }|sP |j }|j|d  tj tjkr:tj| q|d k	r|j  qW |j  |d k	r~|jrt|jd
 n
|jd |jr|dkrtj tjkr| rtjd| tjdj|d  td||j|f n:|dkrtjd||j| n|dkrntdt| |s(dj|S d S )N 
"'z"%s"z\"zRunning command %s)stderrstdinstdoutcwdenvz#Error %s while executing command %serrordoner  z Complete output from command %s:ru   z)
----------------------------------------z,Command "%s" failed with error code %s in %swarnz$Command "%s" had error code %s in %signorezInvalid value: on_returncode=%s)
subprocessPIPEr`   r   r   r   debugr@   rv   copyupdatePopenSTDOUTr~   r  r   r  readlinerstripgetEffectiveLevelstd_loggingDEBUGspinwait
returncodefinishr   r   r   
ValueErrorrepr)cmdshow_stdoutr  on_returncodecommand_descextra_environspinnerr  	cmd_partspartr  procr
  
all_outputliner=   r=   r>   r%     sz    
 










c             C   sx   t | d}|j }W dQ R X dtjddg}x4|D ],}y|j|}W n tk
r\   w4Y nX P q4W t|tkstt|S )aR  Return the contents of *filename*.

    Try to decode the file contents with utf-8, the preferred system encoding
    (e.g., cp1252 on some Windows machines), and latin1, in that order.
    Decoding a byte string with latin1 will never raise an error. In the worst
    case, the returned string will contain some garbage characters.

    r   Nzutf-8Flatin1)	r   r   localegetpreferredencodingre   UnicodeDecodeErrortyper   AssertionError)r   r   r   	encodingsencr=   r=   r>   read_text_file  s    	
rI  c             C   s   t j|  t|  d S )N)r@   rA   r   )	build_dirr=   r=   r>   _make_build_dir  s    
rK  c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	FakeFilezQWrap a list of lines in an object with readline() to make
    ConfigParser happy.c             C   s   dd |D | _ d S )Nc             s   s   | ]
}|V  qd S )Nr=   )r   lr=   r=   r>   	<genexpr>  s    z$FakeFile.__init__.<locals>.<genexpr>)_gen)selflinesr=   r=   r>   __init__  s    zFakeFile.__init__c             C   sD   y*y
t | jS  tk
r&   | jj  S X W n tk
r>   dS X d S )Nru   )nextrO  	NameErrorStopIteration)rP  r=   r=   r>   r+    s    
zFakeFile.readlinec             C   s   | j S )N)rO  )rP  r=   r=   r>   __iter__  s    zFakeFile.__iter__N)__name__
__module____qualname____doc__rR  r+  rV  r=   r=   r=   r>   rL    s   	rL  c               @   s$   e Zd Zedd Zedd ZdS )StreamWrapperc             C   s   || _ |  S )N)orig_stream)clsr\  r=   r=   r>   from_stream  s    zStreamWrapper.from_streamc             C   s   | j jS )N)r\  encoding)rP  r=   r=   r>   r_    s    zStreamWrapper.encodingN)rW  rX  rY  classmethodr^  propertyr_  r=   r=   r=   r>   r[    s   r[  c             c   s@   t t| }tt| tj| zt t| V  W dtt| | X dS )zReturn a context manager used by captured_stdout/stdin/stderr
    that temporarily replaces the sys stream *stream_name* with a StringIO.

    Taken from Lib/support/__init__.py in the CPython repo.
    N)getattrrK   setattrr[  r^  )stream_nameorig_stdoutr=   r=   r>   captured_output!  s
    
rf  c               C   s   t dS )zCapture the output of sys.stdout:

       with captured_stdout() as stdout:
           print('hello')
       self.assertEqual(stdout.getvalue(), 'hello
')

    Taken from Lib/support/__init__.py in the CPython repo.
    r  )rf  r=   r=   r=   r>   r&   0  s    	c               @   s    e Zd ZdZdd Zdd ZdS )cached_propertyzA property that is only computed once per instance and then replaces
       itself with an ordinary attribute. Deleting the attribute resets the
       property.

       Source: https://github.com/bottlepy/bottle/blob/0.11.5/bottle.py#L175
    c             C   s   t |d| _|| _d S )NrZ  )rb  rZ  r]   )rP  r]   r=   r=   r>   rR  D  s    zcached_property.__init__c             C   s(   |d kr| S | j | }|j| j j< |S )N)r]   __dict__rW  )rP  objr]  valuer=   r=   r>   __get__H  s    zcached_property.__get__N)rW  rX  rY  rZ  rR  rk  r=   r=   r=   r>   rg  <  s   rg  c             C   s@   t jj| }|dkrt j }n
t j|}|j|}|r<|jS dS )zCGet the installed version of dist_name avoiding pkg_resources cacheN)r   Requirementparse
WorkingSetr   version)	dist_namelookup_dirsreqr   r   r=   r=   r>   r*   P  s    


c             C   s   t | dd dS )zConsume an iterable at C speed.r   )maxlenN)r   )iteratorr=   r=   r>   consumed  s    ru  )r+   r,   )r-   r.   r/   r0   r1   )r2   r3   )r4   r5   r6   )F)rm   )T)T)TNr  NNN)N)d
__future__r   collectionsr   
contextlibrC   iorB  loggingr.  r   r@   r   rU   rX   r$  rK   r  r   pip.exceptionsr   
pip.compatr   r   r   r   r   r	   r
   r   r   pip._vendorr   Zpip._vendor.six.movesr   Zpip._vendor.sixr   Zpip._vendor.retryingr   r   r   __all__	getLoggerrW  r   r   r   r  r  r(   r)   bz2r8   r&  lzmar?   r'   r!   r   rV   r   r   r|   r   r   r   r   r   DEFAULT_BUFFER_SIZEr   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r   r"   r#   r$   r%   rI  rK  objectrL  r[  contextmanagerrf  r&   rg  r*   ru  r=   r=   r=   r>   <module>   s   
	



	
	 	
	5%
+L!   
_
