3
ûâdeÞ&  ã               @   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j/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eddœdd„ZdS )Ú_PrefixN)ÚpathÚreturnc             C   s@   || _ d| _ttjdkrdnd||dœd�d | _t|ƒ| _d S )NFÚntÚposix_prefix)ÚbaseÚplatbase)ÚvarsÚscripts)r   Úsetupr   ÚosÚnameÚbin_dirr   Úlib_dirs)Úselfr   © r)   ú6/tmp/pip-build-red6nood/pip/pip/_internal/build_env.pyÚ__init__"   s    z_Prefix.__init__)Ú__name__Ú
__module__Ú__qualname__Ústrr+   r)   r)   r)   r*   r   !   s   r   )r   c              c   s¾   t jtƒjƒ j} | jƒ s&t| ƒV  dS tdd��„}tj	j
|j	dƒ}i }tjdkrXd|d< tj|d	f|Ž�2}x*| jd
ƒD ]}|j||j| jƒjƒ ƒ qvW W dQ R X tj	j
|dƒV  W dQ R X dS )z·Create 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)r1   r2   )ÚpathlibÚPathÚpip_locationÚresolveÚparentÚis_dirr/   r   r$   r   ÚjoinÚsysÚversion_infoÚzipfileÚZipFileZrglobÚwriteZrelative_toZas_posix)ÚsourceZtmp_dirZpip_zipÚkwargsÚzfÚchildr)   r)   r*   Ú_create_standalone_pip,   s    

&rF   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 depsN)r   c                sî   t tjdd�‰ t‡ fdd„dD ƒƒ| _g | _g | _x6tt| jj	ƒ ƒƒD ] }| jj
|jƒ | jj|jƒ qFW dd„ tƒ tƒ fD ƒ}tjjˆ jd	ƒ| _tjj| jƒs¬tj| jƒ ttjj| jd
ƒdƒ�"}|jtjdƒj|| jd�ƒ W d Q R X d S )NT)r0   Zglobally_managedc             3   s&   | ]}|t tjjˆ j|ƒƒfV  qd S )N)r   r$   r   r<   )Ú.0r%   )Útemp_dirr)   r*   ú	<genexpr>M   s   z,BuildEnvironment.__init__.<locals>.<genexpr>ÚnormalÚoverlayc             S   s   h | ]}t jj|ƒ’qS r)   )r$   r   Únormcase)rH   Úsiter)   r)   r*   ú	<setcomp>Z   s   z,BuildEnvironment.__init__.<locals>.<setcomp>rN   zsitecustomize.pyr3   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'   )rK   rL   )r   r   Z	BUILD_ENVr   Ú	_prefixesÚ	_bin_dirsÚ	_lib_dirsÚreversedÚlistÚvaluesÚappendr&   Úextendr'   r   r   r$   r   r<   Ú	_site_dirÚexistsÚmkdirÚopenrA   ÚtextwrapÚdedentÚformat)r(   ÚprefixrP   Úfpr)   )rI   r*   r+   I   s&    
zBuildEnvironment.__init__c             C   sn   dd„ dD ƒ| _ | jd d … }| j d }|r>|j|jtjƒƒ | jg}tjjtjj	|ƒdtjj	|ƒdœƒ d S )	Nc             S   s   i | ]}t jj|d ƒ|“qS )N)r$   ÚenvironÚget)rH   r%   r)   r)   r*   ú
<dictcomp>   s   z.BuildEnvironment.__enter__.<locals>.<dictcomp>ÚPATHÚPYTHONNOUSERSITEÚ
PYTHONPATHÚ1)re   rf   rg   )re   rf   rg   )
Ú	_save_envrR   rX   Úsplitr$   ÚpathseprY   rb   Úupdater<   )r(   r   Zold_pathZ
pythonpathr)   r)   r*   Ú	__enter__~   s    


zBuildEnvironment.__enter__)Úexc_typeÚexc_valÚexc_tbr   c             C   s>   x8| j jƒ D ]*\}}|d kr,tjj|d ƒ q|tj|< qW d S )N)ri   Úitemsr$   rb   Úpop)r(   rn   ro   rp   ZvarnameÚ	old_valuer)   r)   r*   Ú__exit__“   s    zBuildEnvironment.__exit__)Úreqsr   c       	      C   s    t ƒ }t ƒ }|r˜t| jƒ}x||D ]t}t|ƒ}|j|jƒ}|sH|j|ƒ q t|jt	ƒrh|j› d|j› �}n|j› d|j› �}|j|j
kr |j||fƒ q W ||fS )zŽReturn 2 sets:
        - conflicting requirements: set of (installed, wanted) reqs tuples
        - missing requirements: set of reqs
        z==z===)Úsetr   rS   r   Úget_distributionr%   ÚaddÚ
isinstanceÚversionr   Ú	specifier)	r(   ru   ÚmissingZconflictingÚenvZreq_strÚreqÚdistZinstalled_req_strr)   r)   r*   Úcheck_requirementsŸ   s     


z#BuildEnvironment.check_requirementsr   )ÚfinderÚrequirementsÚprefix_as_stringÚmessager   c             C   sr   | j | }|j st‚d|_|s$d S tjƒ �<}tjdk rFtjj	t
ƒ}n|jtƒ ƒ}| j|||||ƒ W d Q R X d S )NTr1   é   )r1   r…   )rQ   r#   ÚAssertionErrorÚ
contextlibÚ	ExitStackr=   r>   r$   r   Údirnamer8   Úenter_contextrF   Ú_install_requirements)r(   r�   r‚   rƒ   r„   r`   ÚctxÚpip_runnabler)   r)   r*   Úinstall_requirements¹   s    


z%BuildEnvironment.install_requirements)r�   r�   r‚   r`   r„   r   c             C   sd  t j| dddd|jdg}tjƒ tjkr0|jdƒ xBdD ]:}t|j	|ƒ}|j
d	|jd
dƒ djt|pfdhƒƒfƒ q6W |j}|r¶|j
d|d gƒ x.|dd … D ]}	|j
d|	gƒ qžW n
|jdƒ x|jD ]}
|j
d|
gƒ qÈW x|jD ]}|j
d|gƒ qæW |j�r|jdƒ |j�r |jdƒ |jd	ƒ |j
|ƒ dtƒ i}t|ƒ�}t|||d� W d Q R X d S )NÚinstallz--ignore-installedz	--no-userz--prefixz--no-warn-script-locationz-vÚ	no_binaryÚ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)r�   r‘   )r=   Ú
executabler   ÚloggerÚgetEffectiveLevelÚloggingÚDEBUGrW   ÚgetattrÚformat_controlrX   Úreplacer<   ÚsortedÚ
index_urlsÚ
find_linksÚtrusted_hostsÚallow_all_prereleasesZprefer_binaryr   r   r   )r�   r�   r‚   r`   r„   Úargsrž   Úformatsr¡   Zextra_indexÚlinkÚhostr—   r–   r)   r)   r*   r‹   Ö   sD    	








z&BuildEnvironment._install_requirements)r,   r-   r.   Ú__doc__r+   rm   r	   r   ÚBaseExceptionr   rt   r   r/   r   r
   r€   rŽ   Ústaticmethodr   r‹   r)   r)   r)   r*   rG   F   s*   5
&rG   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 BuildEnvironmentN)r   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*   rm     s    zNoOpBuildEnvironment.__enter__)rn   ro   rp   r   c             C   s   d S )Nr)   )r(   rn   ro   rp   r)   r)   r*   rt     s    zNoOpBuildEnvironment.__exit__c             C   s   d S )Nr)   )r(   r)   r)   r*   Úcleanup  s    zNoOpBuildEnvironment.cleanupr   )r�   r‚   rƒ   r„   r   c             C   s
   t ƒ ‚d S )N)ÚNotImplementedError)r(   r�   r‚   rƒ   r„   r)   r)   r*   rŽ     s    z)NoOpBuildEnvironment.install_requirements)r,   r-   r.   r©   r+   rm   r	   r   rª   r   rt   r­   r   r/   rŽ   r)   r)   r)   r*   r¬   
  s   
r¬   )8r©   r‡   r›   r$   r6   r=   r]   r?   Úcollectionsr   Ú	sysconfigr   Útypesr   Útypingr   r   r   r   r	   r
   r   r   Zpip._vendor.certifir   Ú"pip._vendor.packaging.requirementsr   Zpip._vendor.packaging.versionr   r5   r   r8   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   Ú	getLoggerr,   r™   r   Úcontextmanagerr/   rF   rG   r¬   r)   r)   r)   r*   Ú<module>   s:   (
 E