
0c@_                 @   s~  d  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 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 e r,d d l m Z d d l m Z m Z m  Z  m! Z! m" Z" m# Z# d d l$ m% Z% e j& e'  Z( Gd d   d  Z) Gd d   d e*  Z+ Gd d   d e+  Z, d S)z;Build Environment used for isolation during sdist building
    N)OrderedDict)get_python_lib)	get_paths)RequirementVersionConflict
WorkingSet)__file__)open_spinner)call_subprocess)TempDirectorytempdir_kinds)MYPY_CHECK_RUNNING)TracebackType)TupleSetIterableOptionalListType)PackageFinderc               @   s   e  Z d  Z d d   Z d S)_Prefixc             C   s   | |  _  d |  _ t t j d k r* d n d d d | d | i d |  _ t d d d	 |  } t d d
 d	 |  } | | k r | g |  _ n | | g |  _ d  S)NFntposix_prefixvarsbaseplatbasescriptsplat_specificprefixT)pathsetupr   osnamebin_dirr   lib_dirs)selfr   purelibplatlib r(   6/tmp/pip-build-jynh7p1z/pip/pip/_internal/build_env.py__init__   s    		
z_Prefix.__init__N)__name__
__module____qualname__r*   r(   r(   r(   r)   r      s   r   c               @   sR   e  Z d  Z d Z d d   Z d d   Z d d   Z d d	   Z d
 d   Z d S)BuildEnvironmentzFCreates and manages an isolated environment to install build deps
    c                s]  t  d t j d d    t   f d d   d D  |  _ g  |  _ g  |  _ xI t t |  j j	     D], } |  j j
 | j  |  j j | j  qh Wd d	   t d
 d  t d
 d  f D } t j j   j d  |  _ t j j |  j  st j |  j  t t j j |  j d  d  2 } | j t j d  j d | d |  j   Wd  QRXd  S)NkindZglobally_managedTc             3   s3   |  ]) } | t  t j j   j |   f Vq d  S)N)r   r!   r   join).0r"   )temp_dirr(   r)   	<genexpr>;   s   z,BuildEnvironment.__init__.<locals>.<genexpr>normaloverlayc             S   s"   h  |  ] } t  j j |   q Sr(   )r!   r   normcase)r1   siter(   r(   r)   	<setcomp>H   s   	z,BuildEnvironment.__init__.<locals>.<setcomp>r   Fr7   zsitecustomize.pywa  
                import os, site, sys

                # First, drop system-sites related paths.
                original_sys_path = sys.path[:]
                known_paths = set()
                for path in {system_sites!r}:
                    site.addsitedir(path, known_paths=known_paths)
                system_paths = set(
                    os.path.normcase(path)
                    for path in sys.path[len(original_sys_path):]
                )
                original_sys_path = [
                    path for path in original_sys_path
                    if os.path.normcase(path) not in system_paths
                ]
                sys.path = original_sys_path

                # Second, add lib directories.
                # ensuring .pth file are processed.
                for path in {lib_dirs!r}:
                    assert not path in sys.path
                    site.addsitedir(path)
                system_sitesr$   )r4   r5   )r   r   Z	BUILD_ENVr   	_prefixes	_bin_dirs	_lib_dirsreversedlistvaluesappendr#   extendr$   r   r!   r   r0   	_site_direxistsmkdiropenwritetextwrapdedentformat)r%   r   r:   fpr(   )r2   r)   r*   4   s(    		"	$zBuildEnvironment.__init__c             C   s   d d   d D |  _  |  j d  d   } |  j  d } | rU | j | j t j   |  j g } t j j d t j j	 |  d d d t j j	 |  i  d  S)Nc             S   s(   i  |  ] } t  j j | d   |  q S)N)r!   environget)r1   r"   r(   r(   r)   
<dictcomp>o   s   	z.BuildEnvironment.__enter__.<locals>.<dictcomp>PATHPYTHONNOUSERSITE
PYTHONPATH1)zPATHrP   z
PYTHONPATH)
	_save_envr<   rB   splitr!   pathseprC   rL   updater0   )r%   r   Zold_pathZ
pythonpathr(   r(   r)   	__enter__m   s    		zBuildEnvironment.__enter__c             C   sS   xL |  j  j   D]; \ } } | d  k r> t j j | d   q | t j | <q Wd  S)N)rS   itemsr!   rL   pop)r%   exc_typeexc_valexc_tbZvarname	old_valuer(   r(   r)   __exit__   s    zBuildEnvironment.__exit__c             C   s   t    } t    } | r t |  j  } x | D] } y/ | j t j |   d k rb | j |  Wq. t k
 r } z8 | j t | j	 d j
    t | j	 d  f  WYd d } ~ Xq. Xq. W| | f S)zReturn 2 sets:
            - conflicting requirements: set of (installed, wanted) reqs tuples
            - missing requirements: set of reqs
        Nr      )setr   r=   findr   parseaddr   strargsas_requirement)r%   reqsmissingZconflictingwsreqer(   r(   r)   check_requirements   s    		.z#BuildEnvironment.check_requirementsc             C   s  |  j  | } | j s t  d | _ | s0 d  St j t j j t  d d d d | j d g } t	 j
   t j k r | j d  x[ d D]S } t | j |  } | j d
 | j d d  d j t | p d h   f  q W| j }	 |	 r7| j d |	 d g  x; |	 d d   D] }
 | j d |
 g  qWn | j d  x$ | j D] } | j d | g  qNWx$ | j D] } | j d | g  quW| j r| j d  | j r| j d  | j d
  | j |  t |   } t | d | Wd  QRXd  S)NTinstallz--ignore-installedz	--no-userz--prefixz--no-warn-script-locationz-v	no_binaryonly_binaryz--_-,z:none:z-ir   r_   z--extra-index-urlz
--no-indexz--find-linksz--trusted-hostz--prez--prefer-binaryspinner)z	no_binaryzonly_binary)r;   r    AssertionErrorsys
executabler!   r   dirnamepip_locationloggergetEffectiveLevelloggingDEBUGrA   getattrformat_controlrB   replacer0   sorted
index_urls
find_linkstrusted_hostsallow_all_prereleasesZprefer_binaryr	   r
   )r%   finderrequirementsprefix_as_stringmessager   re   r~   formatsr   Zextra_indexlinkhostrs   r(   r(   r)   install_requirements   s@    		&			z%BuildEnvironment.install_requirementsN)	r+   r,   r-   __doc__r*   rW   r^   rl   r   r(   r(   r(   r)   r.   0   s   9r.   c               @   sR   e  Z d  Z d Z d d   Z d d   Z d d   Z d d	   Z d
 d   Z d S)NoOpBuildEnvironmentz5A no-op drop-in replacement for BuildEnvironment
    c             C   s   d  S)Nr(   )r%   r(   r(   r)   r*      s    zNoOpBuildEnvironment.__init__c             C   s   d  S)Nr(   )r%   r(   r(   r)   rW      s    zNoOpBuildEnvironment.__enter__c             C   s   d  S)Nr(   )r%   rZ   r[   r\   r(   r(   r)   r^      s    zNoOpBuildEnvironment.__exit__c             C   s   d  S)Nr(   )r%   r(   r(   r)   cleanup   s    zNoOpBuildEnvironment.cleanupc             C   s   t     d  S)N)NotImplementedError)r%   r   r   r   r   r(   r(   r)   r      s    z)NoOpBuildEnvironment.install_requirementsN)	r+   r,   r-   r   r*   rW   r^   r   r   r(   r(   r(   r)   r      s   	r   )-r   r{   r!   ru   rH   collectionsr   distutils.sysconfigr   	sysconfigr   Zpip._vendor.pkg_resourcesr   r   r   pipr   rx   Zpip._internal.cli.spinnersr	   Zpip._internal.utils.subprocessr
   Zpip._internal.utils.temp_dirr   r   Zpip._internal.utils.typingr   typesr   Ztypingr   r   r   r   r   r   Z"pip._internal.index.package_finderr   	getLoggerr+   ry   r   objectr.   r   r(   r(   r(   r)   <module>   s*   .