a
    !6a'                     @   sd  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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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' ddl(m)Z) ddl*m+Z+m,Z, erddl-m.Z. e/e0Z1G dd dZ2ej3ee4 dddZ5G dd dZ6G dd de6Z7dS )z;Build Environment used for isolation during sdist building
    N)OrderedDict)	get_paths)TracebackType)TYPE_CHECKINGIterableIteratorListOptionalSetTupleType)where)Requirement)Version)__file__)open_spinner)get_platlibget_prefixed_libsget_purelib)get_environment)call_subprocess)TempDirectorytempdir_kinds)PackageFinderc                   @   s   e Zd Zdd ZdS )_Prefixc                 C   s@   || _ d| _ttjdkrdnd||ddd | _t|| _d S )NFntZposix_prefix)baseZplatbase)varsZscripts)pathsetupr   osnamebin_dirr   lib_dirs)selfr    r%   6lib/python3.9/site-packages/pip/_internal/build_env.py__init__#   s    z_Prefix.__init__N)__name__
__module____qualname__r'   r%   r%   r%   r&   r   !   s   r   )returnc               	   c   s   t t j} |  s&t| V  dS tdd}tj	
|j	d}i }tjdkrXd|d< tj|dfi |8}| d	D ]}|||| j  qxW d   n1 s0    Y  tj	
|d
V  W d   n1 s0    Y  dS )zCreate a "standalone pip" zip file.

    The zip file's content is identical to the currently-running pip.
    It will be used to install requirements into the build environment.
    Nzstandalone-pip)kindz__env_pip__.zip)      FZstrict_timestampsw*pip)pathlibPathpip_locationZresolveparentis_dirstrr   r    r   joinsysversion_infozipfileZZipFileZrglobwriterelative_toZas_posix)sourceZtmp_dirZpip_zipkwargsZzfchildr%   r%   r&   _create_standalone_pip.   s    

8rA   c                   @   sX   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Ze	e
dee
 ee
ddddZdS )BuildEnvironmentzFCreates and manages an isolated environment to install build deps
    c                    s   t tjdd t fdddD | _g | _g | _tt| j	 D ] }| j
|j | j|j qDdd t t fD }tj jd| _tj| jst| j ttj| jd	d
,}|tdj|| jd W d    n1 s0    Y  d S )NT)r,   Zglobally_managedc                 3   s&   | ]}|t tj j|fV  qd S N)r   r    r   r8   .0r!   Ztemp_dirr%   r&   	<genexpr>R   s   z,BuildEnvironment.__init__.<locals>.<genexpr>)ZnormalZoverlayc                 S   s   h | ]}t j|qS r%   )r    r   normcase)rE   siter%   r%   r&   	<setcomp>`   s   z,BuildEnvironment.__init__.<locals>.<setcomp>rI   zsitecustomize.pyr/   a  
                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   Z	BUILD_ENVr   	_prefixes	_bin_dirs	_lib_dirsreversedlistvaluesappendr"   extendr#   r   r   r    r   r8   	_site_direxistsmkdiropenr<   textwrapdedentformat)r$   prefixrK   fpr%   rF   r&   r'   L   s.    

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 rC   )r    environgetrD   r%   r%   r&   
<dictcomp>   s   z.BuildEnvironment.__enter__.<locals>.<dictcomp>)PATHZPYTHONNOUSERSITEZ
PYTHONPATHr`   1)
	_save_envrM   rS   splitr    pathseprT   r]   updater8   )r$   r   Zold_pathZ
pythonpathr%   r%   r&   	__enter__   s    


zBuildEnvironment.__enter__c                 C   s:   | j  D ]*\}}|d u r*tj|d  q
|tj|< q
d S rC   )rb   itemsr    r]   pop)r$   exc_typeexc_valexc_tbZvarname	old_valuer%   r%   r&   __exit__   s    zBuildEnvironment.__exit__c           	      C   s   t  }t  }|rt| j}|D ]t}t|}||j}|sF|| qt|jt	rf|j d|j }n|j d|j }|j|j
vr|||f q||fS )zReturn 2 sets:
            - conflicting requirements: set of (installed, wanted) reqs tuples
            - missing requirements: set of reqs
        z==z===)setr   rN   r   Zget_distributionr!   add
isinstanceversionr   Z	specifier)	r$   ZreqsZmissingZconflictingenvZreq_strZreqZdistZinstalled_req_strr%   r%   r&   check_requirements   s     

z#BuildEnvironment.check_requirementsc                 C   s   | j | }|jrJ d|_|s"d S t F}tjdk rDtjt	}n|
t }| ||||| W d    n1 sv0    Y  d S )NT)r-      )rL   r   
contextlib	ExitStackr9   r:   r    r   dirnamer4   enter_contextrA   _install_requirements)r$   finderrequirementsprefix_as_stringmessager[   ctxpip_runnabler%   r%   r&   install_requirements   s     



z%BuildEnvironment.install_requirementsr   N)r   rz   r{   r[   r}   r+   c                 C   sh  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 qn
|d |jD ]}
|
d|
g q|jD ]}|
d|g q|jr|d |jr|d |d |
| dt i}t|}t|||d W d    n1 sZ0    Y  d S )NZ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_CERT)spinnerextra_environ)r9   
executabler   loggerZgetEffectiveLevelloggingDEBUGrR   getattrformat_controlrS   replacer8   sorted
index_urlsZ
find_linksZtrusted_hostsZallow_all_prereleasesZprefer_binaryr   r   r   )r   rz   r{   r[   r}   argsr   Zformatsr   Zextra_indexlinkZhostr   r   r%   r%   r&   ry      s<    	










z&BuildEnvironment._install_requirements)r(   r)   r*   __doc__r'   rf   rm   rs   r   staticmethodr7   r   r   ry   r%   r%   r%   r&   rB   H   s   6rB   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 rC   r%   r$   r%   r%   r&   r'   	  s    zNoOpBuildEnvironment.__init__c                 C   s   d S rC   r%   r   r%   r%   r&   rf     s    zNoOpBuildEnvironment.__enter__c                 C   s   d S rC   r%   )r$   ri   rj   rk   r%   r%   r&   rm     s    zNoOpBuildEnvironment.__exit__c                 C   s   d S rC   r%   r   r%   r%   r&   cleanup  s    zNoOpBuildEnvironment.cleanupc                 C   s
   t  d S rC   )NotImplementedError)r$   rz   r{   r|   r}   r%   r%   r&   r     s    z)NoOpBuildEnvironment.install_requirementsN)	r(   r)   r*   r   r'   rf   rm   r   r   r%   r%   r%   r&   r     s   	r   )8r   ru   r   r    r2   r9   rX   r;   collectionsr   Z	sysconfigr   typesr   typingr   r   r   r   r	   r
   r   r   Zpip._vendor.certifir   Z"pip._vendor.packaging.requirementsr   Zpip._vendor.packaging.versionr   r1   r   r4   Zpip._internal.cli.spinnersr   Zpip._internal.locationsr   r   r   Zpip._internal.metadatar   Zpip._internal.utils.subprocessr   Zpip._internal.utils.temp_dirr   r   Z"pip._internal.index.package_finderr   Z	getLoggerr(   r   r   contextmanagerr7   rA   rB   r   r%   r%   r%   r&   <module>   s:   (
 >