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 qW n
|d x|jD ]}|
d|g qW x"|jD ]\}	}
}	|
d|
g qW |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