U
    „}ag(  ã                   @   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 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)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)Úwhere)ÚRequirement)ÚVersion)Ú__file__)Úopen_spinner)Úget_platlibÚget_purelibÚ
get_scheme)Úget_default_environmentÚget_environment)Úcall_subprocess)ÚTempDirectoryÚtempdir_kinds)ÚPackageFinder)ÚaÚbÚreturnc                 C   s   | |kr| |fS | fS ©N© )r   r   r   r   úO/var/www/html/publicvenv/lib/python3.8/site-packages/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"   Z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_dirr0   Ú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   )r8   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    	

rC   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 depsNr1   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)ÚkindZglobally_managedc                 3   s&   | ]}|t tj ˆ j|¡ƒfV  qd S r   )r!   r8   r"   Újoin©r>   Úname©Ztemp_dirr   r   Ú	<genexpr>V   s   ÿz,BuildEnvironment.__init__.<locals>.<genexpr>)ZnormalZoverlayrA   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)
                )rB   r*   )r   r   Z	BUILD_ENVr   Ú	_prefixesÚ	_bin_dirsÚ	_lib_dirsÚreversedÚlistÚvaluesÚappendr'   Úextendr*   rC   r8   r"   rF   Ú	_site_dirÚexistsÚmkdirÚopenÚwriteÚtextwrapÚdedentÚformat)r+   r$   rB   Úfpr   rI   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   )r8   ÚenvironÚgetrG   r   r   r   Ú
<dictcomp>Š   s   ÿ z.BuildEnvironment.__enter__.<locals>.<dictcomp>)ÚPATHZPYTHONNOUSERSITEZ
PYTHONPATHra   Ú1)
Ú	_save_envrN   rT   Úsplitr8   ÚpathseprU   r^   ÚupdaterF   )r+   r"   Zold_pathZ
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   )rc   Úitemsr8   r^   Úpop)r+   ri   rj   rk   Z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
        rO   NÚextrar#   z==z===T)Zprereleases)Úsetr@   r   rO   r   r   ZmarkerZevaluateZget_distributionrH   ÚaddÚ
isinstanceÚversionr   Z	specifierÚcontains)	r+   rp   ÚmissingZconflictingÚenvZreq_strZreqÚdistZinstalled_req_strr   r   r   Úcheck_requirementsª   s*    ÿý
z#BuildEnvironment.check_requirementsr   ©ÚfinderÚrequirementsÚprefix_as_stringrE   r   c                C   s<   | j | }|jrt‚d|_|s"d S | jtƒ ||||d� d S )NT)rE   )rM   r%   ÚAssertionErrorÚ_install_requirementsr;   )r+   r|   r}   r~   rE   r$   r   r   r   Úinstall_requirementsÌ   s    

ûz%BuildEnvironment.install_requirements)Úpip_runnabler|   r}   r$   rE   r   c             	   C   s`  t j| dddd|jdg}t ¡ tjkr0| d¡ dD ]:}t|j	|ƒ}| 
d| d	d
¡ d t|pddhƒ¡f¡ q4|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¡ |j�r| d¡ | d¡ | 
|¡ dtƒ i}td|› �ƒ�}t|d|› �||d� W 5 Q R X d S )NÚinstallz--ignore-installedz	--no-userz--prefixz--no-warn-script-locationz-v)Z	no_binaryZonly_binaryz--Ú_ú-ú,z:none:z-ir   é   z--extra-index-urlz
--no-indexz--find-linksz--trusted-hostz--prez--prefer-binaryZ_PIP_STANDALONE_CERTzInstalling zpip subprocess to install )Zcommand_descÚspinnerÚextra_environ)ÚsysÚ
executabler"   ÚloggerÚgetEffectiveLevelÚloggingÚDEBUGrS   ÚgetattrÚformat_controlrT   ÚreplacerF   ÚsortedÚ
index_urlsZ
find_linksZtrusted_hostsZallow_all_prereleasesZprefer_binaryr   r   r   )r‚   r|   r}   r$   rE   Úargsr‘   Zformatsr”   Zextra_indexÚlinkZhostr‰   rˆ   r   r   r   r€   á   sT    
ø

þÿ







üz&BuildEnvironment._install_requirements)r-   r.   r/   Ú__doc__r,   rg   r   r
   ÚBaseExceptionr   ro   r   r0   r	   r   rz   r�   Ústaticmethodr!   r€   r   r   r   r   rD   P   s2   6
ûþ$ùùrD   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 BuildEnvironmentNr1   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   rg   !  s    zNoOpBuildEnvironment.__enter__rh   c                 C   s   d S r   r   )r+   ri   rj   rk   r   r   r   ro   $  s    zNoOpBuildEnvironment.__exit__c                 C   s   d S r   r   r›   r   r   r   Úcleanup,  s    zNoOpBuildEnvironment.cleanupr   r{   c                C   s
   t ƒ ‚d S r   )ÚNotImplementedError)r+   r|   r}   r~   rE   r   r   r   r�   /  s    z)NoOpBuildEnvironment.install_requirements)r-   r.   r/   r—   r,   rg   r   r
   r˜   r   ro   rœ   r   r0   r�   r   r   r   r   rš     s   
ûùrš   )7r—   rŽ   r8   r2   rA   rŠ   rZ   Úcollectionsr   Útypesr   Útypingr   r   r   r   r   r	   r
   r   Zpip._vendor.certifir   Z"pip._vendor.packaging.requirementsr   Zpip._vendor.packaging.versionr   Zpipr   r4   Zpip._internal.cli.spinnersr   Zpip._internal.locationsr   r   r   Úpip._internal.metadatar   r   Zpip._internal.utils.subprocessr   Zpip._internal.utils.temp_dirr   r   Z"pip._internal.index.package_finderr   Ú	getLoggerr-   rŒ   r0   r    r!   r;   rC   rD   rš   r   r   r   r   Ú<module>   s8   (
&	 L