o
    hi7                     @  s  U 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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mZmZ g dZeeZe eddZ!de"d< ej#dkZ$dHddZ%e% Z&e&s}ddlm'Z' e$re&sej(Z)nej*Z)dHddZ+dIddZ,ej-dHddZ.ej-dHddZ/ej-dHd d!Z0ej-dHd"d#Z1ej-dHd$d%Z2ej-dJd+d,Z3dKd-d.Z4ej-d/dddd0dLd6d7Z5	/			/	dMdNd;d<Z6dOd=d>Z7dOd?d@Z8dPdBdCZ9dOdDdEZ:dOdFdGZ;dS )Q    )annotationsN)Any)SCHEME_KEYSScheme)WINDOWS)
deprecated)running_under_virtualenv   )
_sysconfig)USER_CACHE_DIRget_major_minor_versionget_src_prefixis_osx_frameworksite_packages	user_site)
r   get_bin_prefixget_bin_userr   get_platlibget_purelib
get_schemer   r   r   
platlibdirlibstr_PLATLIBDIR)   
   returnboolc                   C  s   t ttdtS )ax  This function determines the value of _USE_SYSCONFIG.

    By default, pip uses sysconfig on Python 3.10+.
    But Python distributors can override this decision by setting:
        sysconfig._PIP_USE_SYSCONFIG = True / False
    Rationale in https://github.com/pypa/pip/issues/10647

    This is a function for testability, but should be constant during any one
    run.
    _PIP_USE_SYSCONFIG)r   getattr	sysconfig_USE_SYSCONFIG_DEFAULT r"   r"   S/var/www/html/venv/lib/python3.10/site-packages/pip/_internal/locations/__init__.py_should_use_sysconfig0   s   r$   
_distutilsc                  C  s8   ddl m}  z| d d }W |dkS  ty   Y dS w )zsThe resolution to bpo-44860 will change this incorrect platlib.

    See <https://bugs.python.org/issue44860>.
    r   INSTALL_SCHEMES	unix_userplatlibFz	$usersite)distutils.command.installr(   KeyError)r(   unix_user_platlibr"   r"   r#   _looks_like_bpo_44860N   s   r.   schemedict[str, str]c                 C  sP   | d }d|v r| ddt d}d|vrdS | dd}| dd| d	 kS )
Nr*   z/$platlibdir///lib64/Fz/lib/z
$platbase/z$base/purelib)replacer   )r/   r*   	unpatchedr"   r"   r#   +_looks_like_red_hat_patched_platlib_purelib\   s   r6   c                     s"   ddl m  t fdddD S )zRed Hat patches platlib in unix_prefix and unix_home, but not purelib.

    This is the only way I can see to tell a Red Hat-patched Python.
    r   r'   c                 3  s$    | ]}| v ot  | V  qd S N)r6   .0kr'   r"   r#   	<genexpr>n   s    

z*_looks_like_red_hat_lib.<locals>.<genexpr>)unix_prefix	unix_home)r+   r(   allr"   r"   r'   r#   _looks_like_red_hat_libf   s   r?   c                  C  s   ddl m}  d| v od| v S )z#Debian adds two additional schemes.r   r'   
deb_system
unix_local)r+   r(   r'   r"   r"   r#   _looks_like_debian_schemeu   s   rB   c                  C  s^   ddl m}  ddlm} | | }|  |jtjt	j dko.|j
tjt	j
 dkS )a\  Red Hat patches ``sys.prefix`` and ``sys.exec_prefix``.

    Red Hat's ``00251-change-user-install-location.patch`` changes the install
    command's ``prefix`` and ``exec_prefix`` to append ``"/local"``. This is
    (fortunately?) done quite unconditionally, so we create a default command
    object without any configuration to detect this.
    r   )install)Distributionz/local)r+   rC   distutils.distrD   finalize_optionsexec_prefixospathnormpathsysprefix)rC   rD   cmdr"   r"   r#   _looks_like_red_hat_scheme}   s   	
rN   c                  C  sH   t du rdS z	tjddd} W n
 ty   Y dS w d| d v o#dt vS )zSlackware patches sysconfig but fails to patch distutils and site.

    Slackware changes sysconfig's user scheme to use ``"lib64"`` for the lib
    path, but does not do the same to the site module.
    NF
posix_user)r/   expandr2   r3   )r   r    	get_pathsr,   pathsr"   r"   r#   _looks_like_slackware_scheme   s   rT   c                     s.   t jddd tdd  fdddD D S )a  MSYS2 patches distutils and sysconfig to use a UNIX-like scheme.

    However, MSYS2 incorrectly patches sysconfig ``nt`` scheme. The fix is
    likely going to be included in their 3.10 release, so we ignore the warning.
    See msys2/MINGW-packages#9319.

    MSYS2 MINGW's patch uses lowercase ``"lib"`` instead of the usual uppercase,
    and is missing the final ``"site-packages"``.
    ntF)rP   c                 s  s,    | ]}d |vod|v o| d V  qdS )Libr   zsite-packagesN)endswith)r9   pr"   r"   r#   r;      s
    
z1_looks_like_msys2_mingw_scheme.<locals>.<genexpr>c                 3  s    | ]} | V  qd S r7   r"   )r9   keyrR   r"   r#   r;      s    r*   r3   )r    rQ   r>   r"   r"   rR   r#   _looks_like_msys2_mingw_scheme   s   r[   oldpathlib.PathnewrY   Nonec                C  s    d}d}t t|||| | d S )Nz(https://github.com/pypa/pip/issues/10151zSValue for %s does not match. Please report this to <%s>
distutils: %s
sysconfig: %s)loggerlog_MISMATCH_LEVEL)r\   r^   rY   	issue_urlmessager"   r"   r#   _warn_mismatched   s   re   c                C  s   | |krdS t | ||d dS )NFrY   T)re   )r\   r^   rY   r"   r"   r#   _warn_if_mismatch   s   rg   FuserhomerootrL   ri   rj   
str | Nonerk   rL   c                 C  s&   g d}t td|| ||| d S )N)zAdditional context:z	user = %rz	home = %rz	root = %rzprefix = %r
)r`   ra   rb   join)ri   rj   rk   rL   partsr"   r"   r#   _log_context   s   rp   	dist_nameisolatedr   c              	     sz  t j| |||||d}tr|S tj| |||||dg }tD ]}tt|}	tt||}
|	|
kr5qtj	j
dkoT|d uoT|dv oT|	j|
jkoT|	j
doT|
j
d}|rXq|ont on|dkon|	jj|
jkon|	jj
d}|rrq|dkrzt rzq|o|dkot otdkot }|rq|o|dv ot ot }|rq|p|p|pt  o|	jdd	 d
kot|
jdko|
jd dkot|
jd	k p|
jd dkot pt }|rqto|dv ot }|rqtjddot o|dv }|rq||	|
d| f q|sS tj| |||||dd t fddtD r#tdd d d S |D ]\}	}
}t|	|
|d q%t ||||d S )N)ri   rj   rk   rr   rL   pypyrZ   pythonheadersr*   r   r	   r   )usrlocalrv      rw   T)
check_home)ru   includeplatincludezscheme.)ignore_config_filesc                 3  s"    | ]} | t |kV  qd S r7   )r   r8   default_oldr\   r"   r#   r;   i  s     zget_scheme.<locals>.<genexpr>zConfiguring installation scheme with distutils config files is deprecated and will no longer work in the near future. If you are using a Homebrew or Linuxbrew Python, please see discussion at https://github.com/Homebrew/homebrew-core/issues/76621)reasonreplacementgone_inrf   rh   )!r
   r   _USE_SYSCONFIGr&   r   pathlibPathr   rK   implementationnameparent
startswithr   r?   r   r   r.   rT   r   ro   lenrN   rB   r[   r    is_python_buildappenddistutils_schemeanyr   re   rp   )rq   ri   rj   rk   rr   rL   r^   warning_contextsr:   old_vnew_vskip_pypy_special_case$skip_osx_framework_user_special_caseskip_bpo_44860skip_slackware_user_schemeskip_linux_system_special_caseskip_msys2_mingw_bugskip_cpython_buildrY   r"   r}   r#   r      s   	



	
r   c                  C  s<   t  } tr| S t }tt|t| ddrt  |S )N
bin_prefixrf   )r
   r   r   r&   rg   r   r   rp   r^   r\   r"   r"   r#   r   ~  s   r   c                   C  s   t jdddjS )N T)ri   )r
   r   scriptsr"   r"   r"   r#   r     s   r   valuec                 C  s   t  sdS | dkrdS dS )a  Check if the value is Debian's APT-controlled dist-packages.

    Debian's ``distutils.sysconfig.get_python_lib()`` implementation returns the
    default package path controlled by APT, but does not patch ``sysconfig`` to
    do the same. This is similar to the bug worked around in ``get_scheme()``,
    but here the default is ``deb_system`` instead of ``unix_local``. Ultimately
    we can't do anything about this Debian bug, and this detection allows us to
    skip the warning when needed.
    Fz/usr/lib/python3/dist-packagesT)rB   )r   r"   r"   r#   $_looks_like_deb_system_dist_packages  s
   
r   c                  C  sH   t  } tr| S t }t|r|S tt|t| ddr"t  |S )z,Return the default pure-Python lib location.r3   rf   )	r
   r   r   r&   r   rg   r   r   rp   r   r"   r"   r#   r     s   r   c                  C  sT   t  } tr| S ddlm} | }t|r|S tt|t| ddr(t	  |S )z0Return the default platform-shared lib location.r	   r%   r*   rf   )
r
   r   r   r   r&   r   rg   r   r   rp   )r^   r&   r\   r"   r"   r#   r     s   r   )r   r   )r/   r0   r   r   )r\   r]   r^   r]   rY   r   r   r_   )r\   r]   r^   r]   rY   r   r   r   )
ri   r   rj   rl   rk   rl   rL   rl   r   r_   )FNNFN)rq   r   ri   r   rj   rl   rk   rl   rr   r   rL   rl   r   r   )r   r   )r   r   r   r   )<
__future__r   	functoolsloggingrH   r   rK   r    typingr   pip._internal.models.schemer   r   pip._internal.utils.compatr   pip._internal.utils.deprecationr   pip._internal.utils.virtualenvr   r   r
   baser   r   r   r   r   r   __all__	getLogger__name__r`   r   r   __annotations__version_infor!   r$   r   r&   WARNINGrb   DEBUGr.   r6   cacher?   rB   rN   rT   r[   re   rg   rp   r   r   r   r   r   r   r"   r"   r"   r#   <module>   st     	







 
'


