U
    «ÃT_l  ã                   @   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rÄddlmZmZmZmZmZ ddl m!Z! e "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-8u7dkzi1/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 ˆ _ttˆ j ¡ ƒƒD ] }ˆ j 	|j
¡ ˆ j |j¡ qBdd„ tdd	�td
d	�fD ƒ}tj ˆ jjd¡ˆ _tj ˆ j¡s°t ˆ j¡ ttj ˆ jd¡dƒ�"}| t d¡j|ˆ jd�¡ W 5 Q R X d S )Nz	build-env)Úkindc                 3   s(   | ] }|t t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 |¡’qS r%   )r   r   Únormcase)r1   Úsiter%   r%   r&   Ú	<setcomp>I   s    z,BuildEnvironment.__init__.<locals>.<setcomp>F)r   Tr7   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!   )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   r:   Úfpr%   r2   r&   r'   7   s0    þ
þÿÿ çzBuildEnvironment.__init__c                 C   sn   dd„ dD ƒ| _ | jd d … }| j d }|r>| | tj¡¡ | jg}tj tj 	|¡dtj 	|¡dœ¡ d S )Nc                 S   s   i | ]}|t j |d ¡“qS r-   )r   ÚenvironÚgetr0   r%   r%   r&   Ú
<dictcomp>o   s   ÿ z.BuildEnvironment.__enter__.<locals>.<dictcomp>)ÚPATHÚPYTHONNOUSERSITEÚ
PYTHONPATHrO   Ú1)
Ú	_save_envr<   rB   Úsplitr   ÚpathseprC   rL   Úupdater.   )r"   r   Úold_pathÚ
pythonpathr%   r%   r&   Ú	__enter__n   s    þ


ýzBuildEnvironment.__enter__c                 C   s:   | j  ¡ D ]*\}}|d kr*tj |d ¡ q
|tj|< q
d S r-   )rS   Úitemsr   rL   Úpop)r"   Úexc_typeÚexc_valÚexc_tbÚvarnameÚ	old_valuer%   r%   r&   Ú__exit__�   s    zBuildEnvironment.__exit__c                 C   s   | j  ¡  d S r-   )r/   Úcleanupr2   r%   r%   r&   rb   ˆ   s    zBuildEnvironment.cleanupc                 C   s˜   t ƒ }t ƒ }|r�t| jƒ}|D ]p}z"| t |¡¡dkrB| |¡ W q tk
rŒ } z*| t|j	d  
¡ ƒt|j	d ƒf¡ W 5 d}~X Y qX q||fS )z–Return 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   sb  | j | }|jrt‚d|_|s"d S tjtj t¡dddd|jdg}t	 
¡ tjkrZ| d¡ dD ]:}t|j|ƒ}| d	| d
d¡ d t|pŽdhƒ¡f¡ q^|j}	|	rØ| d|	d g¡ |	dd … D ]}
| d|
g¡ qÂn
| d¡ |jD ]}| d|g¡ qè|jD ]}| d|g¡ �q|j�r*| d¡ | d	¡ | |¡ t|ƒ�}t||d� W 5 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   rc   z--extra-index-urlz
--no-indexz--find-linksz--trusted-hostz--pre)Úspinner)r;   r   ÚAssertionErrorÚsysÚ
executabler   r   ÚdirnameÚpip_locationÚloggerÚgetEffectiveLevelÚloggingÚDEBUGrA   ÚgetattrÚformat_controlrB   Úreplacer.   ÚsortedÚ
index_urlsÚ
find_linksÚtrusted_hostsÚallow_all_prereleasesr   r	   )r"   ÚfinderÚrequirementsÚprefix_as_stringÚmessager   ri   rƒ   Úformatsr†   Úextra_indexÚlinkÚhostrx   r%   r%   r&   Úinstall_requirementsŸ   sJ    

 
    ý
ÿ






z%BuildEnvironment.install_requirementsN)
r(   r)   r*   Ú__doc__r'   rY   ra   rb   rq   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 r-   r%   r2   r%   r%   r&   r'   Ð   s    zNoOpBuildEnvironment.__init__c                 C   s   d S r-   r%   r2   r%   r%   r&   rY   Ó   s    zNoOpBuildEnvironment.__enter__c                 C   s   d S r-   r%   )r"   r\   r]   r^   r%   r%   r&   ra   Ö   s    zNoOpBuildEnvironment.__exit__c                 C   s   d S r-   r%   r2   r%   r%   r&   rb   Ù   s    zNoOpBuildEnvironment.cleanupc                 C   s
   t ƒ ‚d S r-   )ÚNotImplementedError)r"   rŠ   r‹   r   r�   r%   r%   r&   r’   Ü   s    z)NoOpBuildEnvironment.install_requirementsN)	r(   r)   r*   r“   r'   rY   ra   rb   r’   r%   r%   r%   r&   r”   Ì   s   r”   ))r“   r€   r   rz   rH   Úcollectionsr   Údistutils.sysconfigr   Ú	sysconfigr   Zpip._vendor.pkg_resourcesr   r   r   Úpipr   r}   Ú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*   
 