B
    ãUvg½  ã               @   sš   d 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	m
Z
mZ ddlmZ ddlmZ ddlmZ e e¡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)Úget_python_lib)Ú	get_paths)ÚRequirementÚVersionConflictÚ
WorkingSet)Úcall_subprocess)ÚTempDirectory)Úopen_spinnerc               @   sL   e Zd ZdZdd„ Ze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             C   s   t dd�| _| j ¡  d S )Nz	build-env)Úkind)r   Ú	_temp_dirÚcreate)Úself© r   ú8/tmp/pip-install-r_9ig3yj/pip/pip/_internal/build_env.pyÚ__init__   s    zBuildEnvironment.__init__c             C   s   | j jS )N)r   Úpath)r   r   r   r   r      s    zBuildEnvironment.pathc             C   s  t j dd ¡| _t j dd ¡| _t j dd ¡| _t jdkr>dnd}t|| j| jdœd�}|d }| jr~|t j	 | j t jd< n|t j	 t j
 t jd< td	| jd
�}td| jd
�}||kr¾|}n|t j	 | }| jrê|t j	 | j t jd< n
|t jd< dt jd< | jS )NÚPATHÚ
PYTHONPATHÚPYTHONNOUSERSITEÚntÚposix_prefix)ÚbaseÚplatbase)ÚvarsÚscriptsr   )Úplat_specificÚprefixé   Ú1)ÚosÚenvironÚgetÚ	save_pathÚsave_pythonpathÚsave_nousersiteÚnamer   r   ÚpathsepÚdefpathr   )r   Úinstall_schemeÚinstall_dirsr   ÚpurelibÚplatlibÚlib_dirsr   r   r   Ú	__enter__   s,    

zBuildEnvironment.__enter__c             C   s0   dd„ }|d| j ƒ |d| jƒ |d| jƒ d S )Nc             S   s&   |d krt j | d ¡ n
|t j| < d S )N)r    r!   Úpop)ÚvarnameÚ	old_valuer   r   r   Úrestore_varC   s    z.BuildEnvironment.__exit__.<locals>.restore_varr   r   r   )r#   r$   r%   )r   Úexc_typeÚexc_valÚexc_tbr2   r   r   r   Ú__exit__B   s    zBuildEnvironment.__exit__c             C   s   | j  ¡  d S )N)r   Úcleanup)r   r   r   r   r7   M   s    zBuildEnvironment.cleanupc          
   C   s~   g }| �l t tjd  tj¡ƒ}xN|D ]F}y"| t |¡¡dkrJ| |¡ W q& t	k
rj   | |¡ Y q&X q&W |S Q R X dS )zIReturn a list of the requirements from reqs that are not present
        r   N)
r   r    r!   Úsplitr'   Úfindr   ÚparseÚappendr   )r   ÚreqsÚmissingÚwsÚreqr   r   r   Úmissing_requirementsP   s    
z%BuildEnvironment.missing_requirementsc          	   C   sb  t jdddddd| jdg	}t ¡ tjkr2| d¡ xBd	D ]:}t|j	|ƒ}| 
d
| dd¡ d t|phdhƒ¡f¡ q8W |jr¸| 
d|jd g¡ x0|jdd … D ]}| 
d|g¡ q W n
| d¡ x|jD ]}| 
d|g¡ qÊW x"|jD ]\}	}
}	| 
d|
g¡ qèW |j�r| d¡ |j�r(| d¡ | d
¡ | 
|¡ t|ƒ�}t|d|d� W d Q R X d S )Nz-mÚpipÚ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--process-dependency-linksF)Úshow_stdoutÚspinner)ÚsysÚ
executabler   ÚloggerÚgetEffectiveLevelÚloggingÚDEBUGr;   ÚgetattrÚformat_controlÚextendÚreplaceÚjoinÚsortedÚ
index_urlsÚ
find_linksÚsecure_originsÚallow_all_prereleasesÚprocess_dependency_linksr	   r   )r   ÚfinderÚrequirementsÚmessageÚargsrQ   ÚformatsÚextra_indexÚlinkrE   ÚhostrI   r   r   r   Úinstall_requirements^   s2    







z%BuildEnvironment.install_requirementsN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úpropertyr   r.   r6   r7   r@   rc   r   r   r   r   r
      s   #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   r.   „   s    zNoOpBuildEnvironment.__enter__c             C   s   d S )Nr   )r   r3   r4   r5   r   r   r   r6   ‡   s    zNoOpBuildEnvironment.__exit__c             C   s   d S )Nr   )r   r   r   r   r7   Š   s    zNoOpBuildEnvironment.cleanupc             C   s
   t ƒ ‚d S )N)ÚNotImplementedError)r   r[   r\   r]   r   r   r   rc   �   s    z)NoOpBuildEnvironment.install_requirementsN)	rd   re   rf   rg   r   r.   r6   r7   rc   r   r   r   r   ri   }   s   ri   )rg   rN   r    rJ   Údistutils.sysconfigr   Ú	sysconfigr   Zpip._vendor.pkg_resourcesr   r   r   Úpip._internal.utils.miscr   Úpip._internal.utils.temp_dirr   Úpip._internal.utils.uir	   Ú	getLoggerrd   rL   Úobjectr
   ri   r   r   r   r   Ú<module>   s   
j