o
    iy7                     @  s  d Z ddlm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 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( ddl)m*Z*m+Z+ erddl,m-Z- ddl.m/Z/ G dd deddZ0e1e2Z3d.ddZ4G dd  d Z5d/d!d"Z6d0d$d%Z7G d&d' d'eZ8G d(d) d)Z9G d*d+ d+Z:G d,d- d-e:Z;dS )1z:Build Environment used for isolation during sdist building    )annotationsN)OrderedDict)Iterable)TracebackType)TYPE_CHECKINGProtocol	TypedDict)Version)__file__)open_spinner)get_platlibget_purelib
get_scheme)get_default_environmentget_environment)
deprecated)VERBOSE)get_requirement)call_subprocess)TempDirectorytempdir_kinds)PackageFinder)InstallRequirementc                   @  s   e Zd ZU ded< dS )ExtraEnvironzdict[str, str]extra_environN)__name__
__module____qualname____annotations__ r   r   7lib/python3.10/site-packages/pip/_internal/build_env.pyr       s   
 r   F)totalastrbreturntuple[str] | tuple[str, str]c                 C  s   | |kr| |fS | fS Nr   )r"   r$   r   r   r    _dedup'   s   r(   c                   @  s   e Zd ZdddZdS )	_Prefixpathr#   r%   Nonec                 C  s4   || _ d| _td|d}|j| _t|j|j| _d S )NF )prefix)	r*   setupr   Zscriptsbin_dirr(   ZpurelibZplatliblib_dirs)selfr*   schemer   r   r    __init__,   s
   z_Prefix.__init__N)r*   r#   r%   r+   )r   r   r   r3   r   r   r   r    r)   +   s    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#   osfsdecode)sourcer   r   r    get_runnable_pip4   s   r=   set[str]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>U   s    z+_get_system_sitepackages.<locals>.<setcomp>)hasattrsiter?   r   r   )system_sitesr   r   r    _get_system_sitepackagesD   s   
	
rF   c                   @  s   e Zd ZdZdddZdS )BuildEnvironmentInstallerz]
    Interface for installing build dependencies into an isolated build
    environment.
    requirementsIterable[str]r-   r)   kindr#   for_reqInstallRequirement | Noner%   r+   c                C     d S r'   r   )r1   rH   r-   rJ   rK   r   r   r    install^   s   z!BuildEnvironmentInstaller.installN
rH   rI   r-   r)   rJ   r#   rK   rL   r%   r+   )r   r   r   __doc__rN   r   r   r   r    rG   X   s    rG   c                   @  s4   e Zd ZdZ		ddddZdddZdddZdS )#SubprocessBuildEnvironmentInstallerzD
    Install build dependencies by calling pip in a subprocess.
    NFfinderr   build_constraintslist[str] | None build_constraint_feature_enabledboolr%   r+   c                 C  s   || _ |pg | _|| _d S r'   )rR   _build_constraints!_build_constraint_feature_enabled)r1   rR   rS   rU   r   r   r    r3   m   s   

z,SubprocessBuildEnvironmentInstaller.__init__c                 C  s@   | j s| jrdS tjd}|r| sdS tddddd dS )z
        Check for deprecation warning: PIP_CONSTRAINT affecting build environments.

        This warns when build-constraint feature is NOT enabled and PIP_CONSTRAINT
        is not empty.
        NZPIP_CONSTRAINTzGSetting PIP_CONSTRAINT will not affect build constraints in the future,zto specify build constraints using --build-constraint or PIP_BUILD_CONSTRAINT. To disable this warning without any build constraints set --use-feature=build-constraint or PIP_USE_FEATURE="build-constraint"z26.2)reasonZreplacementZgone_inZissue)rX   rW   r:   environgetstripr   )r1   Zpip_constraintr   r   r    _deprecation_constraint_checkw   s   
zASubprocessBuildEnvironmentInstaller._deprecation_constraint_checkrH   rI   r-   r)   rJ   r#   rK   rL   c                C  sd  |    | j}tjt dddd|jddddd	g}t tj	kr%|
d
 nt tkr0|
d dD ]}t|j|}|d|dd dt|pJdhf q2|j}	|	ro|d|	d g |	dd  D ]	}
|d|
g qdn|
d |jD ]	}|d|g qw|jr|d|jg |jD ]	}|d|g q|jr|d|jg |jr|d|jg |jr|
d |jr|
d | jr|ddg | jr| jD ]}|d |g |d!|g qi }| jr| jsd"d#d$ii}|
d || |r|jrd%|j nd	}td&| }t|fd'| | |d(| W d    d S 1 s+w   Y  d S ))NrN   z--ignore-installedz	--no-userz--prefixz--no-warn-script-locationz--disable-pip-version-checkz--no-compilez--targetr,   z-vvz-v)Z	no_binaryZonly_binaryz--_-,z:none:z-ir      z--extra-index-urlz
--no-indexz--find-linksz--proxyz--trusted-hostz--certz--client-certz--prez--prefer-binaryz--use-featurezbuild-constraintz--constraintz--build-constraintr   Z _PIP_IN_BUILD_IGNORE_CONSTRAINTS1z for zInstalling zinstalling )Zcommand_descspinner)r]   rR   sys
executabler=   r*   loggerZgetEffectiveLevelloggingDEBUGappendr   getattrformat_controlextendreplacejoinsorted
index_urlsZ
find_linksproxyZtrusted_hostsZcustom_certZclient_certZallow_all_prereleasesZprefer_binaryrX   rW   namer   r   )r1   rH   r-   rJ   rK   rR   argsrk   formatsrp   Zextra_indexlinkhostZconstraint_filer   Zidentify_requirementrc   r   r   r    rN      s   








$z+SubprocessBuildEnvironmentInstaller.install)NF)rR   r   rS   rT   rU   rV   r%   r+   r%   r+   rO   )r   r   r   rP   r3   r]   rN   r   r   r   r    rQ   h   s    

rQ   c                   @  sH   e Zd ZdZd!ddZd"dd	Zd#ddZd$ddZddd%dd ZdS )&BuildEnvironmentzACreates and manages an isolated environment to install build deps	installerrG   r%   r+   c                   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sOt| j ttj| jddd	d
}|tdj|| jd W d    d S 1 svw   Y  d S )NT)rJ   Zglobally_managedc                 3  s(    | ]}|t tj j|fV  qd S r'   )r)   r:   r*   rn   rA   rr   Ztemp_dirr   r    	<genexpr>   s
    
z,BuildEnvironment.__init__.<locals>.<genexpr>)ZnormalZoverlayrD   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)
                )rE   r0   )ry   r   r   Z	BUILD_ENVr   	_prefixes	_bin_dirs	_lib_dirsreversedlistvaluesri   r/   rl   r0   rF   r:   r*   rn   	_site_direxistsmkdiropenwritetextwrapdedentformat)r1   ry   r-   rE   fpr   r{   r    r3      s4   
"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'   )r:   rZ   r[   rz   r   r   r    
<dictcomp>3  s    z.BuildEnvironment.__enter__.<locals>.<dictcomp>)PATHZPYTHONNOUSERSITEZ
PYTHONPATHr   rb   )
	_save_envr   rl   splitr:   pathsepr   rZ   updatern   )r1   r*   Zold_pathZ
pythonpathr   r   r    	__enter__2  s   


zBuildEnvironment.__enter__exc_typetype[BaseException] | Noneexc_valBaseException | Noneexc_tbTracebackType | Nonec                 C  s:   | j  D ]\}}|d u rtj|d  q|tj|< qd S r'   )r   itemsr:   rZ   pop)r1   r   r   r   Zvarname	old_valuer   r   r    __exit__G  s
   zBuildEnvironment.__exit__reqsrI   %tuple[set[tuple[str, str]], set[str]]c           	      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
        r   NZextrar,   z==z===T)Zprereleases)setrC   r   r   r   r   ZmarkerZevaluateZget_distributionrr   add
isinstanceversionr	   Z	specifiercontains)	r1   r   missingZconflictingenvZreq_strZreqZdistZinstalled_req_strr   r   r    check_requirementsS  s,   
z#BuildEnvironment.check_requirementsNrK   rH   prefix_as_stringr#   rJ   rK   rL   c                C  s:   | j | }|jr
J d|_|sd S | jj||||d d S )NT)rJ   rK   )r   r.   ry   rN   )r1   rH   r   rJ   rK   r-   r   r   r    install_requirementsu  s   

z%BuildEnvironment.install_requirements)ry   rG   r%   r+   rw   r   r   r   r   r   r   r%   r+   )r   rI   r%   r   
rH   rI   r   r#   rJ   r#   rK   rL   r%   r+   )	r   r   r   rP   r3   r   r   r   r   r   r   r   r    rx      s    

7

(rx   c                   @  sH   e Zd ZdZdddZdddZdddZdddZdddddZdS ) NoOpBuildEnvironmentz0A no-op drop-in replacement for BuildEnvironmentr%   r+   c                 C  rM   r'   r   r1   r   r   r    r3        zNoOpBuildEnvironment.__init__c                 C  rM   r'   r   r   r   r   r    r     r   zNoOpBuildEnvironment.__enter__r   r   r   r   r   r   c                 C  rM   r'   r   )r1   r   r   r   r   r   r    r     s   zNoOpBuildEnvironment.__exit__c                 C  rM   r'   r   r   r   r   r    cleanup  r   zNoOpBuildEnvironment.cleanupNr   rH   rI   r   r#   rJ   rK   rL   c                C  s   t  r'   )NotImplementedError)r1   rH   r   rJ   rK   r   r   r    r     s   z)NoOpBuildEnvironment.install_requirementsrw   r   r   )	r   r   r   rP   r3   r   r   r   r   r   r   r   r    r     s    



	r   )r"   r#   r$   r#   r%   r&   )r%   r#   )r%   r>   )<rP   Z
__future__r   rg   r:   r4   rD   rd   r   collectionsr   Zcollections.abcr   typesr   typingr   r   r   Zpip._vendor.packaging.versionr	   Zpipr
   r6   Zpip._internal.cli.spinnersr   Zpip._internal.locationsr   r   r   Zpip._internal.metadatar   r   Zpip._internal.utils.deprecationr   Zpip._internal.utils.loggingr   Zpip._internal.utils.packagingr   Zpip._internal.utils.subprocessr   Zpip._internal.utils.temp_dirr   r   Z"pip._internal.index.package_finderr   Zpip._internal.req.req_installr   r   Z	getLoggerr   rf   r(   r)   r=   rF   rG   rQ   rx   r   r   r   r   r    <module>   sJ    


	
  