3

gl                 @   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 ddlmZ erddlmZmZmZmZmZ ddl m!Z! ej"e#Z$G dd dZ%G dd de&Z'G d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__)call_subprocess)TempDirectory)MYPY_CHECK_RUNNING)open_spinner)TupleSetIterableOptionalList)PackageFinderc               @   s   e Zd Zdd ZdS )_Prefixc             C   sj   || _ d| _ttjdkrdnd||ddd | _td|d}td|d}||kr\|g| _n
||g| _d S )	NFntposix_prefix)baseplatbase)varsscripts)plat_specificprefixT)pathsetupr   osnamebin_dirr   lib_dirs)selfr   purelibplatlib r%   ;/tmp/pip-unpacked-wheel-v59g9nu1/pip/_internal/build_env.py__init__!   s    
z_Prefix.__init__N)__name__
__module____qualname__r'   r%   r%   r%   r&   r      s   r   c               @   s@   e Zd ZdZd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d _t fdddD  _g  _g  _x6tt jj D ] } jj	|j
  jj|j qDW dd td	d
tdd
fD }tjj jjd _tjj jstj j ttjj jdd"}|jtjdj| jd W d Q R X d S )Nz	build-env)kindc             3   s(   | ] }|t tjj jj|fV  qd S )N)r   r   r   join	_temp_dir).0r   )r"   r%   r&   	<genexpr><   s   z,BuildEnvironment.__init__.<locals>.<genexpr>normaloverlayc             S   s   h | ]}t jj|qS r%   )r   r   normcase)r/   siter%   r%   r&   	<setcomp>I   s   z,BuildEnvironment.__init__.<locals>.<setcomp>F)r   Tr4   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!   )r1   r2   )r
   r.   r   	_prefixes	_bin_dirs	_lib_dirsreversedlistvaluesappendr    extendr!   r   r   r   r-   	_site_direxistsmkdiropenwritetextwrapdedentformat)r"   r   r7   fpr%   )r"   r&   r'   7   s&    
zBuildEnvironment.__init__c             C   sn   dd dD | _ | jd d  }| j d }|r>|j|jtj | jg}tjjtjj	|dtjj	|d d S )	Nc             S   s   i | ]}t jj|d |qS )N)r   environget)r/   r   r%   r%   r&   
<dictcomp>o   s   z.BuildEnvironment.__enter__.<locals>.<dictcomp>PATHPYTHONNOUSERSITE
PYTHONPATH1)rL   rM   rN   )rL   rM   rN   )
	_save_envr9   r?   splitr   pathsepr@   rI   updater-   )r"   r   old_path
pythonpathr%   r%   r&   	__enter__n   s    


zBuildEnvironment.__enter__c             C   s>   x8| j j D ]*\}}|d kr,tjj|d  q|tj|< qW d S )N)rP   itemsr   rI   pop)r"   exc_typeexc_valexc_tbvarname	old_valuer%   r%   r&   __exit__   s    zBuildEnvironment.__exit__c             C   s   | j j  d S )N)r.   cleanup)r"   r%   r%   r&   r_      s    zBuildEnvironment.cleanupc             C   s   t  }t  }|rt| j}xx|D ]p}y"|jtj|dkrD|j| W q  tk
r } z,|jt|j	d j
 t|j	d f W Y dd}~X q X q 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missingconflictingwsreqer%   r%   r&   check_requirements   s    

(z#BuildEnvironment.check_requirementsc             C   st  | j | }|j std|_|s$d S tjtjjtdddd|jdg}t	j
 tjkr\|jd xBdD ]:}t|j|}|jd
|jdd djt|pdhf qbW |j}	|	r|jd|	d g x.|	dd  D ]}
|jd|
g qW n
|jd x|jD ]}|jd|g qW x|jD ]}|jd|g qW |jr<|jd |jd
 |j| t|}t||d W d Q R X d 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--pre)spinner)rp   rq   )r8   r   AssertionErrorsys
executabler   r   dirnamepip_locationloggergetEffectiveLevelloggingDEBUGr>   getattrformat_controlr?   replacer-   sorted
index_urls
find_linkstrusted_hostsallow_all_prereleasesr   r	   )r"   finderrequirementsprefix_as_stringmessager   rf   r   formatsr   extra_indexlinkhostru   r%   r%   r&   install_requirements   s<    








z%BuildEnvironment.install_requirementsN)
r(   r)   r*   __doc__r'   rV   r^   r_   rn   r   r%   r%   r%   r&   r+   3   s   7r+   c               @   s8   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&   rV      s    zNoOpBuildEnvironment.__enter__c             C   s   d S )Nr%   )r"   rY   rZ   r[   r%   r%   r&   r^      s    zNoOpBuildEnvironment.__exit__c             C   s   d S )Nr%   )r"   r%   r%   r&   r_      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'   rV   r^   r_   r   r%   r%   r%   r&   r      s   r   ))r   r}   r   rw   rE   collectionsr   distutils.sysconfigr   	sysconfigr   Zpip._vendor.pkg_resourcesr   r   r   pipr   rz   pip._internal.utils.subprocessr	   pip._internal.utils.temp_dirr
   pip._internal.utils.typingr   pip._internal.utils.uir   typingr   r   r   r   r   "pip._internal.index.package_finderr   	getLoggerr(   r{   r   objectr+   r   r%   r%   r%   r&   <module>   s*   
 