o
    &i'                     @   sb  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 ddl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rddl,m-Z- e.e/Z0G dd dZ1de2fddZ3dee2 fddZ4G dd dZ5G dd de5Z6dS )z;Build Environment used for isolation during sdist building
    N)OrderedDict)	get_paths)TracebackType)TYPE_CHECKINGIterableListOptionalSetTupleType)where)Requirement)Version)__file__)open_spinner)get_platlibget_prefixed_libsget_purelib)get_default_environmentget_environment)call_subprocess)TempDirectorytempdir_kinds)PackageFinderc                   @   s   e Zd ZdeddfddZdS )_PrefixpathreturnNc                 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)   BC:\wamp64\www\opt\env\Lib\site-packages\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 t j} |  st| S t| d S )zGet 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_dirr/   r$   fsdecode)sourcer)   r)   r*   get_runnable_pip+   s   r8   c                  C   s.   t tdr
t } nt t g} dd | D S )zGet 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)   )r$   r   normcase).0r   r)   r)   r*   	<setcomp>L   s    z+_get_system_sitepackages.<locals>.<setcomp>)hasattrsiter9   r   r   )system_sitesr)   r)   r*   _get_system_sitepackages;   s   
	
r@   c                   @   s   e Zd ZdZdddZdddZdeee  d	ee d
ee	 ddfddZ
dee deeeeef  ee f fddZdddee dededdf
ddZededddee dededdfddZdS )BuildEnvironmentzACreates and manages an isolated environment to install build depsr   Nc                    s   t tjdd t fdddD | _g | _g | _tt| j	 D ]}| j
|j | j|j q"t }tj jd| _tj| jsLt| j ttj| jddd	d
}|tdj|| jd W d    d S 1 ssw   Y  d S )NT)kindglobally_managedc                 3   s(    | ]}|t tj j|fV  qd S N)r   r$   r   joinr;   r%   temp_dirr)   r*   	<genexpr>U   s
    
z,BuildEnvironment.__init__.<locals>.<genexpr>)normaloverlayr>   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)
                )r?   r'   )r   r   	BUILD_ENVr   	_prefixes	_bin_dirs	_lib_dirsreversedlistvaluesappendr&   extendr'   r@   r$   r   rE   	_site_direxistsmkdiropenwritetextwrapdedentformat)r(   prefixr?   fpr)   rG   r*   r+   R   s2   
"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 rD   )r$   environgetrF   r)   r)   r*   
<dictcomp>   s    z.BuildEnvironment.__enter__.<locals>.<dictcomp>)PATHPYTHONNOUSERSITE
PYTHONPATHrd   1)
	_save_envrP   rV   splitr$   pathseprW   ra   updaterE   )r(   r   old_path
pythonpathr)   r)   r*   	__enter__   s   


zBuildEnvironment.__enter__exc_typeexc_valexc_tbc                 C   s:   | j  D ]\}}|d u rtj|d  q|tj|< qd S rD   )rh   itemsr$   ra   pop)r(   ro   rp   rq   varname	old_valuer)   r)   r*   __exit__   s
   zBuildEnvironment.__exit__reqsc           	      C   s   t  }t  }|rct| drt| jnt }|D ]K}t|}|jdur+|jddis+q||j	}|s9|
| qt|jtrI|j	 d|j }n	|j	 d|j }|jj|jddsb|
||f q||fS )	zReturn 2 sets:
        - conflicting requirements: set of (installed, wanted) reqs tuples
        - missing requirements: set of reqs
        rQ   Nextra z==z===T)prereleases)setr=   r   rQ   r   r   markerevaluateget_distributionr%   add
isinstanceversionr   	specifiercontains)	r(   rw   missingconflictingenvreq_strreqdistinstalled_req_strr)   r)   r*   check_requirements   s,   
z#BuildEnvironment.check_requirementsfinderr   requirementsprefix_as_stringrB   c                C   s<   | j | }|jr
J d|_|sd S | jt ||||d d S )NT)rB   )rO   r#   _install_requirementsr8   )r(   r   r   r   rB   r_   r)   r)   r*   install_requirements   s   


z%BuildEnvironment.install_requirementspip_runnabler_   c                C   st  t j| dddd|jdg}t tjkr|d dD ]}t|j	|}|
d|d	d
 dt|p2dhf q|j}|rW|
d|d g |dd  D ]	}	|
d|	g qLn|d |jD ]	}
|
d|
g q_|jD ]	}|
d|g ql|jr~|d |jr|d |d |
| dt i}td| }t|d| ||d W d    d S 1 sw   Y  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-binary_PIP_STANDALONE_CERTzInstalling zpip subprocess to install )command_descspinnerextra_environ)sys
executabler   loggergetEffectiveLevelloggingDEBUGrU   getattrformat_controlrV   replacerE   sorted
index_urls
find_linkstrusted_hostsallow_all_prereleasesprefer_binaryr   r   r   )r   r   r   r_   rB   argsr   formatsr   extra_indexlinkhostr   r   r)   r)   r*   r      sX   










"z&BuildEnvironment._install_requirementsr   N)r,   r-   r.   __doc__r+   rn   r   r   BaseExceptionr   rv   r   r/   r
   r	   r   r   staticmethodr   r   r)   r)   r)   r*   rA   O   sV    

6


"
rA   c                
   @   sz   e Zd ZdZdddZdddZdeee  d	ee d
ee	 ddfddZ
dddZdddee dededdf
ddZdS )NoOpBuildEnvironmentz0A no-op drop-in replacement for BuildEnvironmentr   Nc                 C      d S rD   r)   r(   r)   r)   r*   r+        zNoOpBuildEnvironment.__init__c                 C   r   rD   r)   r   r)   r)   r*   rn      r   zNoOpBuildEnvironment.__enter__ro   rp   rq   c                 C   r   rD   r)   )r(   ro   rp   rq   r)   r)   r*   rv   #  s   zNoOpBuildEnvironment.__exit__c                 C   r   rD   r)   r   r)   r)   r*   cleanup+  r   zNoOpBuildEnvironment.cleanupr   r   r   r   rB   c                C   s   t  rD   )NotImplementedError)r(   r   r   r   rB   r)   r)   r*   r   .  s   z)NoOpBuildEnvironment.install_requirementsr   )r,   r-   r.   r   r+   rn   r   r   r   r   rv   r   r   r/   r   r)   r)   r)   r*   r     s2    




r   )7r   r   r$   r0   r>   r   r\   collectionsr   	sysconfigr   typesr   typingr   r   r   r   r	   r
   r   pip._vendor.certifir   "pip._vendor.packaging.requirementsr   Zpip._vendor.packaging.versionr   pipr   r2   pip._internal.cli.spinnersr   pip._internal.locationsr   r   r   pip._internal.metadatar   r   pip._internal.utils.subprocessr   pip._internal.utils.temp_dirr   r   "pip._internal.index.package_finderr   	getLoggerr,   r   r   r/   r8   r@   rA   r   r)   r)   r)   r*   <module>   s:    $
 L