o
    cF                     @   s  d 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	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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(m)Z)m*Z*m+Z+ ddl,m-Z- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5m6Z6m7Z7 ddl8m9Z9 e	rddl:m;Z; e<e=Z>ded fddZ?G dd deZ@G d d! d!ee@ZAe7jBe7jCe7jDgZEd)d"d#ZFd$e
de
fd%d&ZGG d'd( d(eAZHdS )*a  Contains the Command base classes that depend on PipSession.

The classes in this module are in a separate module so the commands not
needing download / PackageFinder capability don't unnecessarily import the
PackageFinder machinery and all its vendored dependencies, etc.
    N)partial)Values)TYPE_CHECKINGAnyListOptionalTuple)
WheelCache)
cmdoptions)Command)CommandContextMixIn)CommandErrorPreviousBuildDirError)LinkCollector)PackageFinder)SelectionPreferences)TargetPython)
PipSession)BuildTracker)RequirementPreparer)install_req_from_editableinstall_req_from_line#install_req_from_parsed_requirementinstall_req_from_req_string)parse_requirements)InstallRequirement)BaseResolver)pip_self_version_check)TempDirectoryTempDirectoryTypeRegistrytempdir_kinds)running_under_virtualenv)
SSLContextreturnr"   c                  C   sn   t jdk r	tdzdd l} W n ty   td Y d S w zdd l}W n ty0   tdw || j	S )N)   
   z9The truststore feature is only available for Python 3.10+r   z1Disabling truststore since ssl support is missingz]To use the truststore feature, 'truststore' must be installed into pip's current environment.)
sysversion_infor   sslImportErrorloggerwarning
truststorer"   PROTOCOL_TLS_CLIENT)r(   r,    r.   J/opt/certbot/lib/python3.10/site-packages/pip/_internal/cli/req_command.py_create_truststore_ssl_context2   s    

r0   c                       s   e Zd ZdZd fddZededeee	  fddZ
dedefd	d
Z			ddedee dee dedef
ddZ  ZS )SessionCommandMixinzE
    A class mixin for command classes needing _build_session().
    r#   Nc                    s   t    d | _d S N)super__init___session)self	__class__r.   r/   r4   M   s   

zSessionCommandMixin.__init__optionsc                 C   sL   g }t |ddst |dd}|r|| t |dd}|r"|| |p%dS )z7Return a list of index urls from user-provided options.no_indexF	index_urlNextra_index_urls)getattrappendextend)clsr9   
index_urlsurlurlsr.   r.   r/   _get_index_urlsQ   s   

z#SessionCommandMixin._get_index_urlsc                 C   s0   | j du r| | || _ | j dusJ | j S )zGet a default-managed session.N)r5   enter_context_build_session)r6   r9   r.   r.   r/   get_default_session_   s   
z'SessionCommandMixin.get_default_sessionFretriestimeoutfallback_to_certific                 C   s   |j }|rtj|sJ d|jv r&zt }W n ty%   |s! d }Y nw d }t|r2tj|dnd |d ur9|n|j	|j
| ||d}|jrL|j|_|jrS|j|_|jsX|rb|d ur^|n|j|_|jrm|j|jd|_|j |j_|S )Nr,   http)cacherH   trusted_hostsrA   ssl_context)rK   https)	cache_dirospathisabsfeatures_enabledr0   	Exceptionr   joinrH   rM   rD   certverifyclient_certrI   proxyproxiesno_inputauth	prompting)r6   r9   rH   rI   rJ   rP   rN   sessionr.   r.   r/   rF   i   s<   

	
z"SessionCommandMixin._build_sessionr#   N)NNF)__name__
__module____qualname____doc__r4   classmethodr   r   r   strrD   r   rG   intboolrF   __classcell__r.   r.   r7   r/   r1   G   s(    r1   c                   @   s"   e Zd ZdZdeddfddZdS )IndexGroupCommandz
    Abstract base class for commands with the index_group options.

    This also corresponds to the commands that permit the pip version check.
    r9   r#   Nc                 C   sl   t |dsJ |js|jrdS | j|dtd|jdd}| t|| W d   dS 1 s/w   Y  dS )z
        Do the pip version check if not disabled.

        This overrides the default behavior of not doing the check.
        r:   Nr      T)rH   rI   rJ   )hasattrdisable_pip_version_checkr:   rF   minrI   r   )r6   r9   r_   r.   r.   r/   handle_pip_version_check   s   

"z*IndexGroupCommand.handle_pip_version_check)ra   rb   rc   rd   r   ro   r.   r.   r.   r/   rj      s    rj   c                   C   sN   t  rdS ttdsdS tjdkstjdkrdS t dkr dS td dS )zOutput a warning for sudo users on Unix.

    In a virtual environment, sudo pip still writes to virtualenv.
    On Windows, users may run pip as Administrator without issues.
    This warning only applies to Unix root users outside of virtualenv.
    Ngetuidwin32cygwinr   zRunning pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv)r!   rl   rQ   r&   platformrp   r*   r+   r.   r.   r.   r/   warn_if_run_as_root   s   
rt   funcc              	      s>   dt ddfdd dtdtdtt dtt f fd	d
}|S )zNDecorator for common logic related to managing temporary
    directories.
    registryr#   Nc                 S   s   t D ]}| |d qd S )NF)KEEPABLE_TEMPDIR_TYPES
set_delete)rv   tr.   r.   r/   configure_tempdir_registry   s   z0with_cleanup.<locals>.configure_tempdir_registryr6   r9   argsc                    sH   | j d usJ |jr | j  z| ||W S  ty#    | j   w r2   )tempdir_registryno_cleanr   )r6   r9   r{   rz   ru   r.   r/   wrapper   s   

zwith_cleanup.<locals>.wrapper)r   RequirementCommandr   r   r   r   rg   )ru   r   r.   r~   r/   with_cleanup   s   r   c                       sH  e Zd Zdededdf fddZededefdd	Ze			
d)de
dedededededee dedefddZe									d*dedededee dedededededee deeedf  defd d!Zdee dedededee f
d"d#Zededdfd$d%Z		d+deded&ee dee def
d'd(Z  ZS ),r   r{   kwr#   Nc                    s&   t  j|i | | jt  d S r2   )r3   r4   cmd_opts
add_optionr
   r}   )r6   r{   r   r7   r.   r/   r4     s   zRequirementCommand.__init__r9   c                 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2020-resolver)deprecated_features_enabledr9   r.   r.   r/   determine_resolver_variant  s   
z-RequirementCommand.determine_resolver_variantr   temp_build_dirbuild_trackerr_   finderuse_user_sitedownload_dir	verbosityc	                 C   s   |j }	|	dus	J | |}
|
dkrd|jv }|rtd nd}d|jv r+td t|	|j||j|j|||j	||j
|||dS )zQ
        Create a RequirementPreparer instance for the given parameters.
        Nr   z	fast-depszpip 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.Fz;fast-deps has no effect when used with the legacy resolver.)	build_dirsrc_dirr   build_isolationcheck_build_depsr   r_   progress_barr   require_hashesr   
lazy_wheelr   )rR   r   rT   r*   r+   r   r   r   r   r   r   )r@   r   r9   r   r_   r   r   r   r   temp_build_dir_pathresolver_variantr   r.   r.   r/   make_requirement_preparer  s<   


z,RequirementCommand.make_requirement_preparerFTto-satisfy-onlypreparerwheel_cacheignore_installedignore_requires_pythonforce_reinstallupgrade_strategy
use_pep517py_version_info.c                 C   s   t t|j|
t|ddd}| |}|dkr/ddl}|jjjj	j
||||||j||||	|dS ddl}|jjjj	j
||||||j||||	|dS )zF
        Create a Resolver instance for the given parameters.
        config_settingsN)isolatedr   r   r   r   )r   r   r   make_install_reqr   ignore_dependenciesr   r   r   r   r   )r   r   isolated_moder=   r   ,pip._internal.resolution.resolvelib.resolver	_internal
resolution
resolvelibresolverResolverr   (pip._internal.resolution.legacy.resolverr   )r@   r   r   r9   r   r   r   r   r   r   r   r   r   r   pipr.   r.   r/   make_resolverD  sH   

z RequirementCommand.make_resolverc                 C   s^  g }|j D ]}t|d|||dD ]}t||jdd}|| qq|D ]}	t|	d|j|jdt|ddd}|| q#|jD ]}	t	|	d|j|jt|ddd}|| q>|j
D ]}t||||d	D ]}t||j|jdd
}|| qbqXtdd |D rd|_|s|js|j
sd| ji}
|jrtdjdi t|
d|jdtdjdi |
|S )zS
        Parse command-line arguments into the corresponding requirements.
        T)
constraintr   r9   r_   F)r   user_suppliedNr   )r   r   r   r   )r   r   r   r   )r   r9   r_   )r   r   r   c                 s   s    | ]}|j V  qd S r2   )has_hash_options).0reqr.   r.   r/   	<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}")r.   )constraintsr   r   r   r>   r   r   r=   	editablesr   requirementsanyr   r   
find_linksr   formatdictrV   )r6   r{   r9   r   r_   r   filename
parsed_req
req_to_addr   optsr.   r.   r/   get_requirements  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)r   r   	locationsr.   r.   r/   trace_basic_info  s
   z#RequirementCommand.trace_basic_infotarget_pythonc                 C   s6   t j||d}td|j|j|j|d}t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.
        r   T)allow_yankedformat_controlallow_all_prereleasesprefer_binaryr   )link_collectorselection_prefsr   )r   creater   r   prer   r   )r6   r9   r_   r   r   r   r   r.   r.   r/   _build_package_finder  s   z(RequirementCommand._build_package_finder)Nr   )NFTFFr   NN)NN)ra   rb   rc   r   r4   staticmethodr   rf   r   re   r   r   r   r   rh   r   rg   r   r   r	   r   r   r   r   r   r   r   r   r   ri   r.   r.   r7   r/   r     s    		
3	
;
Qr   r`   )Ird   loggingrQ   r&   	functoolsr   optparser   typingr   r   r   r   r   pip._internal.cacher	   pip._internal.clir
   pip._internal.cli.base_commandr   !pip._internal.cli.command_contextr   pip._internal.exceptionsr   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   pip._internal.req.req_filer   pip._internal.req.req_installr   pip._internal.resolution.baser   !pip._internal.self_outdated_checkr   pip._internal.utils.temp_dirr   r   r    pip._internal.utils.virtualenvr!   r(   r"   	getLoggerra   r*   r0   r1   rj   	BUILD_ENVEPHEM_WHEEL_CACHE	REQ_BUILDrw   rt   r   r   r.   r.   r.   r/   <module>   sN    
W$
