U
    „~$hÌ)  ã                   @   s‚  d Z ddlZddl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mZmZmZmZ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mZ dd
l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* e�rddl+m,Z, e -e.¡Z/e0e0eee0 ee0e0f f dœdd„Z1G dd„ dƒZ2e0dœdd„Z3ee0 dœdd„Z4G dd„ dƒZ5G dd„ de5ƒZ6dS )z;Build Environment used for isolation during sdist building
é    N)ÚOrderedDict)ÚTracebackType)ÚTYPE_CHECKINGÚIterableÚListÚOptionalÚSetÚTupleÚTypeÚUnion)ÚVersion)Ú__file__)Úopen_spinner)Úget_platlibÚget_purelibÚ
get_scheme)Úget_default_environmentÚget_environment)ÚVERBOSE)Úget_requirement)Úcall_subprocess)ÚTempDirectoryÚtempdir_kinds)ÚPackageFinder)ÚaÚbÚreturnc                 C   s   | |kr| |fS | fS ©N© )r   r   r   r   ú;/tmp/pip-unpacked-wheel-g27rp152/pip/_internal/build_env.pyÚ_dedup   s    r    c                   @   s   e Zd Zeddœdd„ZdS )Ú_PrefixN)Úpathr   c                 C   s4   || _ d| _td|d�}|j| _t|j|jƒ| _d S )NFÚ )Úprefix)	r"   Úsetupr   ÚscriptsÚbin_dirr    ÚpurelibÚplatlibÚlib_dirs)Úselfr"   Úschemer   r   r   Ú__init__$   s
    z_Prefix.__init__)Ú__name__Ú
__module__Ú__qualname__Ústrr-   r   r   r   r   r!   #   s   r!   ©r   c                  C   s.   t  t¡ ¡ j} |  ¡ s t| ƒS t | d ¡S )z¸Get a file to pass to a Python executable, to run the currently-running pip.

    This is used to run a pip subprocess, for installing requirements into the build
    environment.
    z__pip-runner__.py)	ÚpathlibÚPathÚpip_locationÚresolveÚparentÚis_dirr1   ÚosÚfsdecode)Úsourcer   r   r   Úget_runnable_pip,   s    r<   c                  C   s.   t tdƒrt ¡ } ntƒ tƒ g} dd„ | D ƒS )zâGet system site packages

    Usually from site.getsitepackages,
    but fallback on `get_purelib()/get_platlib()` if unavailable
    (e.g. in a virtualenv created by virtualenv<20)

    Returns normalized set of strings.
    Úgetsitepackagesc                 S   s   h | ]}t j |¡’qS r   )r9   r"   Únormcase)Ú.0r"   r   r   r   Ú	<setcomp>M   s     z+_get_system_sitepackages.<locals>.<setcomp>)ÚhasattrÚsiter=   r   r   )Úsystem_sitesr   r   r   Ú_get_system_sitepackages<   s    	

rD   c                   @   s¶   e Zd ZdZddœdd„Zddœdd„Zeee  ee ee	 ddœd	d
„Z
ee eeeeef  ee f dœdd„Zdee eeddœdd„Zeedee eeddœdd„ƒZdS )ÚBuildEnvironmentzACreates and manages an isolated environment to install build depsNr2   c              	      sÞ   t tjdd�‰ t‡ fdd„dD ƒƒ| _g | _g | _tt| j 	¡ ƒƒD ] }| j 
|j¡ | j |j¡ qDtƒ }tj ˆ jd¡| _tj | j¡s˜t | j¡ ttj | jd¡dd	d
��"}| t d¡j|| jd�¡ W 5 Q R X d S )NT)ÚkindÚglobally_managedc                 3   s&   | ]}|t tj ˆ j|¡ƒfV  qd S r   )r!   r9   r"   Újoin©r?   Úname©Útemp_dirr   r   Ú	<genexpr>V   s   ÿz,BuildEnvironment.__init__.<locals>.<genexpr>)ÚnormalÚoverlayrB   zsitecustomize.pyÚwzutf-8)ÚencodingaŸ  
                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)
                )rC   r*   )r   r   Z	BUILD_ENVr   Ú	_prefixesÚ	_bin_dirsÚ	_lib_dirsÚreversedÚlistÚvaluesÚappendr'   Úextendr*   rD   r9   r"   rH   Ú	_site_dirÚexistsÚmkdirÚopenÚwriteÚtextwrapÚdedentÚformat)r+   r$   rC   Úfpr   rK   r   r-   S   s6    þ
  ÿÿ çÿ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   )r9   ÚenvironÚgetrI   r   r   r   Ú
<dictcomp>Š   s   ÿ z.BuildEnvironment.__enter__.<locals>.<dictcomp>)ÚPATHÚPYTHONNOUSERSITEÚ
PYTHONPATHrf   Ú1)
Ú	_save_envrS   rY   Úsplitr9   ÚpathseprZ   rc   ÚupdaterH   )r+   r"   Úold_pathÚ
pythonpathr   r   r   Ú	__enter__‰   s    þ


ýÿzBuildEnvironment.__enter__©Úexc_typeÚexc_valÚexc_tbr   c                 C   s:   | j  ¡ D ]*\}}|d kr*tj |d ¡ q
|tj|< q
d S r   )rj   Úitemsr9   rc   Úpop)r+   rr   rs   rt   ÚvarnameÚ	old_valuer   r   r   Ú__exit__ž   s    zBuildEnvironment.__exit__)Úreqsr   c           	      C   sÎ   t ƒ }t ƒ }|rÆt| dƒr$t| jƒntƒ }|D ]–}t|ƒ}|jdk	rV|j ddi¡sVq.| |j	¡}|sr| 
|¡ q.t|jtƒr’|j	› d|j› �}n|j	› d|j› �}|jj|jdd�s.| 
||f¡ q.||fS )	zŽReturn 2 sets:
        - conflicting requirements: set of (installed, wanted) reqs tuples
        - missing requirements: set of reqs
        rT   NÚextrar#   z==z===T)Úprereleases)ÚsetrA   r   rT   r   r   ÚmarkerÚevaluateÚget_distributionrJ   ÚaddÚ
isinstanceÚversionr   Ú	specifierÚcontains)	r+   rz   ÚmissingÚconflictingÚenvZreq_strÚreqÚdistZinstalled_req_strr   r   r   Úcheck_requirementsª   s*    ÿý
z#BuildEnvironment.check_requirementsr   ©ÚfinderÚrequirementsÚprefix_as_stringrF   r   c                C   s<   | j | }|jrt‚d|_|s"d S | jtƒ ||||d� d S )NT)rF   )rR   r%   ÚAssertionErrorÚ_install_requirementsr<   )r+   r�   rŽ   r�   rF   r$   r   r   r   Úinstall_requirementsÌ   s    

ûz%BuildEnvironment.install_requirements)Úpip_runnabler�   rŽ   r$   rF   r   c                C   s¾  t j| dddd|jddddg}t ¡ tjkr8| d	¡ nt ¡ tkrN| d
¡ dD ]:}t	|j
|ƒ}| d| dd¡ d t|p‚dhƒ¡f¡ qR|j}|rÌ| d|d g¡ |dd … D ]}	| d|	g¡ q¶n
| d¡ |jD ]}
| d|
g¡ qÜ|j�r| d|jg¡ |jD ]}| d|g¡ �q|j�r<| d|jg¡ |j�rT| d|jg¡ |j�rf| d¡ |j�rx| d¡ | d¡ | |¡ td|› �ƒ�}t|d|› �|d� W 5 Q R X d S ) NÚinstallz--ignore-installedz	--no-userz--prefixz--no-warn-script-locationz--disable-pip-version-checkz--targetr#   z-vvz-v)Ú	no_binaryÚonly_binaryz--Ú_ú-ú,z:none:z-ir   é   z--extra-index-urlz
--no-indexz--find-linksz--proxyz--trusted-hostz--certz--client-certz--prez--prefer-binaryzInstalling zpip subprocess to install )Úcommand_descÚspinner)ÚsysÚ
executabler"   ÚloggerÚgetEffectiveLevelÚloggingÚDEBUGrX   r   ÚgetattrÚformat_controlrY   ÚreplacerH   ÚsortedÚ
index_urlsÚ
find_linksÚproxyÚtrusted_hostsZcustom_certÚclient_certÚallow_all_prereleasesÚprefer_binaryr   r   )r“   r�   rŽ   r$   rF   Úargsr¤   Úformatsr§   Úextra_indexÚlinkÚhostrœ   r   r   r   r‘   á   sf    
ó
þÿ






ýz&BuildEnvironment._install_requirements)r.   r/   r0   Ú__doc__r-   rp   r   r
   ÚBaseExceptionr   ry   r   r1   r	   r   r‹   r’   Ústaticmethodr!   r‘   r   r   r   r   rE   P   s2   6
ûþ$ùùrE   c                   @   sx   e Zd ZdZddœdd„Zddœdd„Zeee  ee ee	 ddœd	d
„Z
ddœdd„Zdee eeddœdd„ZdS )ÚNoOpBuildEnvironmentz0A no-op drop-in replacement for BuildEnvironmentNr2   c                 C   s   d S r   r   ©r+   r   r   r   r-   )  s    zNoOpBuildEnvironment.__init__c                 C   s   d S r   r   r·   r   r   r   rp   ,  s    zNoOpBuildEnvironment.__enter__rq   c                 C   s   d S r   r   )r+   rr   rs   rt   r   r   r   ry   /  s    zNoOpBuildEnvironment.__exit__c                 C   s   d S r   r   r·   r   r   r   Úcleanup7  s    zNoOpBuildEnvironment.cleanupr   rŒ   c                C   s
   t ƒ ‚d S r   )ÚNotImplementedError)r+   r�   rŽ   r�   rF   r   r   r   r’   :  s    z)NoOpBuildEnvironment.install_requirements)r.   r/   r0   r³   r-   rp   r   r
   r´   r   ry   r¸   r   r1   r’   r   r   r   r   r¶   &  s   
ûùr¶   )7r³   r¡   r9   r3   rB   r�   r_   Úcollectionsr   Útypesr   Útypingr   r   r   r   r   r	   r
   r   Zpip._vendor.packaging.versionr   Úpipr   r5   Zpip._internal.cli.spinnersr   Úpip._internal.locationsr   r   r   Zpip._internal.metadatar   r   Úpip._internal.utils.loggingr   Úpip._internal.utils.packagingr   Úpip._internal.utils.subprocessr   Úpip._internal.utils.temp_dirr   r   Ú"pip._internal.index.package_finderr   Ú	getLoggerr.   rŸ   r1   r    r!   r<   rD   rE   r¶   r   r   r   r   Ú<module>   s8   (
&	 W