o
    ­—ŽjJ  ã                   @  sô  d Z ddlm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 ddl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% 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/m0Z0m1Z1m2Z2m3Z3 ddl4m5Z5m6Z6 ddl7m8Z8 ddl9m:Z: ddl;m<Z< ddl=m>Z> ddl?m@Z@ ddlAmBZBmCZC ddlDmEZEmFZFmGZG e HeI¡ZJd6d!d"„ZKeGjLeGjMeGjNgZOed#d$d%�ZPd7d(d)„ZQd8d3d4„ZRG d5d$„ d$eƒZSdS )9zðContains the RequirementCommand base class.

This class is in a separate module so the commands that do not always
need PackageFinder capability don't unnecessarily import the
PackageFinder machinery and all its vendored dependencies, etc.
é    )ÚannotationsN)ÚCallable)Úpartial)ÚValues)ÚAnyÚTypeVar)ÚBuildEnvironmentInstallerÚBuildIsolationModeÚ"InprocessBuildEnvironmentInstallerÚ#SubprocessBuildEnvironmentInstaller)Ú
WheelCache)Ú
cmdoptions)Úmake_target_python)ÚIndexGroupCommand)ÚSessionCommandMixin)ÚCommandErrorÚPreviousBuildDirErrorÚUnsupportedPythonVersion)ÚLinkCollector)ÚPackageFinder)ÚSelectionPreferences)ÚTargetPython)Ú
PipSession)ÚBuildTracker)ÚRequirementPreparer)Úinstall_req_from_editableÚinstall_req_from_lineÚ#install_req_from_parsed_requirementÚinstall_req_from_pylock_packageÚinstall_req_from_req_string)ÚPEP723ExceptionÚpep723_metadata)Úparse_dependency_groups)Úparse_requirements)ÚInstallRequirement)ÚBaseResolver)Úcheck_requires_python)Úis_valid_pylock_filenameÚselect_from_pylock_path_or_url)ÚTempDirectoryÚTempDirectoryTypeRegistryÚtempdir_kindsÚreturnÚboolc                   C  s   t j d¡dkS )ag  
    Whether this process should ignore the regular constraints it inherits.

    The parent pip sets ``_PIP_IN_BUILD_IGNORE_CONSTRAINTS`` whenever it starts
    an isolated build in a subprocess, so that regular constraints the build
    inherits (such as via ``PIP_CONSTRAINT`` or config files) do not affect it.
    Only build constraints apply there.
    Ú _PIP_IN_BUILD_IGNORE_CONSTRAINTSÚ1)ÚosÚenvironÚget© r3   r3   úZ/var/www/kodo/Anonymous/send/lib/python3.10/site-packages/pip/_internal/cli/req_command.pyÚ!should_ignore_regular_constraintsB   s   
r5   Ú	_CommandTÚRequirementCommand)ÚboundÚfuncú-Callable[[_CommandT, Values, list[str]], int]c                   s   ddd„‰ d‡ ‡fdd„}|S )zNDecorator for common logic related to managing temporary
    directories.
    Úregistryr*   r,   ÚNonec                 S  s   t D ]}|  |d¡ qd S ©NF)ÚKEEPABLE_TEMPDIR_TYPESÚ
set_delete)r;   Útr3   r3   r4   Úconfigure_tempdir_registry`   s   ÿz0with_cleanup.<locals>.configure_tempdir_registryÚselfr6   Úoptionsr   Úargsú	list[str]Úintc                   sH   | j d usJ ‚|jrˆ | j ƒ zˆ| ||ƒW S  ty#   ˆ | j ƒ ‚ w ©N)Útempdir_registryÚno_cleanr   )rB   rC   rD   ©rA   r9   r3   r4   Úwrapperd   s   

ûzwith_cleanup.<locals>.wrapperN)r;   r*   r,   r<   )rB   r6   rC   r   rD   rE   r,   rF   r3   )r9   rK   r3   rJ   r4   Úwith_cleanupY   s   
rL   Úconstraint_filesrE   Úfinderr   rC   r   Úsessionr   úlist[InstallRequirement]c                 C  sD   g }| D ]}t |d|||d�D ]}t||jdd�}| |¡ qq|S )NT)Ú
constraintrN   rC   rO   F©ÚisolatedÚuser_supplied)r#   r   Úisolated_modeÚappend)rM   rN   rC   rO   ÚrequirementsÚfilenameÚ
parsed_reqÚ
req_to_addr3   r3   r4   Úparse_constraint_filesu   s"   
ûýôr[   c                      sˆ   e Zd Zd;‡ fdd„Zed<dd„ƒZedddœd=d d!„ƒZe		"	#	"	"	$	d>d?d/d0„ƒZd@d3d4„Z	edAd5d6„ƒZ
		"dBdCd9d:„Z‡  ZS )Dr7   rD   r   Úkwr,   r<   c                   s6   t ƒ j|i |¤Ž | j t ¡ ¡ | j t ¡ ¡ d S rG   )ÚsuperÚ__init__Úcmd_optsÚ
add_optionr   Údependency_groupsrI   )rB   rD   r\   ©Ú	__class__r3   r4   r^   �   s   zRequirementCommand.__init__rC   r   Ústrc                 C  s   d| j v rdS dS )zEDetermines which resolver should be used, based on the given options.zlegacy-resolverÚlegacyÚ
resolvelib)Údeprecated_features_enabled©rC   r3   r3   r4   Údetermine_resolver_variant•   s   
z-RequirementCommand.determine_resolver_variantNr   )Údownload_dirÚ	verbosityÚtemp_build_dirr)   Úbuild_trackerr   rO   r   rN   r   Úallow_editablesr-   Úuse_user_siterj   ú
str | Nonerk   rF   r   c                C  sN  |j }
|
dus	J ‚d}|  |¡}|dkr!d|jv }|r t d¡ nd}d}d|jv r/t d¡ t|dg ƒ}d	|jv rNt||||ƒ}t||||	t|j	ƒd
�}nt
||d�}|jsZd}nd|jv rld}d	|jv rkt d¡ nd}td!i d|
“d|j“d|“d|“d|“d|j“d|“d|“d|j“d|“d|j“d|“d|“d|	“d|“d |“ŽS )"zQ
        Create a RequirementPreparer instance for the given parameters.
        NFrf   z	fast-depszÊpip is using lazily downloaded wheels using HTTP range requests to obtain dependency information. This experimental feature is enabled through --use-feature=fast-deps and it is not ready for production.Tz;fast-deps has no effect when used with the legacy resolver.Úbuild_constraintszinprocess-build-deps)rN   rm   rq   rk   Úwheel_cache)rq   Úoffzvenv-isolationÚvenvz£Using --use-feature 'inprocess-build-deps' and 'venv-isolation' together is currently partially supported. If you encounter broken behaviour, use only one feature.ÚvirtualÚ	build_dirÚsrc_dirrj   Úbuild_isolationÚbuild_isolation_installerÚcheck_build_depsrm   rO   Úprogress_barrN   Úrequire_hashesro   Ú
lazy_wheelrk   Úlegacy_resolverrn   r3   )Úpathri   Úfeatures_enabledÚloggerÚwarningÚgetattrr[   r
   r   Ú	cache_dirr   rx   r   rw   rz   r{   r|   )Úclsrl   rC   rm   rO   rN   rn   ro   rj   rk   Útemp_build_dir_pathr~   Úresolver_variantr}   rq   Úbuild_constraint_reqsÚenv_installerrx   r3   r3   r4   Úmake_requirement_preparer�   s˜   

ÿ€
ÿ
ÿûþ

ÿ€ÿþýüûúùø	÷
öõôóòñðz,RequirementCommand.make_requirement_preparerFTúto-satisfy-onlyÚpreparerrr   úWheelCache | NoneÚignore_installedÚignore_requires_pythonÚforce_reinstallÚupgrade_strategyÚpy_version_infoútuple[int, ...] | Noner%   c                 C  sŒ   t t|jd�}|  |¡}|dkr+ddl}|jjjjj	||||||j
|j||||	|
d�S ddl}|jjjjj	||||||j
|j||||	|
d�S )zF
        Create a Resolver instance for the given parameters.
        )rS   rf   r   N)rŒ   rN   rr   Úmake_install_reqro   Úignore_dependenciesÚonly_dependenciesrŽ   r�   r�   r‘   r’   )r   r   rU   ri   Ú,pip._internal.resolution.resolvelib.resolverÚ	_internalÚ
resolutionrf   ÚresolverÚResolverr•   r–   Ú(pip._internal.resolution.legacy.resolverre   )r…   rŒ   rN   rC   rr   ro   rŽ   r�   r�   r‘   r’   r”   r‡   Úpipr3   r3   r4   Úmake_resolverú   sH   þ
ôôz RequirementCommand.make_resolverrE   rP   c              
   C  sü  g }t ƒ rt|dg ƒ}n|j}t||||ƒ}| |¡ |D ]}| ¡ s$qt|d|jdt|ddƒd�}	| |	¡ q|j	rPt
|j	ƒD ]}t||jdd�}	| |	¡ q@|jD ]}t|d|jt|ddƒd�}	| |	¡ qS|jD ]Q}
t|
ƒršt d¡ t|
|d	�D ]\}}t|||
dd
�\}	}| |	¡ |r˜| |j|¡ q|qkt|
|||d�D ]}t||jd|jr²|j d¡ndd�}	| |	¡ q¢qk|j�r't|jƒdkrÌtdƒ‚|jd }zt|ƒ}W n tyè } zt|jƒ‚d}~ww | dd¡}|�r|j �st!|ƒ}t"||j#d��st$d|›d|j%› d|›�ƒ‚| dg ¡D ]}t||jdd�}	| |	¡ �q|j&�r3|j'�r3tdƒ‚|j'�sDt(dd„ |D ƒƒ�rDd|_&|�s||j�s||j�s||j	�s||j�s|d| ji}|j)�rrtdj*di t+|d ,|j)¡d�¤Žƒ‚tdj*di |¤Žƒ‚|S ) zS
        Parse command-line arguments into the corresponding requirements.
        rq   NTÚconfig_settings)Ú
comes_fromrS   rT   rŸ   rR   )rT   rS   rŸ   z‹Using pylock.toml as a requirements source is an experimental feature. It may be removed/changed in a future release without prior warning.)rO   )rT   )rN   rC   rO   )rS   rT   rŸ   é   z1--requirements-from-script can only be given oncer   zrequires-pythonÚ )Úrequires_pythonÚversion_infozScript z requires a different Python: z not in Údependenciesz?--require-hashes and --no-require-hashes are mutually exclusivec                 s  s   � | ]}|j V  qd S rG   )Úhas_hash_options)Ú.0Úreqr3   r3   r4   Ú	<genexpr>¶  s   € 
ÿz6RequirementCommand.get_requirements.<locals>.<genexpr>ÚnamezXYou must give at least one requirement to {name} (maybe you meant "pip {name} {links}"?)ú )ÚlinkszHYou must give at least one requirement to {name} (see "pip help {name}")r3   )-r5   rƒ   Úconstraintsr[   ÚextendÚstripr   rU   rV   ra   r"   r   Ú	editablesr   rW   r'   r�   r‚   r(   r   Úadd_locked_linkrª   r#   r   rC   r2   Úrequirements_from_scriptsÚlenr   r!   r    Úmsgr�   r   r&   r’   r   Ú
py_versionr|   Úno_require_hashesÚanyÚ
find_linksÚformatÚdictÚjoin)rB   rD   rC   rN   rO   rW   rM   r­   r¨   rZ   rX   ÚpackageÚpackage_distÚlocked_linkrY   ÚscriptÚscript_metadataÚexcÚscript_requires_pythonÚtarget_pythonÚoptsr3   r3   r4   Úget_requirements5  s  


ûý

ü
ÿÿ
ü
€
ÿÿù
ó

€ÿþÿÿÿýÿ
ÿÿþýüû
ÿþÿÿÿÿz#RequirementCommand.get_requirementsc                 C  s$   | j }| ¡ }|rt |¡ dS dS )zE
        Trace basic information about the provided objects.
        N)Úsearch_scopeÚget_formatted_locationsr�   Úinfo)rN   rÆ   Ú	locationsr3   r3   r4   Útrace_basic_infoÒ  s
   ÿz#RequirementCommand.trace_basic_inforÃ   úTargetPython | Nonec                 C  s:   t j||d�}td|j|j|j|d�}tj||||jd�S )zÛ
        Create a package finder appropriate to this requirement command.

        :param ignore_requires_python: Whether to ignore incompatible
            "Requires-Python" values in links. Defaults to False.
        rh   T)Úallow_yankedÚformat_controlÚrelease_controlÚprefer_binaryr�   )Úlink_collectorÚselection_prefsrÃ   Úuploaded_prior_to)r   Úcreater   rÍ   rÎ   rÏ   r   rÒ   )rB   rC   rO   rÃ   r�   rÐ   rÑ   r3   r3   r4   Ú_build_package_finderÝ  s   ûüz(RequirementCommand._build_package_finder)rD   r   r\   r   r,   r<   )rC   r   r,   rd   )rl   r)   rC   r   rm   r   rO   r   rN   r   rn   r-   ro   r-   rj   rp   rk   rF   r,   r   )NFTFFr‹   N)rŒ   r   rN   r   rC   r   rr   r�   ro   r-   rŽ   r-   r�   r-   r�   r-   r‘   rd   r’   r“   r,   r%   )
rD   rE   rC   r   rN   r   rO   r   r,   rP   )rN   r   r,   r<   r=   )
rC   r   rO   r   rÃ   rË   r�   r-   r,   r   )Ú__name__Ú
__module__Ú__qualname__r^   Ústaticmethodri   ÚclassmethodrŠ   rž   rÅ   rÊ   rÔ   Ú__classcell__r3   r3   rb   r4   r7   Ž   s0    õ\õ
: û)r,   r-   )r9   r:   r,   r:   )
rM   rE   rN   r   rC   r   rO   r   r,   rP   )TÚ__doc__Ú
__future__r   Úloggingr0   Úcollections.abcr   Ú	functoolsr   Úoptparser   Útypingr   r   Úpip._internal.build_envr   r	   r
   r   Úpip._internal.cacher   Úpip._internal.clir   Úpip._internal.cli.cmdoptionsr   Úpip._internal.cli.index_commandr   r   Úpip._internal.exceptionsr   r   r   Úpip._internal.index.collectorr   Ú"pip._internal.index.package_finderr   Ú$pip._internal.models.selection_prefsr   Ú"pip._internal.models.target_pythonr   Úpip._internal.network.sessionr   Ú,pip._internal.operations.build.build_trackerr   Ú pip._internal.operations.preparer   Úpip._internal.req.constructorsr   r   r   r   r   Úpip._internal.req.pep723r    r!   Ú&pip._internal.req.req_dependency_groupr"   Úpip._internal.req.req_filer#   Úpip._internal.req.req_installr$   Úpip._internal.resolution.baser%   Úpip._internal.utils.packagingr&   Úpip._internal.utils.pylockr'   r(   Úpip._internal.utils.temp_dirr)   r*   r+   Ú	getLoggerrÕ   r�   r5   Ú	BUILD_ENVÚEPHEM_WHEEL_CACHEÚ	REQ_BUILDr>   r6   rL   r[   r7   r3   r3   r3   r4   Ú<module>   sR    

ý

