3
h`yk                 @   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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-dzZ.d{Z/d|Z0d}Z1e0e. e1 e/ Z2e0e1 Z3yd dl4Z4e3e.7 Z3W n  e5k
r   e-j6d1 Y nX yd dl7Z7e3e/7 Z3W n  e5k
r   e-j6d2 Y nX d3d4 Z8d5d! Z9d6d Z:e'd7d8d9d~d;dZ;d<d= Z<d>d Z=dd@dZ>dAdB Z?dCd Z@dDd ZAdEd ZBdFd ZCdGd ZDejEfdHdIZFdJd ZGdKd ZHddMdZIdNd ZJdOd ZKdPdQ ZLdRdS ZMdTdU ZNdVdW ZOdXdY ZPdZd[ ZQdLedLd:d:fd\d]ZRd^d_ ZSd`da ZTdbd ZUdcdd ZVddedZWdfd ZXdgd ZYddidZZdjdk Z[dldm Z\G dndo doe]Z^G dpdq dqe)Z_ej`drds Zadtd  ZbG dudv dve]Zcddwd$Zddxdy Zed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distutils_scheme)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-ikjamrr1/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)rH   rI   )	rA   rF   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)dirrT   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)rA   statst_modeS_IREADchmodS_IWRITE)funcrF   exc_infor>   r>   r?   rW   i   s
    rW   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)rA   rF   normcaseabspathrL   version_infodecodegetfilesystemencodingencodegetdefaultencoding
startswithgetcwdseplen)rF   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)   )rA   rF   existsstr)rX   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 )rA   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)	rA   rw   rx   	Exceptionr   striplowerprintjoin)rz   r{   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)rA   rF   isdirr   isfile)rF   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readrf   )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/\ro   rv   )lstripfindry   )rF   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_prefixrF   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   rA   rF   realpathrd   rc   )rF   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)rF   baserr   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)	rA   rF   ry   rp   rB   rV   move
removedirsrC   )oldnewheadtailr>   r>   r?   r      s    
c             C   s   t  s
dS t| jttjS )z
    Return True if path is within sys.prefix, if we're running in a virtualenv.

    If we're not in a virtualenv, all paths are considered "local."

    T)r
   r   rj   rL   r   )rF   r>   r>   r?   is_local  s    r   c             C   s   t t| S )z
    Return True if given Distribution object is installed locally
    (i.e. within current virtualenv).

    Always True if we're not in a virtualenv.

    )r   dist_location)distr>   r>   r?   dist_is_local!  s    r   c             C   s   t t| }|jt tS )zF
    Return True if given Distribution is installed in user site.
    )r   r   rj   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   rj   r   )r   r>   r>   r?   dist_in_site_packages4  s    
r   c             C   s,   t t| }|jt tdd jdd S )zf
    Return True if given Distribution is installed in
    path matching distutils_scheme layout.
    rv   purelibpythonr   )r   r   rj   r   ry   )r   r   r>   r>   r?   dist_in_install_path>  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)rL   rF   rA   r   project_namer   )r   	path_itemegg_linkr>   r>   r?   dist_is_editableH  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_testj  s    z/get_installed_distributions.<locals>.local_testc             S   s   dS )NTr>   )r   r>   r>   r?   editable_testn  s    z2get_installed_distributions.<locals>.editable_testc             S   s
   t |  S )N)r   )r   r>   r>   r?   r   q  s    c             S   s   t | S )N)r   )r   r>   r>   r?   editables_only_testu  s    z8get_installed_distributions.<locals>.editables_only_testc             S   s   dS )NTr>   )r   r>   r>   r?   r   x  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_distributionsQ  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	   rA   rF   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   ro   r`   LINES   COLUMNSP   )rA   r   ctermidO_RDONLYcloserw   rx   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   )rA   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)
allowZip64ro   r   r   wbN   I   i  )r(   r   zipfileZipFiler   namelistinfolistr   r   r   rA   rF   r   dirnamer   writer   external_attrrY   S_ISREGr\   r   )r   r   flattenzipfpzipleadinginfonamedatafnrX   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   (  s    zuntar_file.<locals>.<listcomp>r   ro   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   rA   rF   r   r   issym_extract_memberr   extractfileKeyErrorrO   r   rV   copyfileobjr   utimer   r\   r   )r   r   r   tarr   r   r   rF   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)rA   rF   r   r   r   ZIP_EXTENSIONSr   
is_zipfiler#   r  
is_tarfileTAR_EXTENSIONSr   r   r$   rj   r   r   pip.vcs.subversionr  urlr   r   criticalr   )r   r   content_typelinkr  r>   r>   r?   r%   Y  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:rv   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PIPEra   r   r   r   debugrA   rw   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&   z  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getpreferredencodingrf   UnicodeDecodeErrortyper   AssertionError)r   r   r   	encodingsencr>   r>   r?   read_text_file  s    	
rI  c             C   s   t j|  t|  d S )N)rA   rB   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 )Nrv   )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)getattrrL   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'   (  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  <  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__@  s    zcached_property.__get__N)rW  rX  rY  rZ  rR  rk  r>   r>   r>   r?   rg  4  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+   H  s    


c             C   s   t | dd dS )zConsume an iterable at C speed.r   )maxlenN)r   )iteratorr>   r>   r?   consume\  s    ru  )r,   r-   )r.   r/   r0   r1   r2   )r3   r4   )r5   r6   r7   )F)rn   )T)T)TNr  NNN)N)f
__future__r   collectionsr   
contextlibrD   iorB  loggingr.  r   rA   r   rV   rY   r$  rL   r  r   pip.exceptionsr   
pip.compatr   r   r   pip.locationsr   r	   r
   r   r   r   pip._vendorr   pip._vendor.six.movesr   pip._vendor.sixr   pip._vendor.retryingr   r   r   __all__	getLoggerrW  r   r   r   r  r  r)   r*   bz2r9   r&  lzmar@   r(   r"   r   rW   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%   r&   rI  rK  objectrL  r[  contextmanagerrf  r'   rg  r+   ru  r>   r>   r>   r?   <module>   s    
	

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