o
    c~                     @   s  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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mZmZ d d
l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* d dl+m,Z,m-Z- d dl.m/Z/ d dl0m1Z1m2Z2m3Z3 d dl4m5Z5 d dl6m7Z7m8Z8 d dl9m:Z: d dl;m<Z< d dl=m>Z> d dl?m@Z@mAZAmBZBmCZCmDZD d dlEmFZF d dlGmHZHmIZI d dlJmKZKmLZLmMZM e>eNZOde&deKfdd ZPG d!d" d"eZQ	#			#	d=d$eRd%eeS d&eeS d'eRd(eeS deeS fd)d*ZTd&eeS d'eRdeRfd+d,ZU				#d>d-eeR d.eeS d/eeS d0eeS d1eRdeRfd2d3ZVd4ee1 d5eeeS  ddfd6d7ZWd8eXd9eRd:eRdeSfd;d<ZYdS )?    N)SUPPRESS_HELPValues)IterableListOptional)canonicalize_name)
print_json)
WheelCache)
cmdoptions)make_target_python)RequirementCommandwarn_if_run_as_rootwith_cleanup)ERRORSUCCESS)CommandErrorInstallationError)
get_scheme)get_environment)FormatControl)InstallationReport)get_build_tracker)ConflictDetailscheck_install_conflicts)install_given_reqs)InstallRequirementLegacySetupPyOptionsCheckModecheck_legacy_setup_py_options)WINDOWS)#LegacyInstallReasonFailedBdistWheel
deprecated)parse_distutils_argstest_writable_dir)	getLogger)check_externally_managed
ensure_dirget_pip_version(protect_pip_from_modification_on_windowswrite_output)TempDirectory)running_under_virtualenvvirtualenv_no_global)BdistWheelAllowedPredicatebuild should_build_for_install_commandformat_controlreturnc                    s   dt dtf fdd}|S )Nreqr1   c                    s    t | jpd} |}d|v S )N binary)r   nameget_allowed_formats)r2   canonical_nameallowed_formatsr0    K/opt/certbot/lib/python3.10/site-packages/pip/_internal/commands/install.pycheck_binary_allowedC   s   
z;get_check_bdist_wheel_allowed.<locals>.check_binary_allowed)r   bool)r0   r<   r:   r9   r;   get_check_bdist_wheel_allowed@   s   r>   c                   @   s   e Zd ZdZdZdddZededee	 de
fd	d
Zde	dededdfddZdee dee fddZdede	ddfddZdS )InstallCommandaI  
    Install packages from:

    - PyPI (and other indexes) using requirement specifiers.
    - VCS project urls.
    - Local project directories.
    - Local or remote source archives.

    pip also supports installing from "requirements files", which provide
    an easy way to specify a whole environment to be installed.
    a%  
      %prog [options] <requirement specifier> [package-index-options] ...
      %prog [options] -r <requirements file> [package-index-options] ...
      %prog [options] [-e] <vcs project url> ...
      %prog [options] [-e] <local project path> ...
      %prog [options] <archive url/path> ...r1   Nc                 C   s  | j t  | j t  | j t  | j t  | j t  | j jdddddd | j jddd	d
d dd t| j  | j jddddd | j jdddt	d | j jddd
d dd | j jddd
d dd | j t
  | j jdddddd | j jddddd gd!d" | j jd#d$dd%d | j jd&d'd(dd)d | j t  | j t  | j t  | j t  | j t  | j t  | j t  | j t  | j t  | j jd*dd+d,d-d | j jd.dd+d/d0 | j jd1dd2d,d3d | j jd4dd5d,d6d | j t  | j t  | j t  | j t  | j t  | j t  ttj| j}| jd7| | jd7| j  | j jd8d9d:d d;d d S )<Nz	--dry-run
store_truedry_runFzDon't actually install anything, just print what would be. Can be used in combination with --ignore-installed to 'resolve' the requirements.)actiondestdefaulthelpz-tz--target
target_dirdirzInstall packages into <dir>. By default this will not replace existing files/folders in <dir>. Use --upgrade to replace existing packages in <dir> with new versions.)rC   metavarrD   rE   z--useruse_user_sitezInstall to the Python user install directory for your platform. Typically ~/.local/, or %APPDATA%\Python on Windows. (See the Python documentation for site.USER_BASE for full details.))rC   rB   rE   z	--no-userstore_falsez--root	root_pathz=Install everything relative to this alternate root directory.z--prefixprefix_pathzIInstallation prefix where lib, bin and other top-level folders are placedz-Uz	--upgradeupgradezUpgrade all specified packages to the newest available version. The handling of dependencies depends on the upgrade-strategy used.z--upgrade-strategyupgrade_strategyzonly-if-neededeageraG  Determines how dependency upgrading should be handled [default: %default]. "eager" - dependencies are upgraded regardless of whether the currently installed version satisfies the requirements of the upgraded package(s). "only-if-needed" -  are upgraded only when they do not satisfy the requirements of the upgraded package(s).)rC   rD   choicesrE   z--force-reinstallforce_reinstallz;Reinstall all packages even if they are already up-to-date.z-Iz--ignore-installedignore_installedzIgnore the installed packages, overwriting them. This can break your system if the existing package is of a different version or was installed with a different package manager!z	--compilecompileTz'Compile Python source files to bytecodez--no-compilez.Do not compile Python source files to bytecode)rB   rC   rE   z--no-warn-script-locationwarn_script_locationz0Do not warn when installing scripts outside PATHz--no-warn-conflictswarn_about_conflictsz%Do not warn about broken dependenciesr   z--reportjson_report_filefileaW  Generate a JSON file describing what pip did to install the provided requirements. Can be used in combination with --dry-run and --ignore-installed to 'resolve' the requirements. When - is used as file name it writes to stdout. When writing to stdout, please combine with the --quiet option to avoid mixing pip logging output with JSON output.)cmd_opts
add_optionr
   requirementsconstraintsno_depspreeditableadd_target_python_optionsr   srcignore_requires_pythonno_build_isolation
use_pep517no_use_pep517check_build_depsoverride_externally_managedconfig_settingsinstall_optionsglobal_options	no_binaryonly_binaryprefer_binaryrequire_hashesprogress_barroot_user_actionmake_option_groupindex_groupparserinsert_option_group)self
index_optsr:   r:   r;   add_options_   s  
zInstallCommand.add_optionsoptionsargsc           -         sd  |j r|jd urtd|jo|j o!|jd u o!|jd u o!|jd u }|r*|js*t  d}|j	r2|j
}tj|dd |jp=g }tdt  t|j |j|j|j|jd|_ d }d }|jrd|_tj|j|_tj|jrxtj|jsxtdtdd	}|j}| | |jpg }| |}	t|}
| j||	|
|jd
}| t  }t|j! ddd}z| "||||	}t#||t$j% d|j&v rt'|j(}n|j)j*rt+dddddd t'|j(|j)}|D ]}d|_,qt-||j | j.||||	||j | j/d}| j0|||||j |j|j|j1||j2d
}| 3| |j4||j d}|jrUt5|j6}|jdkr1t7|8 d n$t9|jddd}t:j;|8 |ddd W d    n	1 sPw   Y  |jrvt<dd |j6D }|rst=d d!>d"d |D  t?W S z|@d#}W n tAy   d}Y nw |jBd u }tC|d$ tD|j)  fd%d&|jEF D }tG||dg |d'\}}d(d& |D }|rtHd)Id*>||D ]
}|j2stJ|_Kq|L|}d }|jM o|jN} | r| O|}|jP}!|js|jrd}!tQ||||j||j|!|j |jRd+	}"tS|j ||j|j|jd,}#tT|#}$|"jUtVWd-d. g }%|"D ]*}&|&jX}'z|$Y|'}(|(d ur<|' d|(jZ }'W n
 t[yG   Y nw |%\|' q$|d ur^| j]|| ^|d/ d!>|%})|)rkt=d0|) W n( t_y }* z| j/d1k}+t`|*|+|j },tja|,|+d2 tbW  Y d }*~*S d }*~*ww |jr|sJ | c|j||j	 |jdd3krte  t?S )4Nz'Can not combine '--user' and '--target'zto-satisfy-onlyT)check_targetzUsing %s)rL   rF   rK   isolated_modez=Target path exists but is not a directory, will not continue.target)kind)rw   sessiontarget_pythonra   install)deleter|   globally_managedzno-binary-enable-wheel-cachez--no-binary currently disables reading from the cache of locally built wheels. In the future --no-binary will not influence the wheel cache.z to use the --no-cache-dir optioni,  z23.1)reasonreplacementfeature_flagissuegone_in)temp_build_dirrw   build_trackerr}   finderrI   	verbosity)
preparerr   rw   wheel_cacherI   rR   ra   rQ   rN   rc   )check_supported_wheels-)datawzutf-8)encoding   F)indentensure_asciic                 s   s$    | ]}|j d  |j d fV  qdS )r5   versionN)metadata.0rr:   r:   r;   	<genexpr>  s
    
z%InstallCommand.run.<locals>.<genexpr>zWould install %s c                 s   s    | ]}d  |V  qdS )r   N)join)r   itemr:   r:   r;   r         pip)modifying_pipc                    s   g | ]	}t | r|qS r:   )r/   r   check_bdist_wheel_allowedr:   r;   
<listcomp>  s    z&InstallCommand.run.<locals>.<listcomp>)r   verifybuild_optionsri   c                 S   s   g | ]}|j r|jqS r:   )rc   r5   r   r:   r:   r;   r     s
    zYCould not build wheels for {}, which is required to install pyproject.toml-based projectsz, )roothomeprefixrT   rI   	pycompile)userr   r   r   isolatedr5   )key)resolver_variantzSuccessfully installed %s   )exc_infowarn)frI   rF   r   rA   rV   rK   rL   rf   r%   rM   rN   r
   check_dist_restrictionrh   loggerverboser'   decide_user_installrz   rR   ospathabspathexistsisdirr*   enter_contextri   get_default_sessionr   _build_package_finderra   r   no_cleanget_requirementsr   r   INSTALLfeatures_enabledr	   	cache_dirr0   rj   r    permit_editable_wheels'reject_location_related_install_optionsmake_requirement_preparerr   make_resolverrQ   rc   trace_basic_inforesolver   requirements_to_installr   to_dictopenjsondumpsortedr)   r   r   get_requirementKeyErrorsatisfied_byr(   r>   rZ   valuesr.   r   formatr   legacy_install_reasonget_installation_orderignore_dependenciesrU   _determine_conflictsrT   r   rS   get_lib_location_guessesr   sortoperator
attrgetterr5   get_distributionr   	Exceptionappend_warn_about_conflictsdetermine_resolver_variantOSErrorcreate_os_error_messageerrorr   _handle_target_dirro   r   )-rt   rw   rx   #installing_into_current_environmentrN   rh   target_temp_dirtarget_temp_dir_pathri   r}   r~   r   r   	directoryreqsr   r2   r   resolverrequirement_setreportfwould_install_itemspip_reqr   reqs_to_build_build_failurespep517_build_failure_namesr   
to_install	conflictsshould_warn_about_conflictsrT   	installedlib_locationsenvitemsresultr   installed_distinstalled_descr   show_tracebackmessager:   r   r;   run  s  





	
















zInstallCommand.runrF   r   rM   c                    sH  t | g }td|jd}|j}|j}|j}tj|r!|| tj|r0||kr0|| tj|r;|| |D ]d}	t	|	D ]\}
|	|kratj
||
 t fdd|d d D raqDtj
||
}tj|r|swtd| qDtj|rtd| qDtj|rt| nt| ttj
|	|
| qDq=d S )Nr3   )r   c                 3   s    | ]}|  V  qd S N)
startswith)r   sddirr:   r;   r   X  r   z4InstallCommand._handle_target_dir.<locals>.<genexpr>zKTarget directory %s already exists. Specify --upgrade to force replacement.zTarget directory %s already exists and is a link. pip will not automatically replace links, please remove if replacement is desired.)r&   r   r   purelibplatlibr   r   r   r   listdirr   anyr   warningislinkr   shutilrmtreeremovemove)rt   rF   r   rM   lib_dir_listschemepurelib_dirplatlib_dirdata_dirlib_dirr   target_item_dirr:   r  r;   r   =  sL   



z!InstallCommand._handle_target_dirr   c                 C   s*   zt |W S  ty   td Y d S w )NzwError while checking for conflicts. Please file an issue on pip's issue tracker: https://github.com/pypa/pip/issues/new)r   r   r   	exception)rt   r   r:   r:   r;   r   s  s   
z#InstallCommand._determine_conflictsconflict_detailsr   c              
   C   s   |\}\}}|s|sd S g }|dkr| d n|dksJ | d |D ]}|| d }|| D ]}	dj|||	d d}
| |
 q1q%|D ](}|| d }|| D ]\}}}d	j||||||dkrdd
ndd}
| |
 qRqFtd| d S )Nlegacyzpip's legacy dependency resolver does not consider dependency conflicts when selecting packages. This behaviour is the source of the following dependency conflicts.z2020-resolverzpip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.r   z@{name} {version} requires {requirement}, which is not installed.r   )r5   r   requirementzg{name} {version} requires {requirement}, but {you} have {dep_name} {dep_version} which is incompatible.youzyou'll)r5   r   r  dep_namedep_versionr  
)r   r   r   criticalr   )rt   r  r   package_setmissingconflictingpartsproject_namer   
dependencyr   r  r  r2   r:   r:   r;   r     sL   z$InstallCommand._warn_about_conflicts)r1   N)__name__
__module____qualname____doc__usagerv   r   r   r   strintr   r*   r=   r   r   r   r   r   r   r:   r:   r:   r;   r?   K   s<    
 >  "
6
r?   Fr   r   r   r   r   c                 C   s    t d| ||||d}|j|jgS )Nr3   )r   r   r   r   r   )r   r  r  )r   r   r   r   r   r  r:   r:   r;   r     s   r   c                 C   s   t dd tt| |dD S )Nc                 s   s    | ]}t |V  qd S r   r"   )r   dr:   r:   r;   r     s
    
z)site_packages_writable.<locals>.<genexpr>r   r   )allsetr   r.  r:   r:   r;   site_packages_writable  s   r1  rI   rL   rF   rK   rz   c                 C   s   | dur| st d dS | r#|rtdt rtdt d dS | du s)J |s-|r4t d dS tjs>t d	 dS t||d
rKt d dS t d dS )aZ  Determine whether to do a user install based on the input options.

    If use_user_site is False, no additional checks are done.
    If use_user_site is True, it is checked for compatibility with other
    options.
    If use_user_site is None, the default behaviour depends on the environment,
    which is provided by the other arguments.
    Nz$Non-user install by explicit requestFzVCan not combine '--user' and '--prefix' as they imply different installation locationszZCan not perform a '--user' install. User site-packages are not visible in this virtualenv.z User install by explicit requestTz3Non-user install due to --prefix or --target optionz4Non-user install because user site-packages disabledr.  z0Non-user install because site-packages writeablezMDefaulting to user installation because normal site-packages is not writeable)	r   debugr   r,   r   siteENABLE_USER_SITEr1  info)rI   rL   rF   rK   rz   r:   r:   r;   r     s8   




r   rZ   rw   c                 C   s   dt t dtt fdd}g }| D ]}|j}t|}|r)|d|| | q|r>t|}|r>|d||  |sBdS tdd		|)
zIf any location-changing --install-option arguments were passed for
    requirements or on the command-line, then show a deprecation warning.
    option_namesr1   c                 S   s   dd | D S )Nc                 S   s   g | ]}d  |ddqS )z--{}r   r   )r   replace)r   r5   r:   r:   r;   r     s    zSreject_location_related_install_options.<locals>.format_options.<locals>.<listcomp>r:   )r6  r:   r:   r;   format_options  s   z?reject_location_related_install_options.<locals>.format_optionsz{!r} from {}z{!r} from command lineNzLocation-changing options found in --install-option: {}. This is unsupported, use pip-level options like --user, --prefix, --root, and --target instead.z; )
r   r+  r   rh   r!   r   r   keysr   r   )rZ   rw   r8  	offendersr  rh   location_optionsr:   r:   r;   r     s0   r   r   r   using_user_sitec                 C   s   g }| d |s| d | t|  n| d |d  d7  < | jtjkrGd}d}t s=|s=||d| g n| | | d	 tr^| jtjkr^| j	r^t
| j	d
kr^| d d| d S )zrFormat an error message for an OSError

    It may occur anytime during the execution of the install command.
    z,Could not install packages due to an OSErrorz: .r  r  z"Consider using the `--user` optionzCheck the permissionsz or z.
i  zHINT: This error might have occurred since this system does not have Windows Long Path support enabled. You can find information on how to enable this at https://pip.pypa.io/warnings/enable-long-paths
r3   )r   r+  errnoEACCESr+   extendlowerr   ENOENTfilenamelenr   strip)r   r   r<  r#  user_option_partpermissions_partr:   r:   r;   r   3  s>   






r   )FNNFN)NNNF)Zr>  r   r   r   r  r3  optparser   r   typingr   r   r   pip._vendor.packaging.utilsr   pip._vendor.richr   pip._internal.cacher	   pip._internal.clir
   pip._internal.cli.cmdoptionsr   pip._internal.cli.req_commandr   r   r   pip._internal.cli.status_codesr   r   pip._internal.exceptionsr   r   pip._internal.locationsr   pip._internal.metadatar   #pip._internal.models.format_controlr   (pip._internal.models.installation_reportr   ,pip._internal.operations.build.build_trackerr   pip._internal.operations.checkr   r   pip._internal.reqr   pip._internal.req.req_installr   r   r   pip._internal.utils.compatr   pip._internal.utils.deprecationr   r    "pip._internal.utils.distutils_argsr!   pip._internal.utils.filesystemr#   pip._internal.utils.loggingr$   pip._internal.utils.miscr%   r&   r'   r(   r)   pip._internal.utils.temp_dirr*   pip._internal.utils.virtualenvr+   r,   pip._internal.wheel_builderr-   r.   r/   r&  r   r>   r?   r=   r+  r   r1  r   r   r   r   r:   r:   r:   r;   <module>   s    
    p
	
=

'