a
    [fC                  	   @   s  U 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m	Z	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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%e&e'd< ej(dkZ)e*dddZ+e+ Z,e)re,sej-Z.nej/Z.e*dddZ0ee&e&f e*dddZ1e j2dde*dddZ3e j2dde*dddZ4e j2dde*dddZ5e j2dde*dddZ6e j2dde*dd d!Z7ee& e	e& d"d#d$Z8e j2ddej9ej9e&dd%d&d'Z:ej9ej9e&e*d%d(d)Z;e j2ddd*dddd+e*ee& ee& ee& dd,d-d.Z<dFe&e*ee& ee& e*ee& ed/d0d1Z=e&dd2d3Z>e&dd4d5Z?e&e*d6d7d8Z@e&dd9d:ZAe&dd;d<ZBe&e&e
e& d=d>d?ZCe&e*d@dAdBZDe&e
e& dCdDdEZEdS )G    N)AnyDictIteratorListOptionalTuple)SCHEME_KEYSScheme)WINDOWS)
deprecated)running_under_virtualenv   )
_distutils
_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_prefixed_libsget_purelib
get_schemer   r   r   
platlibdirlib_PLATLIBDIR)   
   )returnc                   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)boolgetattr	sysconfig_USE_SYSCONFIG_DEFAULT r'   r'   rC:\Users\91910\OneDrive\Desktop\vts_admin_rebuild-master\vts\Lib\site-packages\pip/_internal/locations/__init__.py_should_use_sysconfig/   s    r)   c                  C   s:   ddl m}  z| d d }W n ty0   Y dS 0 |dkS )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_44860G   s    r1   )schemer!   c                 C   sP   | d }d|v r$| ddt d}d|vr0dS | dd}| dd| d	 kS )
Nr-   z/$platlibdir///lib64/Fz/lib/z
$platbase/z$base/purelib)replacer   )r2   r-   	unpatchedr'   r'   r(   +_looks_like_red_hat_patched_platlib_purelibU   s    r8   )maxsizec                      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)r8   .0kr*   r'   r(   	<genexpr>g   s   z*_looks_like_red_hat_lib.<locals>.<genexpr>)unix_prefix	unix_home)r.   r+   allr'   r'   r*   r(   _looks_like_red_hat_lib_   s    rB   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_schemen   s    rE   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.   rF   distutils.distrG   finalize_optionsexec_prefixospathnormpathsysprefix)rF   rG   cmdr'   r'   r(   _looks_like_red_hat_schemev   s    	
rQ   c                  C   sH   t du rdS ztjddd} W n ty2   Y dS 0 d| d v oFd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)r2   expandr4   r5   )r   r%   	get_pathsr/   pathsr'   r'   r(   _looks_like_slackware_scheme   s    rW   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)rS   c                 s   s*   | ]"}d |vo d|v o | d V  qdS )Libr   zsite-packagesN)endswithr<   pr'   r'   r(   r>      s   z1_looks_like_msys2_mingw_scheme.<locals>.<genexpr>c                 3   s   | ]} | V  qd S r:   r'   )r<   keyrU   r'   r(   r>          r-   r5   )r%   rT   rA   r'   r'   rU   r(   _looks_like_msys2_mingw_scheme   s    r`   )partsr!   c                 c   sh   t d}ttdd }|r(|r(||s6| E d H  d S | D ](}||r\|d dt|  }|V  q:d S )N	LDVERSIONabiflagsr   )r%   get_config_varr$   rN   rZ   len)ra   	ldversionrc   partr'   r'   r(   _fix_abiflags   s    


rh   )oldnewr]   r!   c                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)ri   rj   r]   	issue_urlmessager'   r'   r(   _warn_mismatched   s    rp   c                C   s   | |krdS t | ||d dS )NFr]   T)rp   )ri   rj   r]   r'   r'   r(   _warn_if_mismatch   s    rr   FuserhomerootrO   )rt   ru   rv   rO   r!   c                 C   s&   g d}t td|| ||| d S )N)zAdditional context:z	user = %rz	home = %rz	root = %rzprefix = %r
)rk   rl   rm   join)rt   ru   rv   rO   ra   r'   r'   r(   _log_context   s    ry   )	dist_namert   ru   rv   isolatedrO   r!   c              	      s  t j| |||||d}tr|S tj| |||||dg }tD ]4}tt|}	tt||}
|	|
krlq<tj	j
dko|d uo|dv o|	j|
jko|	j
do|
j
d}|rq<|ot o|dko|	jj|
jko|	jj
d}|rq<|dkrt rq<|o(|dko(t o(tjdko(tdko(t }|r2q<|oN|dv oNt oNt }|rXq<|pn|pn|pnt  o|	jd	d
 dkot|
jd	ko|
jd	 dkot|
jd
k s|
jd dkot pt }|rq<tjdk ot o|dv ott|	j|
jk}|rq<to,|dv o,t }|r6q<tjddoRt oR|dv }|r\q<||	|
d| f q<|s~S tj| |||||dd t  fddtD rt!dd d d S |D ]\}	}
}t"|	|
|d qt#||||d S )N)rt   ru   rv   r{   rO   pypyr_   pythonheadersr-   )r   	   r   r   r   )usrlocalr      r   )r      )r~   r-   r5   T)
check_home)r~   includeplatincludezscheme.)ignore_config_filesc                 3   s    | ]} | t |kV  qd S r:   )r$   r;   default_oldri   r'   r(   r>   ~  r^   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_inrq   rs   )$r   r   _USE_SYSCONFIGr   r   pathlibPathr$   rN   implementationnameparent
startswithr   rB   r
   version_infor   r1   rW   r   ra   re   rQ   rE   tuplerh   r`   r%   is_python_buildappenddistutils_schemeanyr   rp   ry   )rz   rt   ru   rv   r{   rO   rj   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_sysconfig_abiflag_bugskip_msys2_mingw_bugskip_cpython_buildr]   r'   r   r(   r      s    	



	
r   c                  C   s<   t  } tr| S t }tt|t| ddr8t  |S )N
bin_prefixrq   )r   r   r   r   rr   r   r   ry   rj   ri   r'   r'   r(   r     s    r   c                   C   s   t jdddjS )N T)rt   )r   r   scriptsr'   r'   r'   r(   r     s    r   )valuer!   c                 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)rE   )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rDt  |S )z,Return the default pure-Python lib location.r5   rq   )	r   r   r   r   r   rr   r   r   ry   r   r'   r'   r(   r     s    r   c                  C   sH   t  } tr| S t }t|r$|S tt|t| ddrDt  |S )z0Return the default platform-shared lib location.r-   rq   )	r   r   r   r   r   rr   r   r   ry   r   r'   r'   r(   r     s    r   )v1v2r!   c                 C   s   | |kr| gS | |gS )zDeduplicate values from a list.r'   )r   r   r'   r'   r(   _deduplicated  s    r   )rL   r!   c                 C   s(   t jdd dkrdS | dt  dkS )zAApple patches sysconfig to *always* look under */Library/Python*.N   darwinFz/Library/Python/z/site-packages)rN   platformr   )rL   r'   r'   r(   _looks_like_apple_library  s    r   )rO   r!   c                 C   s   t | \}}trt||S t| \}}t||}tdd |D rXtdddd |S tt	|t	|ddtt	|t	|ddg}t
|rt| d	 |S )
z*Return the lib locations under ``prefix``.c                 s   s   | ]}t |V  qd S r:   )r   r[   r'   r'   r(   r>     r^   z$get_prefixed_libs.<locals>.<genexpr>a&  Python distributed by Apple's Command Line Tools incorrectly patches sysconfig to always point to '/Library/Python'. This will cause build isolation to operate incorrectly on Python 3.10 or later. Please help report this to Apple so they can fix this. https://developer.apple.com/bug-reporting/Nr   zprefixed-purelibrq   zprefixed-platlib)rO   )r   r   r   r   r   rA   r   rr   r   r   r   ry   )rO   new_purenew_platold_pureold_platold_lib_pathswarnedr'   r'   r(   r     s4    


r   )FNNFN)F	functoolsloggingrK   r   rN   r%   typingr   r   r   r   r   r   pip._internal.models.schemer   r	   pip._internal.utils.compatr
   pip._internal.utils.deprecationr   pip._internal.utils.virtualenvr   r   r   r   baser   r   r   r   r   r   __all__	getLogger__name__rk   r$   r   str__annotations__r   r&   r#   r)   r   WARNINGrm   DEBUGr1   r8   	lru_cacherB   rE   rQ   rW   r`   rh   r   rp   rr   ry   r   r   r   r   r   r   r   r   r   r'   r'   r'   r(   <module>   s   
  	










      3